前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GPS追踪还原罐车轨迹,食品安全问题再现!

GPS追踪还原罐车轨迹,食品安全问题再现!

作者头像
renhai
发布2024-07-19 18:58:18
570
发布2024-07-19 18:58:18
举报
文章被收录于专栏:renhailab数据分析

作为一名用 Python 进行数据分析的人来说,数据源往往是最让人头痛的。

直接屏蔽问题来源的做法,这些年见过很过,大多数人也无能为例。

不过今天我还是想介绍一下如何将 GPS 数据转换为行驶轨迹,推断某个时间点或时段车辆所在的位置,并判断车辆是否经过指定区域。

希望人人都是 B 站博主@高剑犁 [3]

学会提取轨迹数据,人人都是“高剑犁”

前文说过,货车轨迹用到的是 LoT 技术,指的是通过互联网或其他通信网络将物体有关的数据采集、传输到网关,并进行数据分析和处理,最终展示出来。发货帮 App 的货车轨迹功能就是一个完整 LoT 应用。

既然油罐车轨迹获取不到,我就拿公开的数据集做演示。

(1)数据源

本次示例数据来源:由Desheng Zhang, Rutgers University[4]发布,名为 Urban Data Release V2,选取其中的深圳是出租车 GPS 数据。

(2)工具包

用到的工具是 pandas 和GitHub - movingpandas/movingpandas: Movement trajectory clas...[5], pandas 是一个非常常用的数据分析库,而 MovingPandas 则是基于 pandas 和 GeoPandas 构建的专门用于处理运动数据的库。

  • MovingPandas 是一个基于 pandas 和 GeoPandas 的 Python 库,专门用于运动数据的探索和分析。它提供了轨迹数据结构和相应的函数,用于处理和分析运动数据。
  • MovingPandas 利用 pandas 的时间序列处理功能和 GeoPandas 的空间数据处理功能,能够处理包含时间戳和几何信息的轨迹数据。
  • 主要功能包括轨迹创建、停留点检测、轨迹分割、轨迹清洗与平滑、轨迹聚合、运动特征计算(如速度、方向、加速度)以及静态和交互式可视化。

通过结合 pandas 和 movingpandas,用户可以高效地处理和分析复杂的运动数据,进行深入的数据探索和可视化。

(3)Python 环境配置

movingpandas 环境比较复杂,这里只列出一种方法:使用Anaconda[6]通过environment.yml[7]安装和配置 Python 环境。

代码语言:javascript
复制
# 下载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

(4)读取数据

之前在文章《从零开始:用 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 数据:

(5)转为轨迹数据

一行代码就搞定了:

代码语言:javascript
复制
tc = mpd.TrajectoryCollection(df_sample,
                              'VehicleNum',
                              t='DateTime',
                              x='Lng',
                              y='Lat')
tc

输出:TrajectoryCollection with 1 trajectories。

我们已经将车辆编号为 22223 的轨迹从“点”数据变为“线”,接下来可视化:

代码语言:javascript
复制
hvplot_defaults = {'tiles':'CartoLight', 'frame_height':400, 'frame_width':700, 'cmap':'Viridis', 'colorbar':True}
tc.hvplot(title=str(tc), line_width=5, **hvplot_defaults)

原始轨迹

(6)追踪轨迹

有了轨迹可以追踪车辆,方法一就是手动寻找:

如果你需要通过时间点找寻车辆在哪个位置:
代码语言:javascript
复制
# 获取某个时间点的近似位置
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)

如果你需要寻找车辆是否经过某一位置:

提取轨迹

(7)保存轨迹为 html 文件

可以使用 folium 绘制并保存为 html,通过浏览器打开。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 renhailab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 学会提取轨迹数据,人人都是“高剑犁”
    • (1)数据源
      • (2)工具包
        • (3)Python 环境配置
          • (4)读取数据
            • (5)转为轨迹数据
              • (6)追踪轨迹
                • 如果你需要通过时间点找寻车辆在哪个位置:
                • 如果你需要寻找车辆是否经过某一位置:
              • (7)保存轨迹为 html 文件
                • 导出轨迹
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档