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”); 创建过程 首先在…...

keepalived+nginx安装
欢迎使用ShowDoc! 1、安装基础包: yum -y install libnl libnl-devel 2、上传包: tar -zxvf keepalived-2.0.20.tar.gz -C /data/imas/base_soft mkdir -p /data/imas/base_soft/keepalived cd /data/imas/base_soft/keepalived-2.0.20 .…...

硬盘格式化工具,强烈推荐这个!
案例:硬盘格式化工具推荐 【我的电脑已经用了好几年了,硬盘存储容量严重不够了,最近想把它格式化,但却不知道怎么操作,大家有什么比较好的硬盘格式化工具可以推荐吗?】 硬盘作为存储设备,我们…...

Python的异常捕获和处理
程序在运行过程当中,不可避免的会出现一些错误,比如:使用了没有赋值过的变量,使用了不存在的索引,一个数字除以0 …… 这些错误在程序中,我们称其为异常。 程序运行过程中,一旦出现异常将会导致…...

oracle学习之rownum和rowid
rownum先百度一波https://www.cnblogs.com/xfeiyun/p/16355165.html rownum是oracle特有的一个关键字。 对于基表,在insert记录时,oracle就按照insert的顺序,将rownum分配给每一行记录,因此在select一个基表的时候,r…...

为什么说过早优化是万恶之源?
Donald Knuth(高德纳)是一位计算机科学界的著名学者和计算机程序设计的先驱之一。他被誉为计算机科学的“圣经”《计算机程序设计艺术》的作者,提出了著名的“大O符号”来描述算法的时间复杂度和空间复杂度,开发了TeX系统用于排版…...

如何用 ModelScope 实现 “AI 换脸” 视频
前言 当下,视频内容火爆,带有争议性或反差大的换脸视频总能吸引人视线。虽然 AI 换脸在市面上已经流行了许久,相关制作工具或移动应用也是数不胜数。但是多数制作工具多数情况下不是会员就是收费,而且替换模板有限。以下在实战的角…...

怎么样成为一名Python工程师?到底要会哪些东西?你会了多少?
目录 重点:爬虫部分项目、源码展示python数据分析可视化大屏看板python爬虫爬取淘宝卤鸭货商品数据python游戏开发python自动化办公 重点: 1、做一名程序员,绝对要耐得住寂寞,并且要一直有点兴趣促进你学习。如果你完全没兴趣&am…...

项目前期1.0
今天是项目的第二天 昨天一顿迷茫,可恶 今天啥也不关先来点基本的构架 #include<queue>//队列 #define FALSE 0 #define TRUE 1 #define ERROR 0 #define OK 1 #define nocnect 999999//未链接的距离 #define maxplace 31//景区的观景点的最大个30数不要0下标的 #defi…...

MySQL语句执行耗时分析
MySQL语句执行耗时分析 MySQL Profile查看SQL执行各阶段耗时Performance Schema查看SQL执行各阶段耗时配置收集哪些用户的SQL执行信息开启SQL执行信息收集的相关特性执行目标SQL获取SQL执行的EVENT_ID获取SQL执行各阶段耗时 MySQL Profile查看SQL执行各阶段耗时 --开启SQL Pro…...

FVM链的Themis Pro(0x,f4) 5日IDO超百万美元,领Filecoin重回高点
交易一直是 DeFi 乃至web3领域最经久不衰的话题,也因此催生了众多优秀的去中心化协议,如 Uniswap 和 Curve。这些协议逐渐成为了整个系统的基石。 在永续合约方面,DYDX 的出现将 WEB2 时代的订单簿带回了web3。其链下交易的设计,仿…...