python 笔记:PyTrack(将GPS数据和OpenStreetMap数据进行整合)【官网例子解读】
论文笔记:PyTrack: A Map-Matching-Based Python Toolbox for Vehicle Trajectory Reconstruction_UQI-LIUWJ的博客-CSDN博客4
0 包的安装
官网的两种方式我都试过,装是能装成功,但是python import PyTrack包的时候还是显示找不到Pytrack
# conda
conda install pytrack # or PyPI
pip install PyTrack-lib
于是使用这种安装方式,成功了:
pip 另一种安装方法:python setup.py install_python setup.py bdist_wheel did not run successful_UQI-LIUWJ的博客-CSDN博客
1 GPS数据导入
import numpy as np
import pandas as pddf=pd.DataFrame([{'datetime':'23-04-21 16:46:19:583000','lat':43.759650,'lon':11.291561},{'datetime':'23-04-21 16:46:36:570000','lat':43.759645,'lon':11.291544},{'datetime':'23-04-21 16:46:52:647000','lat':43.759671,'lon':11.291162},{'datetime':'23-04-21 16:47:37:568000','lat':43.759677,'lon':11.291148},{'datetime':'23-04-21 16:47:49:639000','lat':43.759691,'lon':11.290932},{'datetime':'23-04-21 17:12:37:573000','lat':43.779596,'lon':11.254733},{'datetime':'23-04-21 17:12:51:592000','lat':43.779583,'lon':11.254295},{'datetime':'23-04-21 17:13:05:572000','lat':43.779206,'lon':11.253978},{'datetime':'23-04-21 17:13:20:592000','lat':43.779205,'lon':11.253974},{'datetime':'23-04-21 17:13:36:590000','lat':43.778464,'lon':11.253364}])
df

2 GPS数据处理
latitude = df["lat"].to_list()
longitude = df["lon"].to_list()points = [(lat, lon) for lat, lon in zip(latitude, longitude)]
points
'''
[(43.75965, 11.291561),(43.759645, 11.291544),(43.759671, 11.291162),(43.759677, 11.291148),(43.759691, 11.290932),(43.779596, 11.254733),(43.779583, 11.254295),(43.779206, 11.253978),(43.779205, 11.253974),(43.778464, 11.253364)]
'''north, east = np.max(np.array(points),axis=0)
south, west = np.min(np.array(points),axis=0)
north,south,east,west
#(43.779596, 43.759645, 11.291561, 11.253364)
3 获得路网Graph
from pytrack.graph import graph, distance
from pytrack.analytics import visualizationbbox=distance.enlarge_bbox(north, south, west, east, 500)
G = graph.graph_from_bbox(*distance.enlarge_bbox(north, south, west, east, 500), simplify=True, network_type='drive')
#Downloaded 1,767.31kB
3.1 显示提取的图
map=visualization.Map(location=(np.mean(latitude),np.mean(longitude)))
map.add_graph(G,plot_nodes=True)
map

4 提取候选点
- get_candidates方法返回两个输出
- graph的插值版本G_interp
- 候选点的字典candidates
- 下面0,1 ,7,8都是一个candidate;2,3,4,5,6是4个;9是3个
from pytrack.matching import candidate, mpmatching_utils, mpmatching# Extract candidates
G_interp, candidates = candidate.get_candidates(G, points, interp_dist=5, closest=True, radius=30)candidates
'''
{0: {'observation': (43.75965, 11.291561),'osmid': [135115743],'edge_osmid': [590848305],'candidates': [(43.75963763247117, 11.291543159878621)],'candidate_type': array([False]),'dists': [1.9859410359888336]},1: {'observation': (43.759645, 11.291544),'osmid': [135115743],'edge_osmid': [590848305],'candidates': [(43.75963763247117, 11.291543159878621)],'candidate_type': array([False]),'dists': [0.8220066596419578]},2: {'observation': (43.759671, 11.291162),'osmid': [1366820392, 831342769, 831342769, 245816382],'edge_osmid': [158183875, 160047415, 202760017, 590848305],'candidates': [(43.759700520685946, 11.290803894486569),(43.7596557, 11.290801),(43.7596557, 11.290801),(43.75964691271334, 11.29117208534078)],'candidate_type': array([False, False, False, False]),'dists': [28.94629461607051,29.041910651129065,29.041910651129065,2.798176615616366]},3: {'observation': (43.759677, 11.291148),'osmid': [1366820392, 831342769, 831342769, 245816382],'edge_osmid': [158183875, 160047415, 202760017, 590848305],'candidates': [(43.759700520685946, 11.290803894486569),(43.7596557, 11.290801),(43.7596557, 11.290801),(43.75964691271334, 11.29117208534078)],'candidate_type': array([False, False, False, False]),'dists': [27.7587065301145,27.968156168366924,27.968156168366924,3.864490374081274]},4: {'observation': (43.759691, 11.290932),'osmid': [1366820392, 831342769, 831342769, 1751266336],'edge_osmid': [158183875, 160047415, 202760017, 590848305],'candidates': [(43.759700520685946, 11.290803894486569),(43.7596557, 11.290801),(43.7596557, 11.290801),(43.75965309954146, 11.290924702315552)],'candidate_type': array([False, False, False, False]),'dists': [10.342517462643924,11.229036268613909,11.229036268613909,4.254901893095896]},5: {'observation': (43.779596, 11.254733),'osmid': [1082477038, 1196043488, 699408714, 1082477038],'edge_osmid': [23338921, 24695287, 24933636, 203924197],'candidates': [(43.7796997, 11.2544238),(43.77956558718794, 11.254738857110752),(43.779738600417716, 11.254457384444233),(43.7796997, 11.2544238)],'candidate_type': array([False, False, False, False]),'dists': [27.371092347460355,3.4142911971419823,27.222205203514605,27.371092347460355]},6: {'observation': (43.779583, 11.254295),'osmid': [1082477038, 1082477038, 1082477038, 432026454],'edge_osmid': [23338921, 24695287, 24933636, 203924197],'candidates': [(43.7796997, 11.2544238),(43.7796997, 11.2544238),(43.7796997, 11.2544238),(43.77958438083008, 11.254328000262998)],'candidate_type': array([False, False, False, False]),'dists': [16.59261899959034,16.59261899959034,16.59261899959034,2.6538256098028095]},7: {'observation': (43.779206, 11.253978),'osmid': [1531471656],'edge_osmid': [203924197],'candidates': [(43.77919997631304, 11.254008676575015)],'candidate_type': array([False]),'dists': [2.552298511854619]},8: {'observation': (43.779205, 11.253974),'osmid': [1531471656],'edge_osmid': [203924197],'candidates': [(43.77919997631304, 11.254008676575015)],'candidate_type': array([False]),'dists': [2.8394681876277263]},9: {'observation': (43.778464, 11.253364),'osmid': [568144517, 132324140, 132324140],'edge_osmid': [27317795, 491331618, 915510037],'candidates': [(43.77843868125, 11.25338133125),(43.7782499, 11.2532268),(43.7782499, 11.2532268)],'candidate_type': array([False, False, False]),'dists': [3.14040435143449, 26.231663705314208, 26.231663705314208]}}
'''
4.1 可视化candidate
maps.add_graph(G, plot_nodes=True)
maps.draw_candidates(candidates, 30)
maps



5 创建Trellis图
根据上面的candidates创建相应的trellis
trellis = mpmatching_utils.create_trellis(candidates)
5.1 绘制Trellis图
trellis_draw = visualization.draw_trellis(trellis, figsize=(3, 7))
trellis_draw
每个点的candidate个数和前面candidates中每个点的candidate数目一致

6 进行地图匹配
# Perform the map-matching process
path_prob, predecessor = mpmatching.viterbi_search(G_interp, trellis, "start", "target")
6.1 绘制地图匹配图
# Plot map-matching results
maps.draw_path(G_interp, trellis, predecessor)
maps

相关文章:
python 笔记:PyTrack(将GPS数据和OpenStreetMap数据进行整合)【官网例子解读】
论文笔记:PyTrack: A Map-Matching-Based Python Toolbox for Vehicle Trajectory Reconstruction_UQI-LIUWJ的博客-CSDN博客4 0 包的安装 官网的两种方式我都试过,装是能装成功,但是python import PyTrack包的时候还是显示找不到Pytrack …...
苦中作乐 ---竞赛刷题31-40(15-20)
(一)目录 L1-032 Left-pad L1-033 出生年 L1-034 点赞 L1-035 情人节 L1-039 古风排版 (二)题目 L1-032 Left-pad 根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法…...
100种思维模型之人类误判心理思维模型-49
“我们老得太快,聪明得太迟”——查理芒格。 2005年,81岁的查理芒格认为81岁的他能够比10年前做得更好。他决定对1992年2月2日、1994年10月6日和1995年4月24日的三次演讲稿进行修改,于是就有了这个人类误判心理思维模型——25条人类误判心理学…...
【从零开始学Skynet】实战篇《球球大作战》(十三):场景代码设计(下)
1、主循环 《球球大作战》是一款服务端运算的游戏,一般会使用主循环程序结构,让服务端处理战斗逻辑。如下图所示,图中的 balls 和 foods代表服务端的状态,在循环中执行“ 食物生成”“位置更新”和“碰撞检 测” 等功能࿰…...
2023年虚拟数字人行业研究报告
第一章 行业概况 虚拟数字人指存在于非物理世界中,由计算机图形学、图形渲染、动作捕捉、深度学习、语音合成等计算机手段创造及使用,并具有多种人类特征(外貌特征、人类表演能力、人类交互能力等)的综合产物。虚拟人可分为服务型…...
Oracle 之表的连接类型——舞蹈跳出
嵌套循环(Nested Loops Join) Oracle 中最基本的连接方法,用于处理数据表之间的连接操作。 嵌套循环是通过对其中一个表(外部表)进行全循环操作,然后针对每条记录在另一张表(内部表)…...
深入浅出JS定时器:从setTimeout到setInterval
前言 当谈到 JavaScript 编程语言最基本的概念时,定时器就是一个必须掌握的知识点。在编写网站时,你经常会遇到需要在一定时间间隔内执行一些代码的情况。这时候,JavaScript 定时器就可以派上用场了。 什么是定时器? JS 定时器是…...
CountDownLatch、CyclicBarrier、Semaphore 的原理以及实例总结
文章目录 CountDownLatch、CyclicBarrier、Semaphore 的原理以及实例总结一、CountDownLatch二、CyclicBarrier三、Semaphore总结 CountDownLatch、CyclicBarrier、Semaphore 的原理以及实例总结 在Java多线程编程中,有三种常见的同步工具类:CountDownL…...
企业电子招投标系统源码之了解电子招标投标全流程
随着各级政府部门的大力推进,以及国内互联网的建设,电子招投标已经逐渐成为国内主流的招标投标方式,但是依然有很多人对电子招投标的流程不够了解,在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同࿰…...
SpringCloud之Gateway组件简介
网关的理解 网关类似于海关或者大门,出入都需要经过这个网关。别人不经过这个网关,永远也看不到里面的东西。可以在网关进行条件过滤,比如大门只有对应的钥匙才能入内。网关和大门一样,永远暴露在最外面 不使用网关 前端需要记住每…...
GoNote第三章 主流框架加对比
GoNote第三章 主流框架加对比 Golang主流框架介绍 自从面市以来,Golang成为了程序员在编写API和开发Web服务时的首选之一。近90%的受访者表示会在自己下一组项目中持续使用Golang。与我们熟悉的C和C类似,Go语言也是现有Golang的“灵魂”。而Golang则是…...
Quartz框架详解分析
文章目录 1 Quartz框架1.1 入门demo1.2 Job 讲解1.2.1 Job简介1.2.2 Job 并发1.2.3 Job 异常1.2.4 Job 中断 1.3 Trigger 触发器1.3.1 SimpleTrigger1.3.2 CornTrigger 1.4 Listener监听器1.5 Jdbc store1.5.1 简介1.5.2 添加pom依赖1.5.3 建表SQL1.5.4 配置文件quartz.propert…...
Nginx专题-基于多网卡的主机配置
文章目录 Nginx 基于多网卡的主机实现一、虚拟机前置环境准备ifcfg-ens32配置文件的内容参考ifcfg-ens33配置文件的内容 二、案例演示修改nginx.conf配置文件解决中文乱码 Nginx 基于多网卡的主机实现 一、虚拟机前置环境准备 点击虚拟机右下角的 红色标框按钮,然后…...
4.2和4.3、MAC地址、IP地址、端口
计算机网络等相关知识可以去小林coding进行巩固(点击前往) 4.2和4.3、MAC地址、IP地址、端口 1.MAC地址的简介2.IP地址①IP地址简介②IP地址编址方式③A类IP地址④B类IP地址⑤C类IP地址⑥D类IP地址⑧子网掩码 3.端口①简介②端口类型 1.MAC地址的简介 …...
放弃 console.log 吧!用 Debugger 你能读懂各种源码
很多同学不知道为什么要用 debugger 来调试,console.log 不行么? 还有,会用 debugger 了,还是有很多代码看不懂,如何调试复杂源码呢? 这篇文章就来讲一下为什么要用这些调试工具: console.lo…...
epoll机制解析
一、epoll实现原理 1、实现原理 epoll通过3个方法来实现对句柄的监控操作,要深刻理解epoll,首先得了解epoll的三大关键要素:mmap、红黑树、链表。下面是epoll的框架图,如下: mmap epoll是通过内核与用户空间mmap同一块…...
基于 SpringBoot + Vue 实现的可视化拖拽编辑的大屏项目
今天给小伙伴们分享一个基于 SpringBoot Vue 实现的可视化拖拽编辑的大屏项目; 一、简介 这个是一个开源的一个BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑。 多数据源支持,内置mysql、el…...
我们为什么要写作?
为什么要写书是一个很难回答的问题,因为从不同的角度,会有不同的答案。 最近ChatGPT很火!诸事不决,先问问ChatGPT,看看它是怎么回答的。 ChatGPT给出的答案还是比较全,虽然没有“一本正经的胡说八道”&…...
设计模式:创建者模式 - 建造者模式
文章目录 1.概述2.结构3.实例4.优缺点5.使用场景6.模式扩展 1.概述 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某…...
String a = new String(“abc“); 创建了几个对象?String a = “abc“; 呢?
String a new String(“abc”); 创建了几个对象?String a “abc”; 呢? 答案:String a new String(“abc”); 创建了1个或2个对象;String a “abc”; 创建了0个或1个都对象 String a new String(“abc”); 创建过程 首先在…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
