首页 > 编程问答 >使用 openstreetmap 数据创建行人图的左侧和右侧

使用 openstreetmap 数据创建行人图的左侧和右侧

时间:2024-07-21 01:49:27浏览次数:9  
标签:python python-3.x graph openstreetmap osmnx

我正在尝试通过 python 使用 openstreetmap 数据创建行人图。该图是使用 OSMnx 库创建的。每条边代表每条路,但行人实际上可以走在道路的右侧或左侧。我需要有左侧和右侧来获取交叉节点并将它们相互连接。 我尝试将左右两侧的边缘分开,但没有成功。

你们中有人有任何经验或知道如何做到这一点吗?或者如果有一个图书馆或立交桥查询可以简化这个过程怎么办?


当然可以,以下是如何使用 OSMnx 和 NetworkX 在 Python 中为行人创建“左转”和“右转”图形表示的分步指南。

1. 安装必要的库:

pip install osmnx networkx geopandas

2. 导入库:

import osmnx as ox
import networkx as nx

3. 下载 OpenStreetMap 数据:

使用 osmnx 下载感兴趣区域的街道网络。使用 ox.graph_from_place ox.graph_from_bbox 。请务必指定 network_type="walk" 以仅获取适合行人的道路。

# 通过地点名称下载
place_name = "埃菲尔铁塔,巴黎,法国"
graph = ox.graph_from_place(place_name, network_type='walk')

# 通过边界框下载(南、北、西、东)
# bounds = (48.855, 48.865, 2.285, 2.295) 
# graph = ox.graph_from_bbox(*bounds, network_type='walk')

4. 创建左右图:

我们将创建原始图形的副本,并添加属性来区分左侧和右侧。

# 创建左右图的副本
graph_left = graph.copy()
graph_right = graph.copy()

# 为左右两侧添加属性
for u, v, data in graph.edges(data=True):
    data['side'] = 'left'  # 对于左图,所有边最初都在左侧
    graph_left[u][v][0]['side'] = 'left' 

    data['side'] = 'right' # 对于右图,所有边最初都在右侧
    graph_right[u][v][0]['side'] = 'right' 

5. 确定路口节点:

路口是度数大于 2 的节点(意味着它们连接到 2 条以上的边)。

intersections = [node for node in graph.nodes() if graph.degree(node) > 2]

6. 连接交叉路口处的左右两侧:

对于每个交叉路口,我们会创建连接左右两侧边缘的新边缘。这代表了人行横道。

for intersection in intersections:
    # 获取与该交叉路口相邻的所有边
    edges = list(graph.edges(intersection, keys=True))

    # 为每条边的组合创建连接边
    for i in range(len(edges)):
        for j in range(i + 1, len(edges)):
            u1, v1, k1 = edges[i]
            u2, v2, k2 = edges[j]

            # 确保我们连接的是不同的边
            if k1 != k2:
                # 添加一条从左侧到右侧的边
                graph_left.add_edge(v1 if u1 == intersection else u1, 
                                   v2 if u2 == intersection else u2, 
                                   key=(k1, k2),
                                   side='crossing',
                                   length=1)  # 假设人行横道的长度为 1

                # 添加一条从右侧到左侧的边
                graph_right.add_edge(v2 if u2 == intersection else u2, 
                                    v1 if u1 == intersection else u1, 
                                    key=(k2, k1),
                                    side='crossing',
                                    length=1)

现在有了两个图形: graph_left graph_right ,它们分别表示人行道的左侧和右侧。 side 属性指示边是在道路的左侧、右侧还是人行横道(“交叉路口”)。

7. 使用左右图:

可以将这些图形用于各种行人路径分析任务,例如:

  • 查找最短路径: 使用 networkx shortest_path 函数,并指定 weight 参数(例如, weight='length' )。
  • 计算距离矩阵: 使用 networkx 中的 all_pairs_shortest_path_length 等函数。
  • 可视化: 使用 osmnx plot_graph 函数可视化图形,可以使用 edge_color 等参数突出显示左右两侧。

其他注意事项:

  • 此方法假设所有道路都有两侧可供步行。对于单行道或没有明确人行道的道路,可能需要调整逻辑。
  • 人行横道的长度设置为 1。可以根据人行横道的实际宽度或其他因素来调整此值。
  • 可以使用 osmnx networkx 中的其他属性和函数来增强图形并执行更高级的分析。

通过这种方法,可以更真实地表示人行道网络,并将此信息用于各种基于行人的应用程序。

标签:python,python-3.x,graph,openstreetmap,osmnx
From: 78773504

相关文章

  • 有人可以解决我的代码中的问题吗?而且我无法在我的电脑上安装 nsetools。如何在 python
    从nsetools导入Nseimportpandasaspdnse=Nse()all_stock_codes=nse.get_stock_codes()companies_with_low_pe=[]对于all_stock_codes中的代码:如果代码=='符号':继续尝试:stock_quote=nse.get_quote(代码)pe_ratio=stock_quote.get('priceT......
  • 将 python 脚本的 stdin 重定向到 fifo 会导致 RuntimeError: input():lost sys.stdin
    我有这个python脚本,它的作用是充当服务器,它从重定向到fifo的stdin读取命令:test.py:whileTrue:try:line=input()exceptEOFError:breakprint(f'Received:{line}')在bash中运行命令:mkfifotestfifotest.py<testfifo......
  • Python/Flask mysql 游标:为什么它不起作用?
    fromflaskimportFlaskfromflask_mysqldbimportMySQLapp=Flask(__name__)app.config['MYSQL_HOST']='localhost'app.config['MYSQL_USER']='root'app.config['MYSQL_PASSWORD']='password'a......
  • Python pandas to_csv 导致 OSError: [Errno 22] 参数无效
    我的代码如下:importpandasaspdimportnumpyasnpdf=pd.read_csv("path/to/my/infile.csv")df=df.sort_values(['distance','time'])df.to_csv("path/to/my/outfile.csv")此代码成功从infile.csv(一个3GBcsv文件)读取数据,对其进行排......
  • 从 python 中的字符串列表中提取 def 定义函数的标签
    我想使用Python中的正常def过程创建函数,并将标签分配给从字符串列表中提取的命名空间。如何实现这一点?这个问题的动机:我正在创建一个与sympy兼容的python函数库,供数学家用于符号计算实验。许多函数需要初始化具有相关标签的多个对象的系统,这些标签分别由用户提供的字......
  • 在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取
    我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用MT681614位磁性编码器通过RaspberryPi的SPI连接读取绝对角度。我有以下问题:在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?对于编码......
  • PythonW 不运行脚本。严重地
    因此,使用Windows10和Python3.6。我创建了一个.py脚本,它可以使用命令pythonmyscript.py在命令提示符下正常运行,但是当我制作该脚本的精确副本并为其赋予扩展名.pyw,并尝试使用pythonw运行它时命令pythonwmyscript.pyw,什么也没有发生......
  • 如何使用Python和Selenium模拟产品购买以获取库存信息
    我正在开发一项网络抓取服务,主要针对时尚行业。我的目标是提供有关产品的全面数据,包括库存水平。为了实现这一目标,我需要模拟购买以确定每种尺寸的产品的最大可用数量。我一直在使用Python和Selenium进行网络抓取部分,但在准确模拟购买方面面临着挑战检索股票信息的过程。......
  • 连接Python套接字的问题
    当我写“关闭”时,我试图让我的电报机器人关闭计算机。我不想将机器人连接到网站上的托管。我选择我的手机(AndroidRedmiNote10)作为托管。我在上面安装了Termux和Pydroid。我写了两个文件:main到我的电脑,client到我的手机。通过在计算机上运行这两个文件,一切正常。但是,当我在......
  • 如何修复导入 Numexpr Python 时的错误
    在Windows10Python3.7.9(IDLE)上,我成功安装了“pipinstallnumexpr”,但在“importnumexprasne”时出现错误:Traceback(最近一次调用):文件“<pyshell#21>”,第267行,位于将numexpr导入为ne文件“C:\Python379\lib\site-packages\numexpr_init_.py”......