Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OSMNx:使用OSM id获取节点的坐标_Python_Openstreetmap_Networkx - Fatal编程技术网

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

Python OSMNx:使用OSM id获取节点的坐标,python,openstreetmap,networkx,Python,Openstreetmap,Networkx,我使用Python库OSMNx在城市旅行的几个步骤之间绘制了一条最佳路线。最后一个变量是 现在,我尝试将此路由保存为shp或json文件。问题是我需要每个节点的纬度/经度,但我没有找到OSMNx函数来实现这一点 我尝试获取_route_edge_属性(但坐标不是此函数的有效属性)。有没有办法用这个id获取OSM节点的坐标 提前感谢。您拥有图形中每个节点和边的所有属性。可以使用以下方法获取节点属性: G.node[38862848] #out: {'highway': nan, # 'lat':

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

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

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


提前感谢。

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

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]}}

输出是一个地理数据框。

G.node[38862848]['y']表示纬度和纬度 G.node[38862848]['x']有关经度的信息

有关更多详细信息,请参见GitHub上的:

x
y
属性是节点坐标。如果图形是未投影的,则它们以lat lon(度单位)为单位

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


2021年1月28日更新

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

应该有用


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

我糟糕的Alireza,我在度假,远离任何屏幕!我刚刚测试了你的线路,效果很好。我立即验证您的答案,再次感谢您。抱歉之前的评论。很高兴听到它起作用。对于任何来到这里的人:对我来说,执行
G.node
会导致错误(
'MultiDiGraph'对象没有属性'node'
)。您需要使用复数:
nodes
例如
g.nodes[node_id]['x']
应该可以工作。谢谢。networkx API在这几个月里发生了变化。那么,现在如何取代
.node
?我发现了,nodes=g.nodes(),info=nodes[some_id]@tmo,我认为您应该将您的评论转换为答案。我是在自己找到答案后才看到的。我的G没有。nodemy G没有。node
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
# ... 
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.nodes[node_id]['x']