如何将OSM ID列表转换为GeoJSON格式在folium中绘制?
解决方案
核心思路
使用OSMnx库批量拉取OSM关系ID对应的行政边界数据,自动处理多面拓扑避免报错,全程无手动下载操作,直接生成可用于folium的GeoJSON数据。
操作步骤
1. 安装依赖
执行命令安装所需工具库:pip install osmnx folium
2. 完整可运行代码
import folium import osmnx as ox import geopandas as gpd # 开启缓存避免重复请求,提升运行效率 ox.settings.use_cache = True # 遇到接口超时可适当调大该参数 ox.settings.timeout = 120 # 填入你所有的42个OSM关系ID即可 osm_relation_ids = [4791885, 2417889, 2822130] # 批量拉取所有ID对应的边界几何 gdf = ox.geometries_from_osm_ids( ids=osm_relation_ids, id_type="relation" ) # 此处可关联你的人口数据,通过osmid字段匹配即可用于后续choropleth着色 # gdf = gdf.merge(你的人口数据表, left_on="osmid", right_on="你表中存储的OSM ID字段") # 直接生成GeoJSON数据,无需存储本地文件 geojson_data = gdf.to_json() # 绘制地图 boulder_coords = [41.3874, 2.1686] my_map = folium.Map(location = boulder_coords, zoom_start = 7.5) folium.GeoJson( geojson_data, name="区县边界" ).add_to(my_map) folium.LayerControl().add_to(my_map) my_map
说明
- 原报错是因为osm2geojson对带洞、多组成部分的复杂多面边界支持不完善,OSMnx底层自动处理拓扑逻辑,可完美兼容行政类多面边界
- 第一次拉取42个边界数据耗时约10-30秒,开启缓存后后续运行无需重新请求接口
- 拉取得到的GeoDataFrame自带OSM ID、区域名称等属性,可直接和人口数据关联实现分级着色的人口密度热力图
内容的提问来源于stack exchange,提问作者G. Macia
相关产品推荐
相关产品推荐

