作为一名用 Python 进行数据分析的人来说,数据源往往是最让人头痛的。
直接屏蔽问题来源的做法,这些年见过很过,大多数人也无能为例。
不过今天我还是想介绍一下如何将 GPS 数据转换为行驶轨迹,推断某个时间点或时段车辆所在的位置,并判断车辆是否经过指定区域。
希望人人都是 B 站博主@高剑犁 [3]。
前文说过,货车轨迹用到的是 LoT 技术,指的是通过互联网或其他通信网络将物体有关的数据采集、传输到网关,并进行数据分析和处理,最终展示出来。发货帮 App 的货车轨迹功能就是一个完整 LoT 应用。
既然油罐车轨迹获取不到,我就拿公开的数据集做演示。
本次示例数据来源:由Desheng Zhang, Rutgers University[4]发布,名为 Urban Data Release V2,选取其中的深圳是出租车 GPS 数据。
用到的工具是 pandas 和GitHub - movingpandas/movingpandas: Movement trajectory clas...[5], pandas 是一个非常常用的数据分析库,而 MovingPandas 则是基于 pandas 和 GeoPandas 构建的专门用于处理运动数据的库。
通过结合 pandas 和 movingpandas,用户可以高效地处理和分析复杂的运动数据,进行深入的数据探索和可视化。
movingpandas 环境比较复杂,这里只列出一种方法:使用Anaconda[6]通过environment.yml[7]安装和配置 Python 环境。
# 下载environment.yml
# wget https://github.com/movingpandas/movingpandas/blob/main/environment.yml
# 安装环境
conda env create --file environment.yml
# 激活环境
conda activate movingpandas-dev
# 安装movingpandas
conda install -c conda-forge movingpandas
之前在文章《从零开始:用 Python 和 Pandas 精准提取出租车 GPS 数据中的 OD 行程信息 - Renhai 实验室[8]》中已经讲过如何读取和清洗数据了,数据清洗之后类似于:
VehicleNum Time Lng Lat OccupancyStatus Speed 0 22223 11:14:18 114.137871 22.575317 0 0 1 22223 01:18:28 114.137131 22.575983 0 0 2 22223 13:11:42 114.136269 22.545851 1 18 3 22223 02:05:47 114.135948 22.578917 0 29 4 22223 02:05:24 114.135834 22.577433 0 20
因为要我们追踪某一辆车,于是随机取得了一辆深圳出租车在 2013 年 10 月 22 日的 2582 条 GPS 数据:
一行代码就搞定了:
tc = mpd.TrajectoryCollection(df_sample,
'VehicleNum',
t='DateTime',
x='Lng',
y='Lat')
tc
输出:TrajectoryCollection with 1 trajectories。
我们已经将车辆编号为 22223 的轨迹从“点”数据变为“线”,接下来可视化:
hvplot_defaults = {'tiles':'CartoLight', 'frame_height':400, 'frame_width':700, 'cmap':'Viridis', 'colorbar':True}
tc.hvplot(title=str(tc), line_width=5, **hvplot_defaults)
原始轨迹
有了轨迹可以追踪车辆,方法一就是手动寻找:
# 获取某个时间点的近似位置
some_time = datetime(2013, 10, 22, 12, 6, 0)
estimated_position = my_traj.get_position_at(some_time, method="nearest")
estimated_position
输出:POINT (114.116417 22.546417)
提取轨迹
可以使用 folium 绘制并保存为 html,通过浏览器打开。
import pprint
import folium
from datetime import datetime
import geopandas as gpd
# 获取开始和结束点
start_point = my_traj.get_start_location()
end_point = my_traj.get_end_location()
# 获取某个时间点的近似位置
some_time = datetime(2013, 10, 22, 12, 6, 0)
estimated_position = my_traj.get_position_at(some_time, method="nearest")
print(estimated_position)
# 创建地图对象
m = folium.Map(location=[22.543096, 114.057865], zoom_start=12)
# 将轨迹数据转换为GeoDataFrame并处理时间戳
traj_gdf = my_traj.to_traj_gdf()
traj_gdf['start_t'] = traj_gdf['start_t'].astype(str) # 将时间戳转换为字符串
traj_gdf['end_t'] = traj_gdf['end_t'].astype(str)
pprint.pp(traj_gdf.to_json())
# 将轨迹数据添加到地图上
folium.GeoJson(traj_gdf.to_json()).add_to(m)
# 添加开始点标记
folium.Marker(
location=[start_point.y, start_point.x],
popup=folium.Popup("Start Point", parse_html=True),
icon=folium.Icon(color='red')
).add_to(m)
# 添加结束点标记
folium.Marker(
location=[end_point.y, end_point.x],
popup=folium.Popup("End Point", parse_html=True),
icon=folium.Icon(color='green')
).add_to(m)
# 添加估计位置标记
folium.Marker(
location=[estimated_position.y, estimated_position.x],
popup=folium.Popup(f"Estimated Position\n {some_time.strftime('%H:%M')}", parse_html=True),
icon=folium.Icon(color='blue')
).add_to(m)
# 保存地图到HTML文件
m.save("map.html")
# 显示地图
m
html
有时候如果你需要在别的地理可视化软件比如ArcGISPro
中处理,可以将轨迹导出,有三种类型的数据可以导出:
通常选择最后一种,兼容wkt
格式。
本文的源代码、示例数据和 html 文件在:Urban-Spatial-Data-Analysis-Notebook/4-空间数据分析/4.1-交通大数据分析/【专...[9]可以获取。
本文的后续将在博客文章[10]中持续更新,微信用户点击阅读原文即可跳转。
欢迎留言!
参考资料
[1]
在原网站中查看: https://www.infzm.com/contents/274910
[2]
@高剑犁 : https://space.bilibili.com/59104725/dynamic
[3]
@高剑犁 : https://space.bilibili.com/59104725/dynamic
[4]
Desheng Zhang, Rutgers University: https://people.cs.rutgers.edu/~dz220/data.html
[5]
GitHub - movingpandas/movingpandas: Movement trajectory clas...: https://github.com/movingpandas/movingpandas?tab=readme-ov-file
[6]
Anaconda: https://docs.continuum.io/anaconda/
[7]
environment.yml: https://github.com/movingpandas/movingpandas/blob/main/environment.yml
[8]
从零开始:用 Python 和 Pandas 精准提取出租车 GPS 数据中的 OD 行程信息 - Renhai 实验室: https://blog.renhai.online/archives/extracting-od-trips-from-gps-information
[9]
Urban-Spatial-Data-Analysis-Notebook/4-空间数据分析/4.1-交通大数据分析/【专...: https://github.com/renhai-lab/Urban-Spatial-Data-Analysis-Notebook/tree/main/4-%E7%A9%BA%E9%97%B4%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/4.1-%E4%BA%A4%E9%80%9A%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/%E3%80%90%E4%B8%93%E9%A2%98%E4%B8%80%E3%80%91%E5%87%BA%E7%A7%9F%E8%BD%A6GPS%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90