GPS数据由于信号不良、通信异常、定位误差等原因,不能很好地落在道路上,所以需要对GPS数据进行地图匹配,与道路进行关联。而空间数据由于其特殊的数据格式,最佳的处理途径仍旧是ArcGIS Desktop系列软件。
根据实验的需要提取出路网数据,对路网进行拓扑检查,包括不能有重叠、不能有悬挂点等,对拓扑错误进行修改;同时,需要进行“在折点处打断”操作,形成正确可用的路网数据。
GPS数据预处理是GPS数据使用的第一步,详见博客。
1、GPS数据提取
现有的GPS数据由城市中运行的出租车生成,在将GPS点匹配到路网数据之前,需要考虑数据更新问题:城市每天都在变化,路网每天都在更改,GPS数据中也许蕴含着一些现有路网中不存在的道路,所以也就引出了”基于GPS数据的道路更新”1的课题。由于本次实验重点讨论现有路网,所以,首先要将与现有道路相关联的GPS数据提取出来。
#coding:utf-8
import arcpy
from arcpy import env
env.workspace = r'F:\GraduateStudy\Graduate\Data\Scratch.gdb'
#做缓冲区
print 'Buffer'
buffer = arcpy.Buffer_analysis('Road', '#', '20 Meters', 'FULL', 'ROUND', 'ALL', '#', 'PLANAR')
buffer = buffer.getOutput(0)#buffer的路径
buffer_Name = buffer.split('\\')[-1]
#缓冲区与GPS数据相交
print 'Intersect'
GPS_Intersect = arcpy.Intersect_analysis('GPS20121114 #;'+ buffer_Name + ' #','#', 'ALL', '#', 'INPUT')
GPS_Intersect = GPS_Intersect.getOutput(0)#相交后GPS数据的路径
GPS_Intersect_Name = GPS_Intersect.split('\\')[-1]
对道路做buffer缓冲区分析,同时将得到的缓冲区融合(不然会有重复的部分,使得切割GPS点的时候有重合)。依据实验中GPS点的精度,对路网做20米的缓冲区。
将GPS点与Buffer相交,得到现有路网范围内的GPS数据。
2、匹配度指标选取
匹配度指标的选取是地图匹配中最重要的一环,也直接决定着匹配效果。一般来说,点和线的匹配,需要考虑距离和方向两个因素。距离因素的考虑自不用说,在一定距离范围内,有多条可能路段的前提下,就需要考虑哪一条路段与GPS点方向最为接近。匹配度的计算公式为:
在ArcGIS中可以用“近邻分析”计算GPS点与各候选路段的距离;以正北为0°,顺时针旋转,统一构建角度度量,计算GPS点方向与各候选路段之间的夹角;最终计算得到匹配度。
3、使用更新几何的方法,将GPS点移动到道路上。
#GPS数据,对Road路网,做近邻分析
arcpy.Near_analysis(GPS_Intersect_Name, Road_Name, '#', 'LOCATION', 'NO_ANGLE', 'PLANAR')
Field_X = 'NEAR_X'
Field_Y = 'NEAR_Y'
#对每一条GPS数据提取地图匹配后的位置
dic = {}
cursor = arcpy.da.SearchCursor(GPS_Intersect_Name, ['OBJECTID','NEAR_X','NEAR_Y'])
for row in cursor:
dic[row[0]] = [row[1],row[2]]
del cursor
del row
#更新几何
cursor = arcpy.da.UpdateCursor(GPS_Intersect_Name,['OBJECTID', 'SHAPE@XY'])
for row in cursor:
row[1] = dic[row[0]]
cursor.updateRow(row)
del cursor
del row
地图匹配算法的研究已经不是一个新问题,大量学者对地图匹配算法进行了改进2,本文仅仅是其中最简单的几何匹配,而且在实际应用中,考虑到数据的不一致性、地图匹配的目的等具体问题,每个人的方法均不相同。希望本文的方法能有所帮助,欢迎多多交流指教。
(By MrHammer 2016-05-08 下午3点 @Bin House Rainy)