OSMnx提取道路时部分Edge缺失Geometry属性问题咨询
解决OSMnx中道路几何属性不完整的问题
我来帮你搞定这个问题——你遇到的情况其实是OSMnx构建道路网络时的正常行为,下面给你拆解原因和具体解决方案:
为什么部分边没有geometry属性?
OSMnx在把OSM的way(道路实体)拆分为图的边时,对于两个节点之间的直线段,会主动省略geometry属性。因为这条边的几何形状可以直接通过两个节点的经纬度坐标计算出来,没必要额外存储占用空间。但绘图时OSMnx会自动根据节点坐标生成这条边的几何,所以你看到的路径是完整的。
以你提到的边359203175 → 359203168为例,它属于OSM way 32021916,这条way是由多个节点组成的连续路段,其中直线段的边就不会存储geometry。
获取整条道路完整geometry的两种方法
方法1:从已构建的图中合并边的几何
你可以把图的边转换成GeoDataFrame,然后通过way的ID(osmid)分组,合并同一way下所有边的几何:
import osmnx as ox # 构建你的图 G = ox.graph_from_bbox(43.60670421020654, 43.604437753042106, 1.4497628267951939, 1.4469172178876575, network_type='drive') # 将边转换为GeoDataFrame edges_gdf = ox.graph_to_gdfs(G, nodes=False, edges=True) # 筛选出目标way的所有边,合并几何 target_way_id = 32021916 way_edges = edges_gdf[edges_gdf['osmid'] == target_way_id] full_geometry = way_edges['geometry'].unary_union # 查看完整几何结果 print(full_geometry)
方法2:直接从OSM获取原始way的几何
如果不想从已构建的图中处理,也可以直接查询OSM获取目标way的完整几何:
import osmnx as ox # 通过way ID直接获取几何 way_gdf = ox.geometries_from_place(None, tags={'highway': True}, ids=[32021916]) full_geometry = way_gdf['geometry'].iloc[0] # 查看完整几何结果 print(full_geometry)
额外技巧:为单条无geometry的边生成几何
如果只是需要那条缺失geometry的单条边的几何,也可以通过节点坐标手动生成:
from shapely.geometry import LineString u = 359203175 v = 359203168 # 获取两个节点的坐标 node_u = G.nodes[u] node_v = G.nodes[v] # 生成直线几何 edge_geometry = LineString([(node_u['x'], node_u['y']), (node_v['x'], node_v['y'])])
内容的提问来源于stack exchange,提问作者Romain
相关产品推荐
相关产品推荐

