我使用Python库OSMNx在城市旅行的几个步骤之间绘制最佳路线。最后一个变量是a list of OSM ids。
现在,我正在尝试将此路由保存为shp或json文件。问题是我需要每个节点的纬度/经度,但我没有找到OSMNx函数来做到这一点。
我尝试了get_route_edge_attributes(但坐标不是此函数的有效属性)。有没有办法用这个单一的id获取OSM节点的坐标?
提前致谢。
答案 0 :(得分:6)
您拥有图表中每个节点和边缘的所有属性。您可以使用以下方式获取节点属性:
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。
答案 1 :(得分:1)
G.node [38862848] ['y'] G.node [38862848] ['x'] 表示经度
答案 2 :(得分:1)
28-01-2021 更新
更新 NetworkX API 后,请注意您需要使用复数:nodes 例如
G.nodes[node_id]['x']
应该可以。
执行 G.node 会导致错误('MultiDiGraph' 对象没有属性 'node')。
答案 3 :(得分:0)
有关更多详细信息,另请参见GitHub上的this:
x
和y
属性是您的节点坐标。如果您的图形未投影,则它们以经度(度单位)为单位。如果已投影图形,则
x
和y
是投影的节点坐标(以米或投影坐标系使用的任何单位)和节点将另外具有包含原始未投影坐标的lat
和lon
属性。
import osmnx as ox
G = ox.graph_from_place('Piedmont, CA, USA', network_type='drive')
node_id = list(G.nodes())[0]
G.node[node_id]['x'] #lon
G.node[node_id]['y'] #lat