地图匹配(map-matching)

地图匹配(map-matching)

地图匹配算法实现


前言

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

总结

地图匹配之后的效果如下所示
在这里插入图片描述

  • 11
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值