【python】geopandas计算最短路径

15 篇文章 3 订阅
5 篇文章 3 订阅

文章:链接: python geopandas读取gis路网,最找最短路径

该文给出了基本的思路,但是给出的代码只是图片;细节也没有讲清楚。这里进一步补充。

计算路网的起点和终点坐标

结点数据带有id编号

在这里插入图片描述
路网数据带有id编号和长度
在这里插入图片描述
对路网数据进行两次迭代的空间连接(一对多)即可,下面介绍具体思路:
假设道路L,其两端为A、B两点;对L和结点空间连接(一对多),得到两条结果:L(A)、L(B)
对得到的结果再次进行空间连接(一对多),得到四条结果:L(A-A)、L(A-B)、L(B-B)、L(B-A)
再删除掉冗余的L(A-A)、L(B-B)、L(B-A)得到了想要的L(A-B)
在这里插入图片描述
空间连接参数设置如下,进行两次连接,第二次连接的目标要素为第一次空间连接的输出要素
在这里插入图片描述
选择起点终点坐标一样的元素,即删除L(A-A)、L(B-B)
在这里插入图片描述
余下L(A-B)、L(B-A)
在这里插入图片描述
由于L(A-B)、L(B-A)都是代表同一条路,根据道路的ID,删除相同项,余下L(A-B)、L(B-A)中的任一个,可构建无向图
在这里插入图片描述
在这里插入图片描述

绘制地图

读取shp,绘制地图

# -*- coding: utf-8 -*-
"""
Created on Thu Jul 28 17:22:05 2022

@author: xza
"""
import matplotlib.pyplot as plt
import geopandas as gp
import contextily as ctx
import networkx as nx
import pandas as pd
#读取shp文件
roadfile="Road.shp"
pointfile="point.shp"
road_shp = gp.read_file(roadfile).to_crs('EPSG:3857')#变换投影为web墨卡托即EPSG:3857
point_shp = gp.read_file(pointfile).to_crs('EPSG:3857')#变换投影为web墨卡托即EPSG:3857

#显示地图
fig, ax = plt.subplots(figsize=(10,10))
ax = road_shp.plot(ax=ax, alpha=0.1, edgecolor='k')
ax.axis('off')
road_shp.plot(ax=ax,linewidth=1.5,color='black')#alpha设置透明度
point_shp.plot(ax=ax,markersize=8)
ctx.add_basemap(ax, 
                source='https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',
                zoom=12)

在这里插入图片描述

计算最短路径

#计算最短路径
#nx.Graph() 无向图
#nx.DiGraph() 有向图
G=nx.from_pandas_edgelist(road_shp,'Point_x','Point_y',edge_attr=['RoadID','Length'],create_using=nx.Graph())
#起点和终点的结点id
start_node=1342
end_node=2792
path=nx.shortest_path(G,start_node,end_node,weight='Length')

#获取路径(DataFrame格式)
def GetPath(path,road):
    pathroad=pd.DataFrame()
    for i in range(len(path)-1):
        node1=path[i]
        node2=path[i+1]
        r1=road[(road['Point_x']==node1)&(road['Point_y']==node2)]
        r2=road[(road['Point_x']==node2)&(road['Point_y']==node1)]
        pathroad=pathroad.append(r1)
        pathroad=pathroad.append(r2)
    return pathroad

path_road=GetPath(path,road_shp)
#DataFrame格式转为GeoDataFrame
path_road_shp = gp.GeoDataFrame(path_road, geometry=path_road.geometry)

networkx计算的路径,为每个结点的id
在这里插入图片描述
根据结点id找出对应的道路,即已知结点ID:A、B;道路L(A-B)由A-B唯一确定。
在这里插入图片描述

绘制结果图

#绘制结果图
fig, ax = plt.subplots(figsize=(10,10))
ax = road_shp.plot(ax=ax, alpha=0.1, edgecolor='k')
ax.axis('off')
road_shp.plot(ax=ax,linewidth=1.5,color='black')#alpha设置透明度
path_road_shp.plot(ax=ax,linewidth=3,color='r')#alpha设置透明度
ctx.add_basemap(ax, 
                source='https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',
                zoom=12)

在这里插入图片描述
新开通了本人的公众号,欢迎关注:燕南路GISer ,专注GIS干货分享,不定期更新。
主要兴趣:GIS、时空数据挖掘、python、机器学习深度学习
CSDN的部分内容会重写再搬迁到公众号,欢迎关注!
在这里插入图片描述

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 在 Python 中,有许多算法可以用来计算最短路径。其中包括 Dijkstra 算法、A* 算法、Bellman-Ford 算法和 Floyd-Warshall 算法。 Dijkstra 算法是一种贪心算法,用于计算单源最短路径。它适用于边权为非负的图。Dijkstra 算法的时间复杂度为 O(E log V),其中 E 和 V 分别表示边数和顶点数。 A* 算法是一种启发式搜索算法,用于计算单源最短路径。它的优势在于,它可以根据地图信息(例如路线长度、转弯次数等)估算剩余距离,并使用这些信息来更快地找到最短路径。 Bellman-Ford 算法是一种动态规划算法,用于计算单源最短路径。它可以处理边权可以为负的图,但是它的时间复杂度比 Dijkstra 算法差。 Floyd-Warshall 算法是一种动态规划算法,用于计算所有点对之间的最短路径。它的时间复杂度为 O(V^3),其中 V 表示顶点数。 你可以使用 Python 的第三方库,如 NetworkX、igraph 或 Boost.Graph,来轻松实现这些算法。 ### 回答2: Python计算最短路径的算法有很多种,其中最常用的是Dijkstra算法和Floyd-Warshall算法。 Dijkstra算法是一种适用于有向图和带权边的最短路径算法。它通过不断选择当前最短路径长度的顶点来实现,直到找到终点或者所有顶点都被遍历完。算法的基本思想是,从起点开始,逐步确定所有顶点到起点的最短路径,并不断更新路径长度和路径距离。Dijkstra算法能够找到起点到终点的最短路径,并返回路径长度。 Floyd-Warshall算法是一种适用于有向图和带权边的所有最短路径算法。它通过动态规划的思想,逐步计算任意两个顶点之间的最短路径长度。算法的基本思想是,对于每一个顶点对(i,j),在考虑中间节点(1~n)的情况下,取其中路径长度最小的作为最终结果。Floyd-Warshall算法能够找到所有顶点之间的最短路径长度,以及路径信息。 在Python中,可以使用图论库networkx来实现最短路径算法。通过创建有向图,添加带权边,然后调用networkx库中的最短路径函数,即可计算最短路径。例如,可以使用networkx库中的dijkstra_path函数计算Dijkstra算法,或者使用networkx库中的floyd_warshall函数计算Floyd-Warshall算法。 总之,Python提供了丰富的图论库和算法函数,可以方便地计算最短路径。可以根据具体情况选择适合的算法,并结合相应的库函数进行实现。 ### 回答3: Python中有几种常见的计算最短路径的算法,如Dijkstra算法、Bellman-Ford算法和Floyd-Warshall算法。 Dijkstra算法是一种在加权图中计算单个源最短路径的贪心算法。其基本思想是根据起点到各个顶点的最短距离逐步扩展路径,直到达到目标顶点。在Python中,可以使用优先队列来实现Dijkstra算法。 Bellman-Ford算法是一种可以处理有向图和带有负权边的图的单源最短路径算法。该算法通过逐步迭代更新各个顶点的最短距离,直到没有更改为止。在Python中,可以使用邻接表或邻接矩阵来实现Bellman-Ford算法。 Floyd-Warshall算法用于计算所有顶点之间的最短路径。它通过逐步迭代来更新每对顶点之间的最短距离,直到得到所有顶点之间的最短路径。在Python中,可以使用二维数组或矩阵来实现Floyd-Warshall算法。 这些算法在Python中都有对应的实现,可以通过网络搜索相关的库或使用自己实现的代码来计算最短路径。例如,对于Dijkstra算法,可以使用heapq库中的heapq模块来实现优先队列,使用字典来存储顶点和距离的关系。对于Bellman-Ford算法和Floyd-Warshall算法,可以使用二维数组或矩阵来存储顶点之间的距离,并使用循环嵌套来进行更新和迭代。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燕南路GISer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值