如何将OSMnx提取的城市自行车道网络导出为KML/Shapefile?
解决OSMnx导出自行车道网络仅少量边的问题
你遇到的导出后仅1-2条边的问题,大概率是**ox.simplify_graph()的调用时机不合理**,以及未正确将图转换为GeoDataFrame再导出导致的。以下是修正后的完整流程:
1. 优化自行车道筛选逻辑
先严谨筛选出符合要求的自行车道边,避免遗漏有效数据:
import osmnx as ox import geopandas as gpd # 配置OSMnx,确保获取自行车道相关标签 useful_tags = ox.settings.useful_tags_way + ['cycleway', 'bicycle'] ox.utils.config(use_cache=True, log_console=True, useful_tags_way=useful_tags) # 获取旧金山自行车网络,先不做简化 G = ox.graph_from_place('San Francisco, California, USA', network_type='bike', simplify=False, retain_all=True) # 筛选需要保留的自行车道边 keep_edges = [] for u, v, k, d in G.edges(keys=True, data=True): # 满足以下任一条件则保留: # 1. 道路类型为专用自行车道(cycleway) # 2. 包含cycleway标签(如lane、track等) # 3. bicycle标签标记为专用(designated) if d.get('highway') == 'cycleway' or 'cycleway' in d or d.get('bicycle') == 'designated': keep_edges.append((u, v, k)) # 仅保留筛选后的边 G = G.edge_subgraph(keep_edges).copy() # 移除孤立无连接的节点 G = ox.utils_graph.remove_isolated_nodes(G)
2. 转换为GeoDataFrame(导出前必备步骤)
将图对象转换为节点和边的GeoDataFrame,这是导出为GIS格式的关键:
# 按需简化图(若不需要简化可跳过此步) G_simplified = ox.simplify_graph(G) # 将图拆分为节点、边的GeoDataFrame gdf_nodes, gdf_edges = ox.graph_to_gdfs(G_simplified) # 确认有效边数量,验证筛选结果 print(f"有效自行车道边数量:{len(gdf_edges)}")
3. 导出为Shapefile/KML/GeoJSON
直接使用GeoPandas的导出方法,将GeoDataFrame保存为目标格式:
导出为Shapefile
# 导出边图层 gdf_edges.to_file("sf_bike_edges.shp", driver="ESRI Shapefile") # 导出节点图层 gdf_nodes.to_file("sf_bike_nodes.shp", driver="ESRI Shapefile")
导出为KML
# 导出边图层 gdf_edges.to_file("sf_bike_edges.kml", driver="KML") # 导出节点图层 gdf_nodes.to_file("sf_bike_nodes.kml", driver="KML")
导出为GeoJSON
# 导出边图层 gdf_edges.to_file("sf_bike_edges.geojson", driver="GeoJSON") # 导出节点图层 gdf_nodes.to_file("sf_bike_nodes.geojson", driver="GeoJSON")
关键注意事项
- 不要过早简化图:原代码在筛选边后立即调用
ox.simplify_graph(),可能导致大量有效边被错误合并或删除,建议先完成筛选再考虑简化。 - 必须通过GeoDataFrame导出:直接操作图对象导出容易丢失数据,转换为GeoDataFrame是兼容GIS工具的标准方式。
- Colab环境下的文件查看:导出的文件会保存在当前工作目录,可通过左侧文件面板查看或下载。
内容的提问来源于stack exchange,提问作者mm13816
相关产品推荐
相关产品推荐

