【问题标题】:OSMNX graph from point and geometry information来自点和几何信息的 OSMNX 图
【发布时间】:2020-10-16 01:07:59
【问题描述】:

我已经使用 osmnx 一段时间了,并且正在做: G = ox.graph_from_point(city_center,距离=距离,network_type='drive',simplify=False) 正在返回一个图表

边迭代 对于 u, v, G.edges 中的数据(keys=False, data=True)

将允许人们通过以下方式访问边缘的地理坐标: 数据['几何'].coords

在最近的努力中,不幸的是几何属性不存在。现在有机会访问节点或边的坐标吗?

非常感谢!

【问题讨论】:

  • 请提供一个完整的最小工作示例,我们可以复制/粘贴以从头开始运行以重现您的问题。

标签: python networking spatial osmnx


【解决方案1】:

OSMnx 仅将geometry 属性添加到简化的边缘。如果边未简化,则其几何形状是其入射节点 uv 之间的一条普通直线。在您的代码中,您使用simplify=False 参数化了graph_from_point,因此您的所有边都没有被简化,并且它们都没有geometry 属性:

import osmnx as ox
ox.config(use_cache=True, log_console=True)

point = 40.729630, -73.998835
dist = 100
G = ox.graph_from_point(point, dist=dist, network_type='drive', simplify=False) 

for u, v, data in G.edges(keys=False, data=True):
    simp = '' if 'geometry' in data else 'not '
    print(f'edge {data["osmid"]} has {simp}been simplified')

如果您简化图形,其部分或全部边将具有几何属性,具体取决于连接两个交叉点的特定街道段最初是否跨越多个 OSM 节点。拓扑简化方法在this paper 中有详细说明。更多详情见the docs。示例:

import osmnx as ox
ox.config(use_cache=True, log_console=True)

point = 40.729630, -73.998835
dist = 100
G = ox.graph_from_point(point, dist=dist, network_type='drive', simplify=True) 

for u, v, data in G.edges(keys=False, data=True):
    simp = '' if 'geometry' in data else 'not '
    print(f'edge {data["osmid"]} has {simp}been simplified')

您还可以通过使用fill_edge_geometry=True 调用graph_to_gdfs 然后使用graph_from_gdfs 重构您的图形,手动将几何属性添加到简化或未简化图形的每条边,如下所示:

import osmnx as ox
import pandas as pd
ox.config(use_cache=True, log_console=True)

point = 40.729630, -73.998835
dist = 100
G = ox.graph_from_point(point, dist=dist, network_type='drive', simplify=False)

# create nodes, edges GeoDataFrames and fill in all edge geometry attributes
# then re-create a MultiDiGraph from those GeoDataFrames
nodes, edges = ox.graph_to_gdfs(G, fill_edge_geometry=True)
G2 = ox.graph_from_gdfs(nodes, edges, graph_attrs=G.graph)

for u, v, data in G2.edges(keys=False, data=True):
    assert 'geometry' in data

最后,在上面的评论中,您提到“我使用的是最新版本,即 osmnx 0.16.1。”但是,您的代码 sn-p 不能使用 v0.16.1,因为 distance 参数已被弃用并最终替换为 dist 5 或 6 版本之前。尝试运行 print(ox.__version__) 以查看您实际使用的版本。

【讨论】:

  • 谢谢!我认为我真的真的需要思考简化概念,因为我记得在之前对同一参数github.com/gboeing/osmnx/issues/427 的交互过程中它让我感到困惑 ....
  • 刚刚在那个 github 问题上添加了对这个答案的交叉引用
  • 参考您上面的评论'OSMnx 仅将几何属性添加到简化的边缘。如果一条边未简化,则其几何形状是其入射节点 u 和 v 之间的一条普通直线。 , 我想知道。如果是这样,那么我应该至少能够获得节点坐标。使用 G = ox.graph_from_point(point, dist=dist, network_type='drive', simple=False) 获取图形,然后遍历 nodes(),我发现没有涉及 lat/lng 或几何属性。
【解决方案2】:

这是一个代码 sn-p 但现在即使在数据检索时我也得到了

以下错误: 文件 ../python3.7/site-packages/osmnx/core.py",第 931 行,在 create_graph raise EmptyOverpassResponse('响应 JSON 对象中没有数据元素') osmnx.errors.EmptyOverpassResponse:响应JSON对象中没有数据元素

import osmnx as ox
import sys

newyork_center = (40.729630, -73.998835)
distance = 100.0  

G = ox.graph_from_point(newyork_center, distance=distance, network_type='drive', simplify=False) 

for u, v, data in G.edges(keys=False, data=True):
    try:
        print (data)
        print (data['geometry'].coords)
    except:
        print (sys.exc_info())

【讨论】:

  • 您使用的是什么版本的 OSMnx?无论版本如何,请注意您提供的距离参数始终以米为单位。见the docs。错误消息只是告诉您在该点的 1 米范围内没有街道网络数据,正如预期的那样。
  • 谢谢。我现在编辑了代码 sn-p 以首先获得更好的距离输入参数。当我从更大的代码库中提取代码 sn-p 时,我还纠正了一个意外“继承”的错误。上述 for 循环的迭代输出为: {'osmid': 5672138, 'name': 'Laguardia Place', 'highway': 'residential', 'maxspeed': '25 mph', 'oneway': False , 'length': 79.494} (, KeyError('geometry'), ) ---为了回答你的第一个问题,我使用的是最新版本,即 osmnx 0.16.1.
  • 您的代码 sn-p 未使用 v0.16.1,因为 distance 参数已被弃用并最终替换为 dist 5 或 6 个版本。尝试运行 print(ox.__version__) 以查看您实际使用的版本。
  • 非常感谢您提供的信息。你是对的,我实际运行的python环境使用的是osmnx 0.12版。我想我在不同的环境中安装了一些,因此感到困惑:(
猜你喜欢
  • 2021-12-23
  • 2019-09-24
  • 2019-07-28
  • 2017-05-07
  • 2020-12-01
  • 2019-09-03
  • 2017-06-13
  • 2019-09-12
  • 1970-01-01
相关资源
最近更新 更多