【问题标题】:OSMNx : get coordinates of nodes using OSM idOSMNx : 使用 OSM id 获取节点坐标
【发布时间】:2018-02-24 14:25:54
【问题描述】:

我使用 Python 库 OSMNx 在城市旅行的几个步骤之间绘制了一条最佳路线。最后一个变量是a list of OSM ids

现在,我正在尝试将此路线保存为 shp 或 json 文件。问题是我需要每个节点的纬度/经度,但我没有找到一个 OSMNx 函数来做到这一点。

我尝试了 get_route_edge_attributes(但坐标不是此函数的有效属性)。有没有办法用这个单一的 id 获取 OSM 节点的坐标?

提前致谢。

【问题讨论】:

  • 我的坏 Alireza,我正在度假,远离任何屏幕!我刚刚测试了你的线路,它们运行良好。我立即验证您的回答,再次感谢您。
  • 抱歉之前的评论。很高兴听到它有效。

标签: python openstreetmap networkx


【解决方案1】:

您拥有图表中每个节点和边的所有属性。您可以使用以下方法获取节点属性:

G.node[38862848]
#out: {'highway': nan,
# 'lat': 45.3210533,
# 'lon': -122.9790558,
# 'osmid': '38862848',
# 'ref': nan,
# 'x': 501641.47862882155,
# 'y': 5018616.5723966481}

G.node[38862848]['lat']
# out: 45.3210533

要获取边缘属性,您可以使用G[u][v]:

G[5035130880][4963510289]
# out: 
#{0: {'bridge': 'yes',
#  'geometry': <shapely.geometry.linestring.LineString at 0x7f90ad7d5860>,
#  'highway': 'secondary',
#  'length': 671.332597496,
#  'name': 'Northwest 185th Avenue',
#  'oneway': False,
#  'osmid': [124454683, 24446714, 124454682]}}

所有属性也都在图形的 GeoDataFrame 中。 如果您有节点列表,获取所有节点几何的最简单方法是:

import osmnx as ox
import networkx as nx

gdf_nodes, gdf_edges = ox.graph_to_gdfs()
path = nx.shortest_path(G, G.nodes()[0], G.nodes()[1])
gdf_nodes.loc[path]
#out: 
#        highway    lat lon    osmid    ref x   y   geometry    traffic_signals
#5035130880 NaN 45.5637 -122.868    5035130880  NaN 510334  5.04558e+06 POINT (510334.0390091945 5045583.999886028) 0
#4963510289 NaN 45.5698 -122.868    4963510289  NaN 510329  5.04625e+06 POINT (510329.3114555664 5046254.728223645) 0
# ... 

输出是一个 GeoDataFrame。

【讨论】:

  • 我的G没有.node
  • 对于 osmx 版本 1.1.2 G.nodes 工作(不是 G.node)
【解决方案2】:

有关更多详细信息,另请参阅 GitHub 上的 this

xy 属性是您的节点坐标。如果您的图表未投影,则它们采用 lat-lon(度数单位)。

如果您已经投影了图形,那么 xy 是您的投影节点坐标(以米或投影坐标系使用的任何单位为单位),并且节点还将有额外的包含原始未投影坐标的latlon 属性。

import osmnx as ox
G = ox.graph_from_place('Piedmont, CA, USA', network_type='drive')
node_id = list(G.nodes)[0]
G.nodes[node_id]['x'] #lon
G.nodes[node_id]['y'] #lat

【讨论】:

  • 对于任何来到这里的人:对我来说,执行G.node 会导致错误 ('MultiDiGraph' object has no attribute 'node')。您需要使用复数形式:nodes 例如G.nodes[node_id]['x'] 应该可以工作。
  • 谢谢。 networkx API 在这几个月内发生了变化。
  • 那么现在用.node代替呢?
  • 我发现了,nodes = g.nodes(), info = nodes[some_id]
  • @tmo,我认为您应该将您的评论转换为答案。我自己找到答案后才看到的。
【解决方案3】:

G.node[38862848]['y'] 表示纬度和 G.node[38862848]['x'] 表示经度

【讨论】:

  • 我的G没有.node
【解决方案4】:

28-01-2021更新

NetworkX API 更新后,请注意您需要使用复数形式nodes 例如

G.nodes[node_id]['x'] 

应该可以。

执行 G.node 会导致错误('MultiDiGraph' 对象没有属性 'node')。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 2017-12-03
    • 2018-11-27
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多