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

news2024/10/1 1:18:58

在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 30


graph = 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.coloradmin.cn/o/1472536.html

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

相关文章

MySQL 数据优化技巧:提升百万级数据聚合统计速度

MySQL 数据优化技巧&#xff1a;提升百万级数据聚合统计速度 MySQL 数据优化技巧&#xff1a;提升百万级数据聚合统计速度摘要引言索引优化1. 使用合适的索引类型2. 聚簇索引的应用 查询优化3. 减少数据检索范围4. 避免全表扫描 数据库设计优化5. 合理划分数据表6. 使用分区表 …

nginx设置缓存时间

一、设置缓存时间 当网页数据返回给客户端后&#xff0c;可针对静态网页设置缓存时间&#xff0c;在配置文件内的http段内server段添加location&#xff0c;更改字段expires 1d来实现&#xff1a;避免重复请求&#xff0c;加快访问速度 第一步&#xff1a;修改主配置文件 #修…

面试经典150题【11-20】

文章目录 面试经典150题【11-20】388.O(1) 时间插入、删除和获取随机元素238.除自身以外数组的乘积134加油站135.分发糖果42. 接雨水13.罗马数字12.整数 转 罗马数字58.最后一个单词的长度14.最长公共前缀151.反转字符串中的单词 面试经典150题【11-20】 388.O(1) 时间插入、删…

IO进程:信号灯集

程序代码&#xff1a; sem.h: 1 #ifndef __SEM_H__2 #define __SEM_H__3 4 //创建信号灯集并初始化&#xff0c;semcount表示灯个数5 int open_sem(int semcount);6 7 //申请资源操作&#xff0c;semno表示灯的编号8 int P(int semid,int semno);9 10 //释放资源操作&#xff…

[LWC] Work with Data + Error Handling

目录 Overview Summary Use Cases for Interacting with Salesforce Data Handling Server Errors Sample Code Reference Overview Summary Use Cases for Interacting with Salesforce Data Handling Server Errors Sample Code Prerequisite: 1. Copy the ldsUtils f…

Python进阶学习:json.dumps()和json.dump()的区别

Python进阶学习&#xff1a;json.dumps()和json.dump()的区别 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您…

驻场人员严重划水,愈演愈烈,要请领导出面吗?

你有没有遇到过团队成员偷懒的情况&#xff1f;比如你们一起完成某个项目目标&#xff0c;干着干着你发现&#xff0c;就只有你和几个核心人员比较上心&#xff0c;很多人都在划水。 你可能会觉得这是因为大家工作态度不好&#xff0c;甚至怀疑他们的人品&#xff0c;忍不住想…

js里面有引用传递吗?

一&#xff1a;什么是引用传递 引用传递是相对于值传递的。那什么是值传递呢&#xff1f;值传递就是在传递过程中再复制一份&#xff0c;然后再赋值给变量&#xff0c;例如&#xff1a; let a 2; let b a;在这个代码中&#xff0c;let b a; 就是一个值传递&#xff0c;首先…

【Java程序设计】【C00276】基于Springboot的就业信息管理系统(有论文)

基于Springboot的就业信息管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的就业信息管理系统 本系统分为前台功能模块、管理员功能模块、学生功能模块、企业功能模块以及导师功能模块。 前台功能模块&…

勒索攻击新趋势,DarkSide解密工具

勒索攻击新趋势 2020年通过勒索病毒攻击已经成为网络犯罪分子热崇追捧的一种方式&#xff0c;全球几乎每天都有企业被勒索病毒攻击勒索&#xff0c;而且勒索的金额也越来越高&#xff0c;从几万美元到几千万美元不等&#xff0c;越来越多的黑客组织使用勒索病毒对企业发起攻击…

【python】学习笔记03-循环语句

3.1 whlie循环的基础语法 - while循环的语法格式 - while循环的注意事项 条件需提供布尔类型结果&#xff0c;True继续&#xff0c;False停止 空格缩进不能忘 请规划好循环终止条件&#xff0c;否则将无限循环 """ 演示while循环基础练习题&#xff1a;求1-10…

JSON:简介与基本使用

目录 什么是JSON&#xff1f; JSON的基本结构 JSON的基本使用 在JavaScript中使用JSON 创建JSON对象 解析JSON字符串 生成JSON字符串 在其他编程语言中使用JSON 总结 什么是JSON&#xff1f; JSON&#xff0c;全称为JavaScript Object Notation&#xff0c;是一种轻量…

matlab生成模拟的通信信号

matlab中rand函数生成均匀随机分布的随机数&#xff0c;randn生成正态分布的随机数&#xff1b; matlab来模拟一个通信信号&#xff1b; 通信信号通过信道时&#xff0c;研究时认为它会被叠加上服从正态分布的噪声&#xff1b; 先生成随机信号模拟要传输的信号&#xff0c;s…

C++基础知识(七:多态)

一、多态 常说的多态&#xff0c;是发生在类之间的多态 函数重载(静态多态/编译时多态) 类之间的多态(动态多态/运行时多态) 【1】前提 继承是多态的前提 虚函数 什么是多态&#xff1a;相同的代码&#xff0c;实现不同的功能 【2】函数重写(override) 必须有继承关系父类中必须…

python中的类与对象(2)

目录 一. 类的基本语法 二. 类属性的应用场景 三. 类与类之间的依赖关系 &#xff08;1&#xff09;依赖关系 &#xff08;2&#xff09;关联关系 &#xff08;3&#xff09;组合关系 四. 类的继承 一. 类的基本语法 先看一段最简单的代码&#xff1a; class Dog():d_…

JS防抖函数

场景 频繁触发耗时操作&#xff0c;仅关心最后一次的触发时使用防抖函数 代码 function debounce(fn , delay){let timer;return () > {clearTimeout(timer);timer setTimerout(()>{fn()},delay)} } 详解 触发一次函数&#xff0c;然后执行后续操作 function deboun…

消息中间件之RocketMQ源码分析(十七)

Broker CommitLog索引机制的数据结构 ConsumerQueue消费队列 主要用于消费拉取消息、更新消费位点等所用的索引。源代码参考org.apache.rocketmq.store.ConsumerQueue.该文件内保存了消息的物理位点、消息体大小、消息Tag的Hash值 物理位点:消息在CommitLog中的位点值消息体…

音乐格式转换软件有哪些?5款必备神器

音乐格式转换软件有哪些&#xff1f;音乐&#xff0c;作为人类情感的载体&#xff0c;伴随着我们生活的每一个角落。在享受音乐的同时&#xff0c;我们有时也面临着音乐格式不兼容的问题。不用担心&#xff0c;今天我将为大家揭秘五款音乐格式转换软件&#xff0c;让你的音乐之…

开发一套智慧工地系统需要多久时间?

什么是智慧工地&#xff1f; 智慧工地是智慧地球理念在工程领域的行业具现&#xff0c;是一种崭新的工程全生命周期管理理念。它运用信息化手段&#xff0c;通过三维设计平台对工程项目进行精确设计和施工模拟&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产…

投资黄金在哪里买比较好?

黄金&#xff0c;作为一种传统的避险资产&#xff0c;历来受到投资者的青睐。在全球经济波动的大背景下&#xff0c;黄金的价值愈发凸显。那么&#xff0c;投资黄金在哪里买比较好呢&#xff1f;本文将重点探讨在香港黄金平台投资黄金的优势&#xff0c;并以金田金业为例&#…