OSMNX graph_from_polygon处理多面GeoDataFrame报错求解决方案
解决方案:处理GeoDataFrame中全部多边形的路网获取
方法1:合并所有多边形为单个MultiPolygon(推荐)
把GeoDataFrame里的所有几何对象合并成一个MultiPolygon,直接传给graph_from_polygon,一次性获取所有区域的路网,避免多次请求OSM数据。
代码示例:
import geopandas as gpd import osmnx as ox # 读取并转换坐标系 gif_umkreis = gpd.read_file('Gifhorn_umkreis_3857.shp') gif_umkreis = gif_umkreis.to_crs(4326) # 合并所有几何为单个MultiPolygon merged_polygon = gif_umkreis.unary_union # 获取路网 transport_mode = "drive" G = ox.graph_from_polygon(merged_polygon, network_type=transport_mode, simplify=True) # 可选:绘制路网 ox.plot_graph(G)
方法2:遍历每个多边形获取路网后合并
如果需要保留单个多边形的路网数据,或者合并操作有异常,可以遍历GeoSeries里的每个Polygon,分别获取路网,再用ox.utils_graph.combine_graphs合并所有图对象。
代码示例:
import geopandas as gpd import osmnx as ox from osmnx.utils_graph import combine_graphs gif_umkreis = gpd.read_file('Gifhorn_umkreis_3857.shp') gif_umkreis = gif_umkreis.to_crs(4326) transport_mode = "drive" # 初始化空列表存储每个多边形的路网图 graphs = [] for polygon in gif_umkreis['geometry']: # 跳过空几何或无效几何 if polygon.is_valid and not polygon.is_empty: g = ox.graph_from_polygon(polygon, network_type=transport_mode, simplify=True) graphs.append(g) # 合并所有路网图 G = combine_graphs(graphs) # 可选:绘制合并后的路网 ox.plot_graph(G)
注意事项
- 合并多边形前,可提前过滤无效几何:
gif_umkreis = gif_umkreis[gif_umkreis.is_valid] - 若多边形存在重叠,合并后的路网不会重复计算,OSMnx会自动处理
- 遍历方法会发起多次OSM请求,速度慢于合并方法,适合多边形数量较少的场景
内容的提问来源于stack exchange,提问作者Zei
相关产品推荐
相关产品推荐

