本例尝试使用TransBigData+leuvenmapmatching实现出租车GPS数据的路网匹配,使用的样例数据在:https://github.com/ni1o1/transbigdata/tree/main/docs/source/gallery/dataA Python package developed for transportation spatio-temporal big data processing and analysis. - transbigdata/example/data at main · ni1o1/transbigdatahttps://github.com/ni1o1/transbigdata/tree/main/docs/source/gallery/data

说明

本案例中用到的基础技术方法在我录制的课程中:

出租车GPS数据常见处理思路-OD提取?轨迹提取?地图匹配_哔哩哔哩_bilibili【视频简介】本系列视频是我和立方数据学院合作的交通时空大数据系列【进阶课程】视频中的出租车GPS数据处理方法在进阶课程中有代码实操和讲解,交通大数据分析实战:https://www.lifangshuju.com/#/introduce/154https://www.bilibili.com/video/BV1WL4y1L7QG

【课程合集-零基础】大数据博士带你零基础入门Python时空大数据分析_哔哩哔哩_bilibili【课程简介】本系列视频是我和立方数据学院合作的python城市研究系列【课程资料】添加立方数据学院客服小鲨鱼(微信号:wo_am_nini),可加入立方数据学院技术交流群, 在群里面可获取视频的课程资料,群里也提供答疑服务【进阶课程】交通大数据分析实战:https://www.lifangshuju.com/#/introduce/154https://www.bilibili.com/video/BV1Gr4y1q7F9

轨迹整理

import transbigdata as tbd
import pandas as pd
# 地图匹配包
from leuvenmapmatching.matcher.distance import DistanceMatcher
from leuvenmapmatching.map.inmem import InMemMap
from leuvenmapmatching import visualization as mmviz#读取数据
data = pd.read_csv('TaxiData-Sample.csv',header = None)
data.columns = ['VehicleNum','Time','Lng','Lat','OpenStatus','Speed']
#从GPS数据提取OD与路径GPS
oddata = tbd.taxigps_to_od(data,col = ['VehicleNum','Time','Lng','Lat','OpenStatus'])
data_deliver,data_idle = tbd.taxigps_traj_point(data,oddata,col=['VehicleNum', 'Time', 'Lng', 'Lat', 'OpenStatus'])

路网建模

# 获取路网
import osmnx as ox
bounds = [113.75, 22.4, 114.62, 22.86]
north, south, east, west = bounds[3], bounds[1], bounds[2], bounds[0]
G = ox.graph_from_bbox(north, south, east, west, network_type='drive')
#存储路网
ox.save_graphml(G,'shenzhen.graphml')
#获取道路中心点坐标
nodes, edges = ox.graph_to_gdfs(G, nodes=True, edges=True)
edges['lon'] = edges.centroid.x
edges['lat'] = edges.centroid.y
#转换路网的坐标系
G_p = ox.project_graph(G, to_crs=2416)
nodes_p, edges_p = ox.graph_to_gdfs(G_p, nodes=True, edges=True)
edges_p.plot()

# 将路网转换为网络
map_con = InMemMap(name='pNEUMA', use_latlon=False) # , use_rtree=True, index_edges=True)# 构建网络
for node_id, row in nodes_p.iterrows():map_con.add_node(node_id, (row['y'], row['x']))
for node_id_1, node_id_2, _ in G_p.edges:map_con.add_edge(node_id_1, node_id_2)

地图匹配

#用transbigdata提取出行轨迹
import geopandas as gpd
tmp_gdf = data_deliver[data_deliver['ID'] == 22].sort_values(by = 'Time')
#轨迹增密
tmp_gdf = tbd.traj_densify(tmp_gdf,col = ['ID', 'Time', 'Lng', 'Lat'],timegap = 15)
#转换轨迹的坐标系为地理坐标系
tmp_gdf['geometry'] = gpd.points_from_xy(tmp_gdf['Lng'],tmp_gdf['Lat'])
tmp_gdf = gpd.GeoDataFrame(tmp_gdf)
tmp_gdf.crs = {'init':'epsg:4326'}
tmp_gdf = tmp_gdf.to_crs(2416)
#获得轨迹点
path = list(zip(tmp_gdf.geometry.y, tmp_gdf.geometry.x))
#构建地图匹配工具
matcher = DistanceMatcher(map_con, max_dist=500, max_dist_init=170, min_prob_norm=0.0001,non_emitting_length_factor=0.95,obs_noise=50, obs_noise_ne=50,dist_noise=50,max_lattice_width=20,non_emitting_states=True)
#进行地图匹配
states, _ = matcher.match(path, unique=False)
#绘制底图匹配结果
mmviz.plot_map(map_con, matcher=matcher,show_labels=False, show_matching=True,# show_graph=True,filename=None)

#获取地图匹配的路径geodataframe
pathdf = pd.DataFrame(matcher.path_pred_onlynodes,columns = ['u'])
pathdf['v'] = pathdf['u'].shift(-1)
pathdf = pathdf[-pathdf['v'].isnull()]
pathgdf = pd.merge(pathdf,edges_p.reset_index())
pathgdf = gpd.GeoDataFrame(pathgdf)
pathgdf.plot()
pathgdf.crs = {'init':'epsg:2416'}
pathgdf_4326 = pathgdf.to_crs(4326)

结果可视化

#与路网一起可视化
import matplotlib as mpl
import matplotlib.pyplot as pltfig     = plt.figure(1,(8,8),dpi = 100)
ax      = plt.subplot(111)
plt.sca(ax)
fig.tight_layout(rect = (0.05,0.1,1,0.9))
#设定可视化边界
bounds = pathgdf_4326.unary_union.bounds
gap = 0.003
bounds = [bounds[0]-gap,bounds[1]-gap,bounds[2]+gap,bounds[3]+gap]
#绘制匹配的路径
pathgdf_4326.plot(ax = ax,zorder = 1)
#绘制底图路网
tbd.clean_outofbounds(edges,bounds,col = ['lon','lat']).plot(ax = ax,color = '#333',lw = 0.1)
#绘制GPS点
tmp_gdf.to_crs(4326).plot(ax = ax,color = 'r',markersize = 5,zorder = 2)plt.axis('off')
plt.xlim(bounds[0],bounds[2])
plt.ylim(bounds[1],bounds[3])
plt.show()

随便选几个轨迹匹配的结果:

参考链接

TransBigData 为交通时空大数据而生 — TransBigData 0.2.7 文档https://transbigdata.readthedocs.io/Leuven.MapMatching’s documentation — Leuven.MapMatching 1.0.0 documentationhttps://leuvenmapmatching.readthedocs.io/en/latest/OSMnx 1.1.2 — OSMnx 1.1.2 documentationhttps://osmnx.readthedocs.io/en/stable/

Python出租车GPS数据的路网匹配(TransBigData+leuvenmapmatching)相关推荐

  1. Python出租车GPS数据的路网匹配(踩坑复盘)

    目录 项目背景 TransBigData简介 数据预处理 数据栅格化 订单起讫点OD提取与聚合集计 交互可视化 总结 (基于小旭学长的TansBigData项目实践,此篇在转载小旭学长项目的基础上对遇 ...

  2. 树莓派连接GPS模块,python获取GPS数据

    文章主要内容: 模块之间的连接 树莓派识别gps模块 使用Python语言获取GPS数据 1.连线 ---- 使用 USB转TTL转换器,将树莓派和GPS模块连接 需要的设备:gps模块,gps天线, ...

  3. python获取gps数据_python获取android设备的GPS信息脚本分享

    在android上,我们可以使用QPython来编写.执行Python脚本.它对很多android 系统函数进行了方便的封装,使用QPython编写功能简单的小程序异常方便. 这个示例是我之前用来读取 ...

  4. python获取gps数据_Python GPS模块:读取最新的GPS数据

    加我两分钱. 无论出于何种原因,我的覆盆子pi将继续执行一个线程,我必须硬重置pi. 所以我结合了sysnthesizerpatel和我在Dan Mandel的博客here上找到的答案. 我的gps_ ...

  5. python实现表格数据按照字段匹配

    import pandas as pd with pd.ExcelFile('匹配.xls') as xls:df1 = pd.read_excel(xls, '企业活期')df = pd.read_ ...

  6. python出租车数据_1-出租车数据的基础处理,由gps生成OD(pandas).ipynb

    { "cells": [ { "cell_type": "markdown", "metadata": {}, &quo ...

  7. 【研究总结】基于出租车GPS轨迹数据的相关研究

    出租车纯粹研究出现貌似已经过时了,在常规研究的时代结束之前,让我们来回顾和展望一下 一.常规研究 1.一般从出租车的运营特征(车.载客.行程.空载率)和出行空间特征(OD点线)两个方面来研究居民的出行 ...

  8. Python学习:利用python解析GPS模块数据,并生成可视化地图显示

    一.GPS模块数据格式 笔者在项目中使用过移远L76K以及梦芯MXT905HM两款GPS定位芯片,两款芯片均是采用串口输出数据,而且数据包采用的是NEMA协议消息结构,消息结构如下: 数据包格式如下: ...

  9. Transbigdata——交通出租车大数据可视化分析,以成都市为例

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.数据集 二.操作步骤 1.引入库 2.读入数据 3.数据预处理 4.数据栅格化处理 5.可视化分析 总结 存在的问 ...

最新文章

  1. android不公开的面试题偶!!!
  2. Socket的三个关联函数
  3. eclipseweb开发遇到的bug
  4. SQL AVG() 函数
  5. LeetCode 727. 最小窗口子序列(滑动窗口)
  6. Linux系统json文件打中文,如何在 Linux 终端上漂亮地打印 JSON 文件
  7. c语言调用createthread线程的头文件_易语言API多线程总汇
  8. 多用户在线人数监听(基于TomCat)
  9. fastdfs上传文件_Java 实现 FastDFS 实现文件的上传、下载、删除
  10. [剑指offer] 42. 和为S的两个数字
  11. 各类木材强度_常用木材防腐剂有哪些
  12. shiro原理及其运行流程介绍
  13. 图片秒加水印制作生成威信小程序源码下载
  14. 计算机办公软件应用中级,计算机办公软件应用中级和计算机123级有什 – 手机爱问...
  15. 这是我见过最接地气的PCB设计指南了!
  16. Markdown流程图
  17. Matlab:如何批量修改图片名称(图像处理)
  18. Armbian : sudo must be owned by uid 0 and have the setuid bit set错误处理
  19. 常见的数值积分方法_欧拉积分/中值积分/龙格-库塔积分
  20. java dataoutputstream_Java DataOutputStream类

热门文章

  1. 12代酷睿笔记本有哪些不错?游匣G16体验大升级
  2. 远程桌面登录提示存储空间不足
  3. 简述网上银行的服务器端系统,网上银行系统jsp .doc
  4. matlab怎么取消科学计数法_在MATLAB中更改数据科学计数法
  5. CentOS 7安装并启动Google浏览器
  6. 班级聚会(reunion)
  7. semiplannar 什么是_图像识别VPU——易用的嵌入式AI支持深度学习平台介绍
  8. ubantu下QT连接数据库mysql
  9. Python数据分析入门书籍推荐!!!强烈推荐,新手必看
  10. latex如何换页 一页放不下