FMM 笔记:在colab上执行FMM

windows上配置FMM很麻烦,一直没整好,于是尝试了在colab上执行FMM

参考内容:jalal1/fmm_jupyter: Install Fast map matching (FMM) using Jupyter Notebook (github.com)

1 下载数据

# download file from GitHub
! wget https://raw.githubusercontent.com/jalal1/fmm_jupyter/master/data/100_trajectories.txt'''
--2024-02-26 06:55:39--  https://raw.githubusercontent.com/jalal1/fmm_jupyter/master/data/100_trajectories.txt
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 25479 (25K) [text/plain]
Saving to: ‘100_trajectories.txt.1’100_trajectories.tx 100%[===================>]  24.88K  --.-KB/s    in 0.002s  2024-02-26 06:55:39 (14.5 MB/s) - ‘100_trajectories.txt.1’ saved [25479/25479]
'''
!head /content/100_trajectories.txt
'''
Participant2_2019_March2019_Shot0140.jpg:33.509364058739486 -86.78954869584962,33.50978487475548 -86.78860322799623,33.51365016246786 -86.792410503766
Participant2_2019_May2019_Shot0142.jpg:33.51094614347225 -86.78923299192616,33.509571534630986 -86.78998517826301,33.51938097370663 -86.79837386198179,33.50822037079172 -86.82131054613122,33.51100887200205 -86.82332334728943,33.51131870158742 -86.83317062553503
Participant2_2019_November2019_Shot0127.jpg:33.50679887410579 -86.80424681374738,33.51400856087657 -86.80915731051758,33.51335332100002 -86.81056606651244,33.51288259528744 -86.81025033563954
Participant2_2019_November2019_Shot0198.jpg:33.51188921624417 -86.78723301871021,33.509581833511554 -86.79156995015465,33.48366945634628 -86.78709029437786,33.4661537869968 -86.76220036737358
Participant2_2019_November2019_Shot0267.jpg:33.49995290121026 -86.79772386799166,33.50518863176492 -86.80128439451919,33.51110099859621 -86.78887415090277,33.51283854022087 -86.79006323287805
Participant2_2019_October2019_Shot0187.jpg:33.431744652524394 -86.78865692928392,33.41219602478363 -86.80614290578389,33.39369496042756 -86.78484564702798,33.44019957219545 -86.73004735468466,33.432929592595286 -86.71506989666614,33.42762893295855 -86.71850312293473
Participant2_2019_October2019_Shot0260.jpg:33.51279925614481 -86.79913689098413,33.503445430924174 -86.81408181202305,33.520344991596886 -86.82636479131318,33.51047914218212 -86.87755295215898,33.51026907691468 -86.86043852784368
Participant2_2019_October2019_Shot0332.jpg:33.51122148954738 -86.78863346669883,33.504151067453506 -86.80345417768335
Participant2_2019_September2019_Shot0144.jpg:33.51200390143716 -86.78691735071938,33.50896338168748 -86.79209170963797,33.491358620011404 -86.78773912055813,33.48207783715377 -86.81082652404592,33.481094654107274 -86.8041556616955
Participant2_2019_September2019_Shot0216.jpg:33.488167281458445 -86.80800831137027,33.4910545025647 -86.80109811986188,33.4971313972488 -86.8035525597632,33.49960965872394 -86.79837052923209
'''

1.1 预处理数据

import os
raw_trajectories = []with open('/content/100_trajectories.txt', 'r') as f:for line in f:line_values = line.split(":")traj = line_values[1]#去掉trajectories每一行前面的.jpg部分raw_trajectory = []for x in traj.split(','):#每一个逗号分割的是一组经纬度lat, lon = x.split(" ")#将每一个经纬度record 分成经度 & 纬度raw_trajectory.append((float(lat), float(lon)))raw_trajectories.append(raw_trajectory)print("Number of trajectories: ", len(raw_trajectories))
#Number of trajectories:  100

2 在colab上安装FMM

# Install all the requirements with:
! sudo apt-get install libboost-dev libboost-serialization-dev \
gdal-bin libgdal-dev make cmake libbz2-dev libexpat1-dev swig python-dev-is-python3!git clone https://github.com/cyang-kth/fmm.gitimport os
# change working directory
os.chdir("fmm")if not os.path.exists('build'):os.mkdir('build')
# ! mkdir build
os.chdir("build")
# ! cd build
! cmake ..
! make -j4
! sudo make install

2.1 验证是否安装成功

# Verfication of installation
!fmm
'''
[info][fmm_app_config.cpp:49 ] Start reading FMM configuration from arguments
fmm argument lists:
--ubodt (required) <string>: Ubodt file name
--network (required) <string>: Network file name
--network_id (optional) <string>: Network id name (id)
--source (optional) <string>: Network source name (source)
--target (optional) <string>: Network target name (target)
--gps (required) <string>: GPS file name
--gps_id (optional) <string>: GPS id name (id)
--gps_x (optional) <string>: GPS x name (x)
--gps_y (optional) <string>: GPS y name (y)
--gps_timestamp (optional) <string>: GPS timestamp name (timestamp)
--gps_geom (optional) <string>: GPS geometry name (geom)
--gps_point (optional): if specified read input data as gps point, otherwise (default) read input data as trajectory
--output (required) <string>: Output file name
--output_fields (optional) <string>: Output fieldsopath,cpath,tpath,mgeom,pgeom,offset,error,spdist,tp,ep,length,duration,speed,all
-k/--candidates (optional) <int>: Number of candidates (8)
-r/--radius (optional) <double>: search radius (network data unit) (300)
-e/--error (optional) <double>: GPS error (network data unit) (50)
--reverse_tolerance (optional) <double>: proportion of reverse movement allowed on an edge
-l/--log_level (optional) <int>: log level (2)
-s/--step (optional) <int>: progress report step (100)
--use_omp: use OpenMP for multithreaded map matching
-h/--help:print help information
For xml configuration, check example folder
'''
# Change to the parent folder which contains fmm_test.py
if os.getcwd() != "/content/fmm/example/python":os.chdir("/content/fmm/example/python")
os.system('python fmm_test.py')
#256

3 在colab上安装其他需要的包

!pip install osmnx! pip install folium

4 从OSM中提取需要的shp文件

osmnx笔记:从OpenStreetMap中提取点和边的shp文件(FMM文件准备内容)-CSDN博客

import osmnx as ox
import time
from shapely.geometry import Polygon
import os
import numpy as np
from fmm import Network,NetworkGraph,STMATCH,STMATCHConfigdef save_graph_shapefile_directional(G, filepath=None, encoding="utf-8"):if filepath is None:filepath = os.path.join(ox.settings.data_folder, "graph_shapefile")#保存shp文件的默认路径if not filepath == "" and not os.path.exists(filepath):os.makedirs(filepath)#如果文件保存路径不存在,那么创建之filepath_nodes = os.path.join(filepath, "nodes.shp")filepath_edges = os.path.join(filepath, "edges.shp")#点和边shp文件的保存路径gdf_nodes, gdf_edges = ox.utils_graph.graph_to_gdfs(G)#提取graph中的点和边gdf_nodes = ox.io._stringify_nonnumeric_cols(gdf_nodes)gdf_edges = ox.io._stringify_nonnumeric_cols(gdf_edges)# 将点和边的geoDataFrame中非数值的部分转化成字符串gdf_edges["fid"] = np.arange(0, gdf_edges.shape[0], dtype='int')#每一条边一个idgdf_nodes.to_file(filepath_nodes, encoding=encoding)gdf_edges.to_file(filepath_edges, encoding=encoding)#保存边和点的shp文件
bounds = (-86.9671,-86.5901,33.3472,33.6598)x1,x2,y1,y2 = bounds
boundary_polygon = Polygon([(x1,y1),(x2,y1),(x2,y2),(x1,y2)])
G = ox.graph_from_polygon(boundary_polygon, network_type='drive')
#用ox.graph_from_bbox也可以save_graph_shapefile_directional(G, filepath='./network-new')
!mv '/content/network-new' '/content/fmm/example/python/network-new'

5 进行地图匹配(st-matching)

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

def match(path,points):network = Network(path,"fid","u","v")#边的shp文件,后面的三个参数分别是边的id index, source index, target indexgraph = NetworkGraph(network)print (graph.get_num_vertices())#图有多少个点#后续输出的结果是:32303model = STMATCH(network,graph)#创建一个st-matching算法模型对象,使用前面创建的network和graph作为参数wkt  = str(points)#将points参数转换为字符串格式,这里points是以WKT(Well-Known Text)格式表示的点集合'''通过STMATCHConfig为st-matching算法配置对象'''config = STMATCHConfig()config.k = 4#k——candidate的数量config.gps_error = 0.5#gps误差config.radius = 0.4#搜索半径config.vmax = 30#最大速度为30,这个参数用于限制匹配算法中考虑的最大速度config.factor =1.5#st-matching的因子为1.5result = model.match_wkt(wkt,config)#调用STMATCH模型的match_wkt方法,传入WKT格式的点集合和配置对象,进行地图匹配print (type(result))print ("Opath ",list(result.opath))print ("Cpath ",list(result.cpath))print ("WKT ",result.mgeom.export_wkt())'''打印:匹配结果对象的类型——<class 'fmm.PyMatchResult'>原始路径(opath)——Opath  [70255, 48283, 56497]修正路径(cpath)——Cpath  [70255, 48282, 48283, 48621, 48285, 48281, 42749, 40410, 31151, 56497]匹配结果的WKT格式几何(mgeom)——WKT  LINESTRING(-86.789547 33.50936,-86.789539 33.509363,-86.789062 33.509602,-86.788979 33.509635,-86.788736 33.509737,-86.788613 33.509786,-86.788736 33.509737,-86.788979 33.509635,-86.789062 33.509602,-86.789539 33.509363,-86.789591 33.509442,-86.789787 33.509709,-86.789832 33.50977,-86.789942 33.509946,-86.790265 33.510457,-86.790654 33.511026,-86.79103 33.511605,-86.791425 33.512179,-86.791805 33.512752,-86.792107 33.513209,-86.792414 33.513648)'''return result.mgeom.export_wkt()#返回匹配结果的WKT格式几何,这是一个字符串表示的几何形状
def match_trajs(network_path, traj):"""match [traj] on [network_path]. [traj] should be [(lon1, lat1), (lon2, lat2), ...]Output: matched traj as "LINESTRING(-86.797211 33.499194, -86.7973...""""from shapely.geometry import LineStringtraj_ = LineString(traj)#创建一个 LineString 对象 traj_,将输入的轨迹点 traj 转换成LineStringreturn match(network_path, traj_)'''调用之前定义的 match 函数,将路网数据的路径 network_path 和转换后的轨迹几何对象 traj_ 作为参数传入。这个函数的目的是执行地图匹配过程,并返回匹配后的轨迹(作为WKT格式的 LINESTRING)'''
import csv
from shapely.geometry import Point
from collections import defaultdictedges_path = '/content/fmm/example/python/network-new/edges.shp'matched_trajectories = []# !! FMM the first x values !! 
x = 10
#进行多少条轨迹的快速地图匹配for traj in raw_trajectories[:x]:#遍历原始轨迹列表 raw_trajectories 的前 x条轨迹# swap (lat, lon) --> (lon, lat) as FMM requires lon before lattraj_m = [(sub[1], sub[0]) for sub in traj]fmm_traj = match_trajs('/content/fmm/example/python/network-new/edges.shp', traj_m)#使用 match_trajs 函数将转换后的轨迹与路网进行匹配。match_trajs 函数需要路网数据文件的路径和轨迹点列表作为参数。print('fmm_traj',fmm_traj)#fmm_traj LINESTRING(-86.789547 33.50936,-86.789539 33.509363,-86.789062 33.509602,-86.788979 33.509635,-86.788736 33.509737,-86.788613 33.509786,-86.788736 33.509737,-86.788979 33.509635,-86.789062 33.509602,-86.789539 33.509363,-86.789591 33.509442,-86.789787 33.509709,-86.789832 33.50977,-86.789942 33.509946,-86.790265 33.510457,-86.790654 33.511026,-86.79103 33.511605,-86.791425 33.512179,-86.791805 33.512752,-86.792107 33.513209,-86.792414 33.513648)# remove LINESTRING and extra parenthesesfmm_traj = fmm_traj.split("LINESTRING(")[1]fmm_traj = fmm_traj.split(")")[0]traj_list = []#初始化一个空列表 traj_list,用于存储处理后的轨迹点for lon_lat in fmm_traj.split(','):lon__lat = lon_lat.split(" ")# print(lon__lat)if len(lon__lat) == 2:traj_list.append((float(lon__lat[1]), float(lon__lat[0])))else:print("!! lon and lat should be 2 !!", lon__lat)matched_trajectories.append(traj_list)#将处理后的轨迹 traj_list 添加到 matched_trajectories 列表中

6 可视化匹配结果

6.1 单条结果

import random
import foliummap = folium.Map(zoom_start=13, height=700, location=[33.5186, -86.8104])# choose random trajectory to plot
x = random.randrange(len(matched_trajectories))
#随机选择一个id# original trajectory
folium.PolyLine(raw_trajectories[x], color='red', radiuses=2, connect=True).add_to(map)
# matched trajectory
folium.PolyLine(matched_trajectories[x], color='green', radiuses=2, connect=True).add_to(map)map

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

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

相关文章

【ArcGIS】基于DEM/LUCC等数据统计得到各集水区流域特征

基于DEM/LUCC等数据统计得到各集水区流域特征 提取不同集水区各类土地利用类型比例步骤1&#xff1a;划分集水区为独立面单元步骤2&#xff1a;批量掩膜提取得到各集水区土地利用类型比例步骤3&#xff1a;导入各集水区LUCC数据并统计得到各类型占比 提取坡度特征流域面坡度河道…

Mysql 的高可用详解

Mysql 高可用 复制 复制是解决系统高可用的常见手段。其思路就是&#xff1a;不要把鸡蛋都放在一个篮子里。 复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上&#xff0c;备库本身也可以被配置成另外一台服务器的主库。主…

20240226-100. 同一棵树

题目要求 给定两个二叉树 p 和 q 的根&#xff0c;编写一个函数来检查它们是否相同。 如果两个二叉树结构相同并且节点具有相同的值&#xff0c;则认为它们是相同的。 Example 1: Input: p [1,2,3], q [1,2,3] Output: trueExample 2: Input: p [1,2], q [1,null,2] Outp…

数一满分150分总分451东南大学920电子信息通信考研Jenny老师辅导班同学,真题大纲,参考书。

记录用来打破的&#xff0c;信息通信考研Jenny老师2024级辅导班同学&#xff0c;数一满分150分&#xff0c;专业课920专业基础综合143&#xff0c;总分451分&#xff0c;一位及其优秀的本科985报考东南大学信息学院的学生&#xff0c;东南大学920考研&#xff0c;东南大学信息科…

vue - - - - Vue3+i18n多语言动态国际化设置

Vue3i18n多语言动态国际化设置 前言一、 i18n 介绍二、插件安装三、i18n配置3.1 创建i18n对应文件夹/文件3.2 en-US.js3.3 zh-CN.js3.4 index.js 四、 mian.js 引入 i18n配置文件五、 组件内使用六、使用效果 前言 继续【如何给自己的网站添加中英文切换】一文之后&#xff0c…

41.仿简道云公式函数实战-数学函数-SUMIF

1. SUMIF函数 SUMIF 函数可用于计算子表单中满足某一条件的数字相加并返回和。 2. 函数用法 SUMIF(range, criteria, [sum_range]) 其中各参数的含义及使用方法如下&#xff1a; range&#xff1a;必需&#xff1b;根据 criteria 的条件规则进行检测的判断字段。支持的字段…

【Leetcode每日一题】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(难度⭐⭐)(18)

1. 题目解析 Leetcode链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于找到给定目标值所在的数组下标区间&#xff0c;设计一个O(logn)的算法。 2. 算法原…

基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟

原文&#xff1a;基于“python”潮汐、风驱动循环、风暴潮等海洋水动力模拟 前沿 ADCIRC是新一代海洋水动力计算模型&#xff0c;它采用了非结构三角形网格广义波动连续方程的设计&#xff0c;在提高计算精确度的同时还减小了计算时间。被广泛应用于&#xff1a;模拟潮汐和风驱…

2024牛客寒假算法基础集训营2

目录 A.Tokitsukaze and Bracelet B.Tokitsukaze and Cats C.Tokitsukaze and Min-Max XOR D.Tokitsukaze and Slash Draw E and F.Tokitsukaze and Eliminate (easy)(hard) G.Tokitsukaze and Power Battle (easy) 暂无 I.Tokitsukaze and Short Path (plus) J.Tokits…

Qt QWidget 简约美观的加载动画 第五季 - 小方块风格

给大家分享两个小方块风格的加载动画 &#x1f60a; 第五季来啦 &#x1f60a; 效果如下: 一个三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc, char *arg…

CSS 入门手册(二)

目录 12-Overflow 13-下拉菜单 14-提示框 14.1 显示位置&#xff08;左右&#xff09; 14.2 显示位置(上下) 14.3 添加箭头 14.4 淡入效果 15-图片 16-列表 17-表格 17.1 表格宽度和高度 17.2 文字对齐 17.3 表格颜色 18-计数器 19-导航栏 19.1 导航栏UI优化 …

Python基础21 面向对象(4)进阶 类的一些内置方法和属性

文章目录 一、模块调用中attr类函数的运用1、执行模块以外的模块调用2、执行模块调用自己 二、\_\_getattribute__()方法的运行逻辑三、item系列方法四、\_\_str__()方法五、\_\_repr__()方法六、自定制格式化方法七、__slots__属性八、\_\_doc__属性九、__module__和__class\_…

pytorch -- torch.nn下的常用损失函数

1.基础 loss function损失函数&#xff1a;预测输出与实际输出 差距 越小越好 - 计算实际输出和目标之间的差距 - 为我们更新输出提供依据&#xff08;反向传播&#xff09; 1. L1 torch.nn.L1Loss(size_averageNone, reduceNone, reduction‘mean’) 2. 平方差&#xff08;…

如何在 VM 虚拟机中安装 Windows 7 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 没有安装 VM 虚拟机的参考以下文章进行安装&#xff1a; VM 虚拟机安装教程​编辑https://eclecticism.blog.csdn.net/article/details/135713915https://eclecticism.blog.csdn.net/article/details/135713915 二、Windows 7 镜像 点击链接…

C++:类与对象(2)

创作不易&#xff0c;感谢三连&#xff01; 一、六大默认成员函数 C为了弥补C语言的不足&#xff0c;设置了6个默认成员函数 二、构造函数 2.1 概念 在我们学习数据结构的时候&#xff0c;我们总是要在使用一个对象前进行初始化&#xff0c;这似乎已经成为了一件无法改变的…

【论文笔记之 YIN】YIN, a fundamental frequency estimator for speech and music

本文对 Alain de Cheveigne 等人于 2002 年在 The Journal of the Acoustical Society of America 上发表的论文进行简单地翻译。如有表述不当之处欢迎批评指正。欢迎任何形式的转载&#xff0c;但请务必注明出处。 论文链接&#xff1a;http://audition.ens.fr/adc/pdf/2002_…

C# OpenCvSharp 颜色反转

目录 效果 灰度图 黑白色反转 彩色反转 项目 代码 下载 效果 灰度图 黑白色反转 彩色反转 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Te…

电机应用中的大功率电阻器?

在这篇文章中&#xff0c;我们将考虑电机应用中的电阻器。 交流、直流和专用电机用于广泛的应用。一些电机应用相对简单&#xff0c;唯一需要关注的是电机的启动和关闭。在这里&#xff0c;成本、简单性和可靠性是主要问题&#xff0c;而电机控制电阻器是常见的解决方案。 在…

【数据结构】B树,B+树,B*树

文章目录 一、B树1.B树的定义2.B树的插入3.B树的中序遍历 二、B树和B*树1.B树的定义2.B树的插入3.B*树的定义4.B树系列总结 三、B树与B树的应用 一、B树 1.B树的定义 1. 在内存中搜索效率高的数据结构有AVL树&#xff0c;红黑树&#xff0c;哈希表等&#xff0c;但这是在内存…

AutoSAR(基础入门篇)11.5-服务映射(自顶向下)

目录 一、配置Service Needs 二、配置Cfg同步 我们在下一节的实验课中讲解这里的具体配置流程,本节主要讲一下这些配置的大致流程和配置项的作用。NvBlockSwComponents是一个可选项, 我们这里开始不使用NvBlockSwComponents,将我们的Application SWC直接和NvM通过C/S连接起…