利用OSMnx求路网最短路径并可视化(二)

书接上回,为了增加多路径的可视化效果和坐标匹配最近点来实现最短路可视化,我们使用图形化工具matplotlib结合OSMnx的绘图功能来展示整个路网图,并特别高亮显示计算出的最短路径。

多起终点最短路路径并计算距离和时间

完整代码#运行环境 Python 3.11

import operator
import igraph as ig  # 引入igraph库,用于图的复杂网络分析与可视化
import networkx as nx  # 引入networkx库,用于构建与操作复杂网络
import matplotlib.pyplot as plt  # 引入matplotlib.pyplot,用于数据可视化
import osmnx as ox  # 引入osmnx库,用于处理OpenStreetMap数据
from osmnx import routing  # 从osmnx导入路由模块
from pyproj import CRS  # 引入pyproj库中的CRS类,用于处理坐标参考系统# 设置matplotlib的字体,以便支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体# 设置权重属性为道路长度,用于后续路径计算
weight = "length"# 定义绘制地图的地点,本例中为厦门思明区
place = "Siming Qu, Xiamen,Fujian,China"# 使用osmnx的graph_from_place函数,根据地点和驾驶网络类型创建图形G
G = ox.graph_from_place(place, network_type="drive")# 保存原始的OSM节点ID,并将G中的节点标签转换为整数,因为igraph需要整数索引
osmids = list(G.nodes)
G = nx.relabel.convert_node_labels_to_integers(G)  # 节点重标记
osmid_values = {old_id: new_id for old_id, new_id in zip(G.nodes, osmids)}  # 创建旧ID到新ID的映射
nx.set_node_attributes(G, osmid_values, "osmid")  # 将OSM ID作为属性添加回每个节点# 在igraph中创建一个新图G_ig,复制G中的所有节点和边,并设定边的权重及节点的OSM ID属性
G_ig = ig.Graph(directed=True)
G_ig.add_vertices(G.nodes)  # 添加节点
G_ig.add_edges(G.edges())  # 添加边
G_ig.vs["osmid"] = osmids  # 设置节点的OSM ID属性
G_ig.es[weight] = list(nx.get_edge_attributes(G, weight).values())  # 设置边的权重属性# 使用osmnx绘制原始地图,但不显示,仅用于保存图像文件
fig, ax = ox.plot_graph(G, show=False, close=True, edge_color="#999999", edge_alpha=0.5, node_size=0, figsize=(10, 10))# 为图中的边补充缺失的速度信息,并据此计算通行时间
G = ox.add_edge_speeds(G)
G = ox.add_edge_travel_times(G)# 定义三个起始和结束节点对,用于计算最短路径
orig_dest_pairs = [(list(G)[10], list(G)[114]), (list(G)[0], list(G)[1123]), (list(G)[100], list(G)[2100])]
# 计算每一对节点间的最短路径,优化目标为通行时间
routes = [ox.shortest_path(G, orig, dest, weight="travel_time") for orig, dest in orig_dest_pairs]# 使用不同的颜色绘制这三条路径在地图上
route_colors = ["r", "y", "c"]
fig, ax = ox.plot_graph_routes(G, routes, route_colors=route_colors, route_linewidth=6, node_size=0, show=False, close=False)# 定义新函数calculate_path_stats,用于获取路径的GeoDataFrame,转换坐标系后计算总距离和通行时间
def calculate_path_stats(route, G):gdf_route = routing.route_to_gdf(G, route)  # 将路径转化为GeoDataFrameproj_crs = CRS.from_epsg(3857)  # 定义适合测量距离的Web Mercator坐标系gdf_route_proj = gdf_route.to_crs(proj_crs)  # 将GeoDataFrame投影到新坐标系distance = gdf_route_proj.length.sum()  # 计算路径总长度travel_time = gdf_route['travel_time'].sum()  # 计算路径总通行时间return distance, travel_time# 应用新函数计算并打印每条路径的总距离和通行时间
stats = {f"Route {i+1}": calculate_path_stats(route, G) for i, route in enumerate(routes)}
for i, (route_name, (distance, travel_time)) in enumerate(stats.items(), start=1):print(f"{route_name}: 距离 = {distance:.2f} 米, 通行时间 = {travel_time:.2f} 秒")# 显示最终的地图,包含三条计算出的最短路径
plt.title('节点间最短路径')
plt.axis('off')  # 隐藏坐标轴以聚焦于路径
plt.show()

多起终点最短路路径可视化展示;

计算出最短路距离和通行时间;

任意二点坐标最短路

路网底图和出行类型需要改的话改这里,出行方式包括'walk'、bike'、'drive';

G_nx = ox.graph_from_place("Siming Qu, Xiamen,Fujian,China", network_type="drive")

需要调整坐标的话改这个就好,坐标用的wgs84,可以用这个直接拾取新的坐标地图坐标系转换 - 在线工具 (tool.lu);

# 定义起点和终点的经纬度坐标
origin = (24.463087, 118.092150)  # 起点坐标
destination = (24.477719, 118.138935)  # 终点坐标

完整代码#运行环境 Python 3.11

import osmnx as ox  # 导入osmnx库,用于空间网络分析和可视化
import networkx as nx  # 导入networkx库,用于图论计算# 使用osmnx.graph_from_place函数,根据地点名称和道路类型创建路网图
# 参数是地点名称(厦门市思明区)和网络类型(驾驶道路)
G2 = ox.graph_from_place("Siming Qu, Xiamen,Fujian,China", network_type="drive")# 定义起点和终点的经纬度坐标
origin = (24.463087, 118.092150)  # 起点坐标
destination = (24.477719, 118.138935)  # 终点坐标# 使用ox.distance.nearest_nodes函数,找到离起点和终点最近的路网图中的节点
# 注意:经纬度顺序在函数调用中是(y, x),即先经度后纬度,与中国常用的坐标表示相反
origin_node = ox.distance.nearest_nodes(G2, origin[1], origin[0])  # 起点最近节点
destination_node = ox.distance.nearest_nodes(G2, destination[1], destination[0])  # 终点最近节点# 计算路网图中从起点节点到终点节点的最短路径
route = ox.shortest_path(G2, origin_node, destination_node)# 使用osmnx.plot_graph_route函数绘制路网图,并突出显示计算出的最短路径
# 参数包括路网图G2、最短路径route、路径的颜色、节点的大小(设置为0以不显示节点)
fig, ax = ox.plot_graph_route(G2, route, route_color="c", node_size=0)

二点坐标最短路结果如下图所示;

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

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

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

相关文章

《昇思25天学习打卡营第24天|基于MindSpore通过GPT实现情感分类》

基于MindSpore通过GPT实现情感分类 %%capture captured_output # 实验环境已经预装了mindspore2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mind…

自动化测试 pytest 中 scope 限制 fixture使用范围!

导读 fixture 是 pytest 中一个非常重要的模块,可以让代码更加简洁。 fixture 的 autouse 为 True 可以自动化加载 fixture。 如果不想每条用例执行前都运行初始化方法(可能多个fixture)怎么办?可不可以只运行一次初始化方法? 答&#xf…

C语言进阶 11.结构体

C语言进阶 11.结构体 文章目录 C语言进阶 11.结构体11.1. 枚举11.2. 结构类型11.3. 结构与函数11.4. 结构中的结构11.5. 类型定义11.6. 联合11.7. PAT11-0. 平面向量加法(10)11-1. 通讯录的录入与显示(10) 11.1. 枚举 常量符号化: 用符号而不是具体的数字表示程序中的数字 cons…

【C++深度探索】AVL树与红黑树的原理与特性

🔥 个人主页:大耳朵土土垚 🔥 所属专栏:C从入门至进阶 这里将会不定期更新有关C/C的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 前言 前…

渣土车与搅拌车安全问题解析及智能监控解决方案

一、背景分析 近年来,渣土车在货物运输中由于超载超速、违规驾驶、车辆盲区过大等问题导致的事故频发,严重影响了人们的生命财产安全。而搅拌车作为一种特殊的运输车辆,在混凝土输送过程中也存在类似的隐患。针对这些问题,对搅拌…

多维矩阵乘积运算和对应的广播机制

神经网络中的多维矩阵乘积运算: 遵循的原则是: 两张量前两维度应该是相同的,如果不同则其中一张量维度为1。 如果有论文中有遇到矩阵乘积的两项维度不一致,那就考虑它计算时是使用了广播机制(如YOLACT)。…

谁说只有车载HMI界面?现在工业类的HMI界面UI也崛起了

谁说只有车载HMI界面?现在工业类的HMI界面UI也崛起了 引言 艾斯视觉作为行业ui设计和前端开发领域的从业者,其观点始终认为:工业自动化和智能化水平不断提高,人机界面(Human-Machine Interface,简称HMI&a…

Lombok的认识

Lombok的作用 Lombok是一个Java库,它可以通过简单的注解形式来帮助开发人员简化Java代码的编写,特别是减少模板代码的书写。具体来说,Lombok的主要作用包括: 减少模板代码:Lombok可以通过注解自动生成getter、setter、…

QT opencv常用代码备忘

最近在了解qt opencv的一些用法,把常用的代码记下来方便需要时复制使用 在默认.pro文件加入opencv包含路径和库文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecate…

网络钓鱼抓肉鸡实验

实验背景 网络钓鱼,攻击一台服务器或普通主机时,很可能会将这台服务器或主机变成“傀儡机”,帮助它攻击其它的主机,以达到窃取更多信息、组建僵尸网络、DDOS攻击等目的,危害性极大 其中僵尸网络(Botnet&a…

运维锅总详解NFS

NFS是什么?如何对NFS进行部署及优化?NFS工作流程是什么?NFS的性能及优缺点是什么?NFS发展历史又是怎样的?希望本文能帮您解答这些疑惑! 一、NFS简介 NFS (Network File System) 是由 Sun Microsystems 在…

rem实现屏幕适配(jQuery)

一、rem换算 1.根据视口宽度动态计算字体大小,如果宽度大于750px,则将字体大小设置为100px,否则按比例缩小。 tips:使用时记得引入jQuery.js // 在文档加载完成后执行函数,确保DOM已经准备就绪$(function () {// 定义一个自执行…

二叉树详解-第四篇 二叉树链式结构的实现

目录 1.二叉树的遍历 1.1前序遍历: 1.2 中序遍历: 1.3 后序遍历: 2.二叉树链式结构的实现 2.1 Tree.h 2.2 Tree.cpp 2.2.1 前序遍历 void PreOrder(TNode* Root) 2.2.2 中序遍历 void InOrder(TNode* Root) 2.2.3 后序遍历 void Bac…

【Python实战因果推断】58_因果推理概论8

目录 Identifying the Treatment Effect The Independence Assumption Identification with Randomization Identifying the Treatment Effect 现在你已经理解了问题所在,接下来该看看解决方案(至少是一个解决方案)了。识别(i…

聊一聊知识图谱结合RAG

因为最近在做一些关于提高公司内部使用的聊天机器人的回答准确率,并且最近微软官方也是开源了一下graphrag的源码,所以想聊一聊这个知识图谱结合rag。 rag在利用私有数据增强大模型回答的领域是一种比较典型的技术,也就是我们提出问题的时候&…

网站漏洞扫描软件Burp suite和Xray安装应用及联合使用

目录 1、网站漏洞扫描软件应用-Burp suite 01 burp 扫描工具使用介绍: 02 burp 扫描工具安装过程: 1)获取扫描工具程序包 2)安装部署扫描工具 3)bp安装完毕的基础设置: 3.1)抓取浏览器访…

免费使用正版的Typora教程

1.来到Typora官网下载安装。 Typora官网: https://typoraio.cn/ 2.激活主程序 编辑修改Typora安装目录下文件 下面展示文件目录路径 : D:\SoftWare\Typora1.9.5\resources\page-dist\static\js\LicenseIndex.180dd4c7.4da8909c.chunk.js查找:e.hasAc…

huggingface里的模型如何下载呢?

HF-Mirror加速访问Hugging Face的门户。作为一个公益项目,我们致力于提供稳定、快速的镜像服务,帮助国内用户无障碍访问Hugging Face的资源。https://hf-mirror.com/ pip install -U huggingface_hub export HF_ENDPOINT=https://hf-mirror.com huggingface-cli download

别再浪费时间,快速实施项目管理软件的技巧

国内外主流的10款项目进度管理软件对比:PingCode、Worktile、蓝凌OA、用友、泛微OA、飞书、Asana、Trello、Smartsheet、Jira。 在快节奏的商业环境中,有效地管理项目进度常常是团队成功与否的关键。许多团队面临着项目管理过于复杂,难以迅速…

04 卷积神经网络

目录 1. 基本概念 1.1 卷积神经网络 1.2 卷积 1.3 汇聚(池化) 2. CNN网络架构及参数学习 2.1 网络架构 2.2 参数学习 3. 典型的卷积神经网络 3.1 LeNet-5 3.2 AlexNet 3.3 Inception网络 3.4 残差网络 4. 其他卷积方式 1. 基本概念 1.1 …