基于ArcGIS的公路里程桩桩号推算方法实现

2019-08-06 12:59付开宇
昭通学院学报 2019年2期
关键词:起点里程投影

付开宇, 李 兵, 刘 云

(云南省地图院 地理国情分院,云南 昆明 650034)

根据交通部下发的交通运输部关于开展国家公路网命名编号调整工作的通知(交公路法[2018]27号),各省要统一和规范国家公路路线命名和编号。由于公路建设的发展,公路维护、改道等原因,使得部分公路的公路里程发生了改变,需要对公路的里程进行重新确认,同时对路上的一些交通标志设施(里程桩,里程牌等)的位置重新定位。过去在进行里程桩定位推算的时候,需要外业人员进行测量放样。以一个整桩号的里程桩作为起始点,再用测量工具根据推算距离量测到下一个桩的位置,这样施工需要花费大量的人力物力,效率和准确性都不是太高。公路里程桩是一种科学有效的公路定位手段,对驾驶员定位,交通事故救援,路面维护等具有非常重要的意义。本文旨在提出一种能高效准确地确定里程桩位置的方法。

一、线性参考系统

在传统的地理信息系统中,线性要素一般被抽象为一系列的有序点集合,通过这种方式可以快速定位线性要素上某个节点的位置。但是在实际生活当中,如公路、铁路、河流、地下管道等,我们往往是利用沿线距离来定位某个离散点的位置,这些沿线距离通常是用线性物体自身的测量值来表达。但线性物体是不规则的曲线,如果沿线的相对距离用各节点间的直线距离进行累加,不仅繁琐,而且还会出现累积误差。因此,如果能建立一套线性参考系统,就能将线性要素作为一个整体进行操作,线上点位置的描述就可以从平面的x,y值转换为沿线距离。

1 线性参考(Linear Reference)

线性参考(Linear Reference)是一种利用沿着可测量的线性要素的相对位置来存储地理位置的方法,即利用距离来确定沿线位置。在交通行业中对道路位置信息的记录并不是使用实际的地理坐标,而是利用道路里程。通过给道路建立线性参考系统,就能准确地推算出里程桩的位置。

在ArcGIS Desktop中,可以利用它提供的线性参考工具箱(Linear Reference)中的创建路径(Create Routes)工具给线性数据添加线性参考,添加完毕后的线性数据就变成了带有m值的路径。

2 路径

路径是一个线性特征,并有与其几何特征存储在一起的线性测量系统。在ArcGIS的GeodataBase数据模型中,把路径看成是折线要素类。路径要素类的几何值包含x,y和m值。x值和y值确定线性要素在坐标系中的位置;m值与路径的线性测量系统有关,在交通行业中一般用道路的长度(里程)来表示。

二、方法实现

数据是整个方法实施的基础,精确的数据才能得到精确的结果。首先根据道路所在带号对路网数据进行投影转换;然后用创建路径工具对投影转换后的数据添加线性参考系统,确定路网的方向,选择投影距离作为测量值,这样就生成了带m值的数据;最后根据里程桩桩号的计算规则进行推算(本文基于ArcObjects开发了桩号推算工具,利用推算工具进行计算),得到里程桩位置。

1 数据处理流程

a)根据公路所在带号进行投影转换,如果公路出现跨带的情况,可以根据带号把路网截断,公路的长度为投影的长度。

b)用ArcGIS的创建路径工具(Create Routes)给公路数据添加线性参考系统,用投影距离作为测量值。

c)根据里程桩桩号的推算规则,使用处理好的数据进行推算,利用ArcObjects开发的工具进行操作。

d)导出推算后的里程桩数据。

图1 数据处理流程

2 里程桩桩号推算工具

基于ArcObjects开发桩号推算工具,可以利用带有m值的路网数据进行里程桩桩号推算。ArcObjects提供了一个重要的接口IMSegmentation,这个接口可以对有线性参考系统的Polyline和Polygon进行操作。该接口提供了GetPointsAtM方法,通过此方法可以获取的线上任意m值所在的点位,这样通过m值(里程值)就可以得到任意点的坐标位置。

下面结合图2-2和图2-3说明一下里程桩号推算算法步骤:

(1)导入带有m值的路网数据;

(2)确认起算点,直接从路径的起点开始,推算到整条路的终点;

(3)输入起点桩号,并检查输入的桩号是否符合规范,并计算初始距离。如K1或者K1+200,否则输入内容不符合规范。K1表示起点桩是K1,初始距离为0米;K1+200,表示起点桩是K1,初始距离为200米;

(4)输入每个里程桩之间的距离,默认1 000米;

(5)利用这条公路的总里程和每个里程桩之间的距离计算出总路桩数;再用路桩总数循环计算出每个路桩的位置(通过GetPointsAtM方法获取每个点的位置)。如果起点是整桩号的话,比如起点桩号是K1,则第一个桩就在距离K1桩1 000m处,第二个桩就在距离K1桩2 000m处;如果起点是非整桩号的话,比如起点桩号是K1+200,则第一个桩就在距离K1+200桩800m处,第二个桩就在距离K1+200桩180 0m处,其实距离K1桩还是1 000m和2 000m,以此类推,就可以得到所有的整桩号里程桩的位置(除去起点),并把结果保存到集合中;最后把起点和终点分别加入到集合的首部和尾部,再根据桩号的命名规则,从起点桩号开始计算,最终得出所有里程桩的具体位置和桩号。下面附上计算里程桩位置的关键代码:

IMSegmentation segmentation = polyline as IMSegmentation;

IList points= new List();

var counter = (int)(segmentation.MMax - segmentation.MMin) / splitDistance;

for (int i = 0; i < counter; i++)

{

var distance = (i + 1) * splitDistance-startDistance;

distance += segmentation.MMin;

var find = segmentation.GetPointsAtM(distance, 0);

points.Add(find);

}

这里的segmentation就是我们要进行推算的路径;points是找到的桩号点集合;splitDistance是每个桩之间的间距(默认1 000米);startDistance是通过桩号得到的初始距离,例如K1则startDistance等于0,K1+200则startDistance等于200;用总里程和间距得到要推算的桩的数量counter;通过循环利用GetPointsAtM方法即可推出该路径上的所有里程桩位置。计算完桩号位置后,把数据保存到shapefile文件中,同时计算桩号。

IFeatureCursor featureCursorInsert = _tempFeatureClass.Insert(true);

for (int i = 0; i < points.Count; i++)

{

var point = points[i];

if (i == 0)

{

featureBuffer.Value[featureBuffer.Fields.FindField("MileageName")]= startMileage;

}

else if ((i == points.Count - 1)&&(points.Count>2))

{

featureBuffer.Value[featureBuffer.Fields.FindField("MileageName")] =

$"K{mileageNum}+”+ (int)(point.M - points[points.Count - 2].M);

}

else

{

featureBuffer.Value[featureBuffer.Fields.FindField("MileageName")]= $"K{++mileageNum}";

}

featureBuffer.Shape = point;

featureCursorInsert.InsertFeature(featureBuffer);

}

这里的points就是加入起点和终点后的所有里程桩点位的集合;startMileage为起点桩号,例如K1;mileageNum是K后面的数字,例如K1就是1。第一个判断是计算起点桩号;第二个判断是计算终点桩号,终点有可能不是整桩号,其桩号为倒数第二个点的桩号+剩余距离,例如K125+400;最后一步则是计算其余整桩的桩号。

(6)导出里程桩数据。

图2 里程桩位置推算流程

图3 里程桩桩号推算流程

图4 桩号推算工具

三、实测比较

根据推算结果,进行了某条路的实测数据和推算数据对比,外业采集了大约60个点的数据。如图5所示,图中绿色圆点为推算数据,红色三角为外业GPS实测点。在图上可以看到推算结果和实测结果很接近,通过在ArcGIS中进行计算,实测点和推算点之间大概相差20米左右,如图6所示。

图5 推算结果和实际测量结果对比

图6 推算和实测局部比较

利用实测点和推算点对路线进行切割处理后,对比图7和图8可以看到推算出来的数据每个点之间的距离基本一致,而实测点之间的距离则存在着10-50米的偏差。利用ArcGIS进行统计,可以得到进一步的统计信息。通过对比图9和图10可以看到,二者在平均值上几乎都等于1000米;在最大值和最小值的差值上,实测结果相差了120米,而推算结果不到1米;实测结果的标准差为35.34,推算结果的标准差为0.11;在频数分布图上可以看到,推算方法的分布图比实测的更为集中。通过统计对比,可以得知利用该方法处理得到的里程桩位置精度有了明显的提升。

图7 推算点之间的距离

图8 实测点之间的距离

图9 推算点统计信息

图10 实测点统计信息

四、小结

在公路系统中,里程桩是一项重要定位参照物,它能帮助人们迅速定位在公路上的位置。本文提出的这种方法能快速准确的计算出里程桩的位置,提高数据生产效率,降低作业成本。但是该方法也有不足之处,由于在计算距离的时候使用的投影距离,因此在坡度较大的地方,道路投影下来的里程会比实际里程短,所以在这些情况下的计算要还结合实际的情况和相关指标进行调整。数据生产完成后,我们可以借助WebGIS技术实现电子化的施工管理,施工人员利用移动设备,根据坐标快速找到施工点位,完成里程桩的布设,管理人员也可以通过电子地图实时了解到施工进展。目前该方法已经广泛运用到云南省高速公路和国省道的里程桩施工中,极大地提高了工作效率。

猜你喜欢
起点里程投影
纯电动汽车续驶里程影响因素
农村公路总里程突破435万公里
解变分不等式的一种二次投影算法
基于最大相关熵的簇稀疏仿射投影算法
找投影
找投影
弄清楚“起点”前面有多少
起点
腾势400 用在上海市区的来回穿梭克服里程焦虑
我的“新”起点