OSMNx:使用OSM id获取节点的坐标

Rap*_*lva 6 python openstreetmap networkx

我使用Python库OSMNx在城市旅行的几个步骤之间绘制最佳路线.最后一个变量是OSM ID列表.

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

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

提前致谢.

Alz*_*Alz 9

您拥有图中每个节点和边的所有属性.您可以使用以下方式获取节点属

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
Run Code Online (Sandbox Code Playgroud)

并获得可以使用的边缘属性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]}}
Run Code Online (Sandbox Code Playgroud)

所有属性也在图的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
# ... 
Run Code Online (Sandbox Code Playgroud)

输出是GeoDataFrame.

  • 对于 osmx 版本 1.1.2 G.nodes 有效(不是 G.node) (2认同)

gbo*_*ing 5

另请参阅GitHub 上的内容以了解更多详细信息:

x属性y是您的节点坐标。如果您的图表未投影,则它们采用经纬度(度单位)。

如果您已经投影了图形,则xy是您的投影节点坐标(以米或投影坐标系使用的任何单位为单位),并且节点还将具有包含原始未投影坐标的附加lat和属性。lon

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
Run Code Online (Sandbox Code Playgroud)

  • 对于来到这里的任何人:对我来说,执行“G.node”会导致错误(“MultiDiGraph”对象没有属性“node”)。您需要使用复数:“nodes”,例如“G.nodes[node_id]['x']”应该可以。 (5认同)