使用OSMnx简化路网后,如何保留几何信息并导出为.osm格式?
OSMnx简化路网后导出.osm保留精确几何的解决方案
我在使用OSMnx下载并简化道路网络时遇到了问题:简化后的路网无法保留路段的精确几何/地理空间信息。从图结构绘制出的路网是简化后的样式,但将同一网络转换为GeoDataFrame后,该GeoDataFrame却包含路段的精确LineString。我希望将已下载并简化好的道路网络保存为.osm格式,同时保留这些路段的几何/地理空间信息。尝试保存带原始地理空间信息的路网为.osm格式时,简化后的网络存成.osm或graphml格式就丢失了这些信息,但存成.gpkg格式却能保留原始LineString。
核心原因
OSMnx的路网简化过程会合并冗余节点,默认导出.osm/.graphml时,会基于合并后的节点坐标重构路段几何,而非保留原始的精确LineString;但转成GeoDataFrame时,会完整保留原始路段的几何信息。
解决方案一:更新图的边几何属性后导出.osm
通过将GeoDataFrame中的精确几何写回图的边属性,再导出.osm即可保留信息:
import osmnx as ox # 1. 获取并简化路网(示例) G_simplified = ox.graph_from_place("北京市海淀区", network_type="drive", simplify=True) # 2. 将简化图转为边的GeoDataFrame,这里包含精确的LineString gdf_edges = ox.graph_to_gdfs(G_simplified, nodes=False, edges=True) # 3. 将GeoDataFrame中的几何更新回图的边属性 for u, v, key, data in G_simplified.edges(data=True, keys=True): data["geometry"] = gdf_edges.loc[(u, v, key), "geometry"] # 4. 导出带精确几何的.osm文件 ox.save_graph_osm(G_simplified, filepath="./simplified_road_network.osm")
解决方案二:通过GPkg中转转换为.osm
利用GDAL的ogr2ogr工具,先将保留几何的GPkg文件转为.osm:
- 先保存简化图为GPkg(已确认能保留精确几何):
ox.save_graph_geopackage(G_simplified, filepath="./simplified_road_network.gpkg")
- 执行GDAL命令行转换:
ogr2ogr -f "OSM" ./simplified_road_network.osm ./simplified_road_network.gpkg edges
注意事项
- 确保使用OSMnx 0.16及以上版本,旧版本可能存在属性处理的bug
- 若导出的
.osm仍有问题,可检查GeoDataFrame中的geometry列是否确实为原始精确LineString
内容的提问来源于stack exchange,提问作者Nasir
相关产品推荐
相关产品推荐

