地图匹配算法实现
文章目录
- 地图匹配算法实现
- 前言
- 一、代码环境介绍?
- 二、使用步骤
- 1.引入库
- 2.读入数据
- 3.读入数据
- 4.构造相交的位置
- 5、将点匹配到相应的道路上
- 总结
前言
GPS数据由于信号不良、通信异常、定位误差等原因,不能很好地落在道路上,所以需要对GPS数据进行地图匹配,与道路进行关联。数据预处理阶段,必须要做的工作之一就是地图匹配,地图匹配就是,把车辆的行驶轨迹和电子地图数据库中的道路网进行比较,在地图上找出与行驶轨迹最相近的路线,并将实际定位数据映射到直观的数字地图上。匹配前的地图如下所示
提示:以下是本篇文章正文内容,下面案例可供参考
一、代码环境介绍?
本文中使用的开发工具为PyCharm和ArcMap10.2中内置的Python环境,其中内置的Python环境是Python2.7。
二、使用步骤
1.引入库
代码如下(示例):
#-*- encoding: UTF-8 -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import arcpy
from arcpy import env
# 工作空间,即文件的输出路径
env.workspace = r'C:\Users\96571\Documents\ArcGIS\Default.gdb'
2.读入数据
代码如下(示例):
road_name = r"C:\Users\96571\Desktop\map_matching\data_0914\51公交线路\51公交线路.shp" #道路名称,注意要输入绝对路径
point_path = r"C:\Users\96571\Desktop\map_matching\data_0914\站点筛选0914\bus2_point.shp" #点的文件名称,注意要输入绝对路径
该数据为本人电脑中存储的路径,后续读者可以根据自己的需求来修改。
3.读入数据
地图匹配的类和创建缓冲区代码如下:
class MapMatching:
def __init__(self, Road_Name=None, point_path=None):
self.Road_Name = Road_Name
self.point_path = point_path
def make_buffer(self):
Road_Name = self.Road_Name
print 'Buffer'
buffer = arcpy.Buffer_analysis(Road_Name, '#', '20 Meters', 'FULL', 'ROUND', 'ALL', '#')
buffer = buffer.getOutput(0) # buffer的路径
self.buffer_Name = buffer.split('\\')[-1]
4.构造相交的位置
缓冲区与GPS点的数据相交的代码如下,目的是为了将缓冲区内部的点都提取出来,为之后的地图匹配做准备:
def intersect_anaysis(self):
# 缓冲区与GPS数据相交
point_path = self.point_path
print 'Intersect'
GPS_Intersect = arcpy.Intersect_analysis(point_path + ' #;' + self.buffer_Name + ' #', '#', 'ALL', '#', 'INPUT')
GPS_Intersect = GPS_Intersect.getOutput(0) # 相交后GPS数据的路径
self.GPS_Intersect_Name = GPS_Intersect.split('\\')[-1]
# GPS数据,对Road路网,做近邻分析
arcpy.Near_analysis(self.GPS_Intersect_Name, self.Road_Name, '#', 'LOCATION', 'NO_ANGLE') # 注意:location参数为必要的
# 对每一条GPS数据提取地图匹配后的位置
5、将点匹配到相应的道路上
根据此代码可将点匹配到相应的道路上:
def update_data(self):
dic = {}
cursor = arcpy.da.SearchCursor(self.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(self.GPS_Intersect_Name, ['OBJECTID', 'SHAPE@XY'])
for row in cursor:
row[1] = dic[row[0]]
cursor.updateRow(row)
del cursor
del row
总结
地图匹配之后的效果如下所示