FMM 笔记:st-matching(colab上执行)【官方案例解读】

在colab上运行,所以如何在colab上安装fmm,可见FMM 笔记:在colab上执行FMM-CSDN博客

st-matching见论文笔记:Map-Matching for low-sampling-rate GPS trajectories(ST-matching)-CSDN博客

0 导入库

from fmm import Network,NetworkGraph,STMATCH,STMATCHConfig

1 加载数据(边的shp文件)

import geopandas as gpd
shp_path = "../data/edges.shp"
gdf = gpd.read_file(shp_path)
gdf

2  提取路网信息

network = Network("../data/edges.shp")
#通过Network类加载路网数据(edges.shp)print("Nodes {} edges {}".format(network.get_node_count(),network.get_edge_count()))
#Nodes 17 edges 30graph = NetworkGraph(network)
#使用NetworkGraph类基于这个网络创建一个图形(Graph)对象

3  创建ST-matching模型

model = STMATCH(network,graph)
#传入之前创建的网络和图形对象

3.1 定义st-matching模型的配置

k = 4
#candidate 数量
gps_error = 0.5
#gps定位误差
radius = 0.4
#搜索半径
vmax = 30
#速度上限
factor = 1.5
stmatch_config = STMATCHConfig(k, radius, gps_error, vmax, factor)

4 单条数据的地图匹配

4.0 输入数据

输入数据是wkt格式的数据

地理笔记:WKT,WKB,GeoJSON-CSDN博客

wkt ='LINESTRING(0.200812146892656 2.14088983050848,1.44262005649717 2.14879943502825,3.06408898305084 2.16066384180791,3.06408898305084 2.7103813559322,3.70872175141242 2.97930790960452,4.11606638418078 2.62337570621469)'

4.1 进行地图匹配

result = model.match_wkt(wkt,stmatch_config)
print("Matched path: ", list(result.cpath))
#Matched path:  [8, 11, 13, 18, 20, 24]
'''
这个输出显示的是整个轨迹匹配后形成的路径上的边的序列。
它代表了轨迹匹配算法认为GPS轨迹所经过的路网中的边的集合。
如果轨迹沿着某些边连续移动,这些边会在Matched path中按顺序出现。但重要的是,Matched path中不会重复相同的边,即使实际的GPS轨迹在同一条边上有多个点。
它更侧重于表示轨迹的整体路线,而不是每个点的具体匹配情况。
'''

cpath 联想为continuous path ,即“连续路径”

print("Matched edge for each point: ", list(result.opath))
#Matched edge for each point:  [8, 11, 18, 18, 20, 24]
'''
这个输出则提供了轨迹中每个单独点匹配到的边的详细信息。
即使多个连续的点匹配到了同一条边,这里也会为每个点重复显示那条边的ID
'''

opath, 联想为Original Path,即“原始路径”

print("Matched edge index ",list(result.indices))
#Matched edge index  [0, 1, 3, 3, 4, 5]
'''
这是匹配到的边的索引列表,表示每个匹配点在匹配路径中的位置
(和Matched edge for each point 表示的是一个意思)例如,如果输出是[0, 1, 3, 3, 4, 5],这意味着第一个点匹配到了cpath中第一个边(索引0),
第二个点匹配到了第二个边(索引1),接下来两个点都匹配到了第四个边(索引3),依此类推
'''
print("Matched geometry: ",result.mgeom.export_wkt())
#Matched geometry:  LINESTRING(0.20081215 2,1 2,2 2,3 2,3 3,4 3,4 2.6233757)
'''
匹配得到的路径的几何形状,以WKT(Well-Known Text)格式表示
'''print("Matched point ", result.pgeom.export_wkt())
#Matched point  LINESTRING(0.20081215 2,1.4426201 2,3 2.1606638,3 2.7103814,3.7087218 3,4 2.6233757)
'''
表示的是输入的GPS轨迹上的点如何被匹配到了道路网络上
'''

 mgeom——matched geometry

pgeom——projected geometry

5 带timestamp的数据的地图匹配

from fmm import Trajectory,wkt2linestring

5.1  获得轨迹 & 轨迹的timestamp

5.1.1 轨迹wkt转化成LineString

还是之前的那条轨迹的wkt,先转换为Linestring

line = wkt2linestring(wkt)
line
#<fmm.LineString; proxy of <Swig Object of type 'FMM::CORE::LineString *' at 0x7f9f5fe0fa50> >

5.1.2 为轨迹每一个点添加时刻

traj_id = 1
timestamps = []
for i in range(line.get_num_points()):timestamps.append(i)
traj = Trajectory(traj_id,line,timestamps)
traj
#<fmm.Trajectory; proxy of <Swig Object of type 'FMM::CORE::Trajectory *' at 0x7f9f98e0fa80> >

5.2 进行匹配

可以说前面虽然设置了stmatch的vmax,但是那个限制其实是用不上的

result = model.match_traj(traj,stmatch_config)
print("Matched path: ", list(result.cpath))
print("Matched edge for each point: ", list(result.opath))
print("Matched edge index ",list(result.indices))
print("Matched geometry: ",result.mgeom.export_wkt())
'''
Matched path:  [8, 11, 13, 18, 20, 24]
Matched edge for each point:  [8, 11, 18, 18, 20, 24]
Matched edge index  [0, 1, 3, 3, 4, 5]
Matched geometry:  LINESTRING(0.20081215 2,1 2,2 2,3 2,3 3,4 3,4 2.6233757)
'''

6 将一个文件中的轨迹分别进行匹配,并输出到另一个文件中

from fmm import GPSConfig,ResultConfig

6.1 输入文件设置

输入文件长这样:

gpd.read_file("../data/trips.csv")

# Define input data configuration
input_config = GPSConfig()
input_config.file = "../data/trips.csv"
input_config.id = "id"print(input_config.to_string())
'''
[40]
0 秒
print(input_config.to_string())
gps file : ../data/trips.csv
id column : id
geom column : geom
timestamp column : timestamp
x column : x
y column : y
GPS point : false
'''

6.2 输出文件信息

result_config = ResultConfig()
result_config.file = "../data/mr.txt"
result_config.output_config.write_opath = True
#结果文件将包含匹配的路径信息(每个单独点匹配到的边的信息)
print(result_config.to_string())
'''
Result file : ../data/mr.txt
Output fields: opath cpath mgeom 
'''

6.3 路网匹配

status = model.match_gps_file(input_config, result_config, stmatch_config)print(status)
'''
Status: success
Time takes 0.003 seconds
Total points 17 matched 17
Map match speed 5666.67 points/s 
'''

6.4  查看匹配结果

import pandas as pd
pd.read_csv("../data/mr.txt",delimiter=';')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为畅享 60X 到底值得入手吗?这4点你必须要知道

作为一款主打千元机市场的机型&#xff0c;华为畅享 60X 到底怎么样&#xff1f;是否值得入手&#xff1f; 可以负责任的说华为畅享 60X 是一款性价比超高的手机&#xff0c;凭借其出色的硬件配置和适中的价格&#xff0c;不仅拥有华为完整的鸿蒙生态&#xff0c;同时它超大屏幕…

【DL】深度学习之语音识别

目录 1 核心概念 2 安装依赖库 3 实践 语音信号处理&#xff08;Speech Signal Processing&#xff09;简称语音处理。 语音识别&#xff08;ASR&#xff09;和自然语言处理&#xff08;NLP&#xff09;&#xff1a;语音识别就是将语音信号转化成文字文本&#xff0c;简单实…

Spring-Cloud-Gateway集成Sentinel限流

1&#xff09;gateway添加sentinel相关依赖 <spring-cloud.version>2021.0.1</spring-cloud.version> <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version><dependencies><!--gateway--><dependency><gro…

面试redis篇-11Redis集群方案-哨兵

Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下: 监控:Sentinel 会不断检查您的master和slave是否按预期工作自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主通知:Sentinel充当…

POST参数里加号+变成空格的问题处理

今天遇到个这样的问题&#xff0c;从前端传到后端的加密报文&#xff0c;里面包含了号&#xff0c;但在后端日志输出看出&#xff0c;变成空格。这个是由于经过RSA加密后引起的 解决办法&#xff1a; 1.前端转码&#xff1a;使用encodeURIComponent对参数进行转码 2.后端解码…

【初始RabbitMQ】高级发布确认的实现

在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投递呢&#xff1f; …

python Matplotlib Tkinter-->tab切换2

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.ttk as ttk# 创建自定义工具栏类 c…

面试redis篇-12Redis集群方案-分片集群

原理 主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决&#xff1a; 海量数据存储问题高并发写的问题 使用分片集群可以解决上述问题&#xff0c;分片集群特征&#xff1a; 集群中有多个master&#xff0c;每个master保存不同数据每个master都可以有…

10 Redis之SB整合Redis

7. SB整合Redis Spring Boot 中可以直接使用 Jedis 实现对 Redis 的操作&#xff0c;但一般不这样用&#xff0c;而是使用 Redis操作模板 RedisTemplate 类的实例来操作 Redis。 RedisTemplate 类是一个对 Redis 进行操作的模板类。该模板类中具有很多方法&#xff0c;这些方…

【手机端测试】adb基础命令

一、什么是adb adb&#xff08;Android Debug Bridge&#xff09;是android sdk的一个工具 adb是用来连接安卓手机和PC端的桥梁&#xff0c;要有adb作为二者之间的维系&#xff0c;才能让用户在电脑上对手机进行全面的操作。 Android的初衷是用adb这样的一个工具来协助开发人…

el-submenu is-opened 展开/闭合;el-submenu is-opened保持一个子菜单的展开控制

写了个mes系统目录 点击子菜单展开后&#xff0c;上一级菜单没有默认关闭。主流后台管理系统大部分都是保持一个子菜单关闭状态、 问度娘无果后&#xff0c;查询官网&#xff0c;一个属性搞定。 unique-opened 是否只保持一个子菜单的展开 加在 <el-menu 组件上即可 完整代…

LeetCode_Java_动态规划系列(1)(题目+思路+代码)

目录 斐波那契类型 746.使用最小花费爬楼梯 矩阵 120. 三角形最小路径和 斐波那契类型 746.使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。…

Leetcode202. 快乐数中为什么一定会循环?

他提示中是2的31次方&#xff1a; 相当于我就当它10个9&#xff0c;那么通过一次变换变成了81*10 810&#xff0c;所以他以后最后的范围也只能在[0,810]之间&#xff0c;810是最大的&#xff0c;然后任意一个数x&#xff0c;通过810次变换都不重复&#xff0c;那么811次变换那…

GIS之深度学习01:检测电脑是否包含英伟达GPU

GPU&#xff08;Graphics processing unit&#xff09;&#xff0c;中文全称图形处理器&#xff0c;我们听说的更多的CPU全称是central processing unit&#xff0c;中央处理器。研究深度学习和神经网络大都离不开GPU&#xff0c;在GPU的加持下&#xff0c;我们可以更快的获得模…

【QT+QGIS跨平台编译】之五十二:【QGIS_CORE跨平台编译】—【qgsexpressionlexer.cpp生成】

文章目录 一、Flex二、生成来源三、构建过程一、Flex Flex (fast lexical analyser generator) 是 Lex 的另一个替代品。它经常和自由软件 Bison 语法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用 C 语言写成。 “flex 是一个生成扫描器的工具,能够识别文本中…

Redis高可用三主三从集群部署(三种方式部署/18个节点的大集群)

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容使用宝塔面板搭建集群规划配置验证 使用docker搭建使用脚本搭建规划防火墙端口配置脚本redis.conf配置文件执行过程 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff…

c入门第二十五篇: 学生成绩管理系统优化(多线程)

前言 程夏&#xff1a;“你这个系统不好用啊&#xff1f;连上之后没有反应&#xff0c;是不是挂了&#xff1f;” 师弟&#xff1a;“不应该啊&#xff0c;我这边好好的&#xff0c;可以正常操作的。” 程夏&#xff1a;“我这边有问题&#xff0c;大概率还是你系统问题。你…

C语言标准库函数qsort( )——数据排序

大家好&#xff01;我是保护小周ღ&#xff0c;本期为大家带来的是深度解剖C语言标准库函数 qsort()&#xff0c;qsort()函数他可以对任意类型的数据排序&#xff0c;博主会详细解释函数使用方法&#xff0c;以及使用快速排序的左右指针法模拟实现函数功能&#xff0c;这样的排…

IT廉连看——C语言——分支语句

IT廉连看—分支语句 一、什么是语句 C语句可分为以下五类&#xff1a; 表达式语句 函数调用语句 控制语句 复合语句 空语句 本周后面介绍的是控制语句。 控制语句用于控制程序的执行流程&#xff0c;以实现程序的各种结构方式&#xff0c;它们由特定的语句定义符组成&…

Delphi 报错 Type androidx.collection.ArraySet is defined multiple times

Delphi 11 建立一个新的 Multi-Device Application 编译成app的时候报错 报错信息 [PAClient Error] Error: E7688 Unable to execute "E:\Program\Java\jdk1.8.0_301\bin\java.exe" -cp "e:\program\embarcadero\studio\22.0\bin\Android\r8-3.3.28.jar"…