当前位置: 首页 > news >正文

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代表服务端的状态,在循环中执行“ 食物生成”“位置更新”和“碰撞检 测” 等功能&#xff0…...

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…...

企业电子招投标系统源码之了解电子招标投标全流程

随着各级政府部门的大力推进,以及国内互联网的建设,电子招投标已经逐渐成为国内主流的招标投标方式,但是依然有很多人对电子招投标的流程不够了解,在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…...

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

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...