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

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

fmm见:论文笔记:Fast map matching, an algorithm integrating hidden Markov model with precomputation_ubodt(upper bounded origin destination table)-CSDN博客

0 导入库 

from fmm import Network,NetworkGraph,FastMapMatch,FastMapMatchConfig,UBODT

1 加载数据(边的shp文件) 【与st-matching部分一致】

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

2  提取路网信息 【与st-matching部分一致】

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  创建UBODT 【FMM独有】(如有ubodt文件,这一步略去)

FMM独特部分,上界起点-终点表(UBODT),详细内容,见论文笔记:Fast map matching, an algorithm integrating hidden Markov model with precomputation_ubodt(upper bounded origin destination table)-CSDN博客

from fmm import UBODTGenAlgorithmubodt_gen = UBODTGenAlgorithm(network,graph)
#创建UBODT生成算法的实例status = ubodt_gen.generate_ubodt("../data/ubodt.txt", 4, binary=False,use_omp=True)
'''
生成UBODT文件,分别设置了
--输出文件路径
--delta (float or int): 搜索半径的阈值,用于限制生成UBODT时考虑的最短路径的最大长度
--binary (bool, optional): 指示输出文件格式是否为二进制。默认为False,表示输出为文本格式。
--use_omp (bool, optional): 指示是否使用OpenMP来并行化UBODT的生成过程。默认为True,允许使用多个CPU核心并行计算,以加速UBODT的生成。print(status)
'''
Status: success
Time takes 0.004 seconds
'''

 ubodt文件内容如下:

pd.read_csv("../data/ubodt.txt",delimiter=';')

 

4 读取ubodt文件

ubodt = UBODT.read_ubodt_csv("../data/ubodt.txt")
ubodt
#<fmm.UBODT; proxy of <Swig Object of type 'std::shared_ptr< FMM::MM::UBODT > *' at 0x7f9f5fe0fea0> >

5  创建FMM模型

传入参数相比于st-matching,多一个ubodt

model = FastMapMatch(network,graph,ubodt)

5.1 定义st-matching模型的配置

k = 4
#candidate 数量
gps_error = 0.5
#gps定位误差
radius = 0.4
#搜索半径fmm_config = FastMapMatchConfig(k,radius,gps_error)

6 单条数据的地图匹配

6.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)'

6.1 进行地图匹配

result = model.match_wkt(wkt,fmm_config)rint("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())
print("Matched point ", result.pgeom.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)
Matched point  LINESTRING(0.20081215 2,1.4426201 2,3 2.1606638,3 2.7103814,3.7087218 3,4 2.6233757)
'''

cpath,opath这些的内容见:FMM 笔记:st-matching(colab上执行)【官方案例解读】-CSDN博客

6.2 输出每个点的匹配结果

candidates = []
for c in result.candidates:candidates.append((c.edge_id,c.source,c.target,c.error,c.length,c.offset,c.spdist,c.ep,c.tp))import pandas as pd
df = pd.DataFrame(candidates,columns=["eid","source","target","error","length","offset","spdist","ep","tp"])
df.head()

DataFrame的列含义如下:

  • eid:边的ID。
  • source:边的起点节点ID。
  • target:边的终点节点ID。
  • error:候选点的误差值。
  • length:边的长度。
  • offset:GPS点在边上的偏移量。
  • spdist:GPS点到边的最短距离。
  • eptp:分别表示匹配点在边上的起始和终止位置,作为归一化的比例值。

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

from fmm import GPSConfig,ResultConfig

7.1 输入文件设置【和st-matching 一致】

输入文件长这样:

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
'''

7.2 输出文件信息【和st-matching一样】

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 
'''

7.3 路网匹配

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

7.4  查看匹配结果

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

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

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

相关文章

分布式事务(7)之Seata简介

一、分布式事务解决方案 2PC即两阶段提交协议&#xff0c;是将整个事务流程分为两个阶段&#xff0c;准备阶段&#xff08;Prepare phase&#xff09;、提交阶段&#xff08;commit phase&#xff09;&#xff0c;2是指两个阶段&#xff0c;P是指准备阶段&#xff0c;C是指提交…

vue2 computed原理,与watch的区别

文章目录 computed实现原理computed与watch的区别computedwatch computed实现原理 源码实现computed 依赖收集&#xff1a;当我们首次访问一个计算属性时&#xff0c;它的 getter 函数会被执行。在 getter 函数执行过程中&#xff0c;会访问它所依赖的响应式数据&#xff0c;这…

智慧医疗时代来临,全视通给大家介绍智慧病房

随着科技的不断发展&#xff0c;智慧医疗已经成为医疗行业的一个重要趋势。智慧医疗技术的应用&#xff0c;不仅提高了医疗服务的效率和质量&#xff0c;也使得患者的就医体验更加舒适和便捷。在智慧医疗时代&#xff0c;智慧病房呼叫系统作为其中的一项重要技术&#xff0c;已…

用html编写的小广告板

用html编写的小广告板 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

springboot003图书个性化推荐系统的设计与实现(源码+调试+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SpringBoot的图书个…

Langchain中向量数据库FAISS的使用

1 第一次存入数据库&#xff1a; from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_community.embeddings import JinaEmbeddings from langchain_community.vectorstores import FAISS fro…

app广播亮暗屏幕监听

一、屏幕亮暗监听 /*** 息亮屏* 广播监听*/private ScreenStatusReceiver mScreenStatusReceiver;private class ScreenStatusReceiver extends BroadcastReceiver {String SCREEN_ON "android.intent.action.SCREEN_ON";String SCREEN_OFF "android.intent.a…

【深度学习】神经网络的学习

文章目录 常用损失函数均方误差函数&#xff08;mean squared error&#xff09;交叉熵误差函数&#xff08;cross entropy error&#xff09;/对数损失函数&#xff08;log loss function&#xff09; 数值微分&#xff08;numerical gradient&#xff09;前向差分&#xff08…

nacos只发现不发布服务fiddler请求转发到本地

https://blog.csdn.net/qq_38826019/article/details/109583854 nacos配置文件参数 spring.cloud.nacos.discovery.register-enabled : false fiddler转发 regex:http://xxx:8080/api/xxx/(?.)$ http://localhost:9209/${param}

2024.2.26

今天又复习了一下熟悉的C语言 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<windows.h>int main() {//数组初始化int n;scanf("%d", &n);int array[500];int i 0;for (i 0; i < n; i){scanf("%…

掌握ChatGPT润色绝技:什么是人工智能写作以及如何使用它来完成写作任务

如对AI写论文感兴趣&#xff0c;欢迎添加作者wx讨论 : ryan_2982 人工智能 (AI) 的出现开创了技术进步的新时代&#xff0c;彻底改变了包括写作和内容创作在内的各个行业。人工智能写作和人工智能提示已成为可以简化和增强写作任务的强大工具。在这篇博文中&#xff0c;我们将…

JAVA讲解算法-排序算法-冒泡排序算法-01

一、定义 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c; 一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已…

matplotlib 入门教程

一. matplotlib 简介 Matplotlib是一个Python 2D绘图库&#xff0c;它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形。 Matplotlib试图让简单的事情变得更简单&#xff0c;让无法实现的事情变得可能实现。 只需几行代码即可生成绘图&#xff0c;直方…

求购EV代码签名证书,看看性价比最优选项要多少钱?

在当今的数字化时代&#xff0c;EV代码签名证书作为一种强化软件安全防线的顶级数字证书&#xff0c;承担着验证软件源码真伪和完整性的重要任务。对于软件开发者和公司来说&#xff0c;购置EV代码签名证书无疑是必不可少的&#xff0c;而其年度费用也成为各方密切关注的核心议…

【计算机网络】DNS/ICMP协议/NAT技术

文章目录 一、DNS(Domain Name System)1.DNS背景2.域名3.浏览器中输入url后,发生的事情 二、ICMP协议1.什么是ICMP协议2.ICM功能3.ICMP的报文格式4.ping命令5.traceroute命令 三、NAT技术1.NAT技术背景2.NAT IP转换过程3.NAPT4.NAT技术的缺陷5.NAT和代理服务器 四、TCP/IP五层模…

【数据结构和算法】链表的简单实现

目录 c版本c语言版 &#x1f431;‍&#x1f680;个人博客https://blog.csdn.net/qq_51000584/ &#x1f431;‍&#x1f464;收录专栏&#xff1a;数据结构和算法 &#x1f431;‍&#x1f453;专栏目标&#xff1a;分享一些学习的代码 &#x1f431;‍&#x1f4bb;作者&…

vue项目中vue.config.js文件的介绍

vue.config.js 是一个可选的配置文件&#xff0c;如果项目的根目录中没有这个文件&#xff0c;则 Vue CLI 会使用默认的配置。这个文件的主要目的是为了让开发者能够调整 Vue CLI 生成的项目的默认配置。 vue.config.js 应该导出一个包含了配置选项的对象。这些配置选项包括但…

React PureComponent 和 React.memo()区别

1 注意 ● PureComponent和memo仅作为性能优化的方式存在 ● 不要依赖它来阻止渲染&#xff0c;会产生BUG ● PureComponnet 和memo 都是通过对 props 值的浅比较来决定该组件是否需要更新的。 2 PureComponent 和React.memo() 区别 PureComponent 和React.memo()都是React优化…

Idea安装gideabrowser插件

Idea安装gideabrowser插件 一、安装二、设置教程 一、安装 gideabrowser链接地址 二、设置教程 在人生的舞台上&#xff0c;奋力拼搏&#xff0c;才能演绎出最精彩的人生之歌。面对挑战和困难&#xff0c;不妥协、不气馁&#xff0c;只争朝夕&#xff0c;方显坚韧与智慧。努…

如何使用Docker部署WBO容器并实现固定公网地址访问本地白板界面

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…