使用osm2geojson将OSM Relation XML转GeoJSON失败求助
解决OSM Relation转GeoJSON为空的问题
问题根源
你从OSM API获取的单个relation XML仅包含关系的元数据和成员引用,没有包含关联的way和node的实际几何数据。osm2geojson需要这些依赖元素才能构建完整的地理形状,因此找不到对应way时会报错,最终生成空的GeoJSON。
解决方案
方法1:获取包含完整依赖的OSM数据
修改请求URL,添加?full参数,获取包含关系、所有成员way及对应node的完整数据:
https://www.openstreetmap.org/api/0.6/relation/151234/full
将这个请求返回的内容保存为XML文件(比如ykt_full.xml),再用你的代码转换即可正常生成GeoJSON。
修正后的代码示例
import codecs import osm2geojson import folium # 读取包含完整依赖的XML with codecs.open('ykt_full.xml', 'r', encoding='utf-8') as data: xml = data.read() # 转换为GeoJSON geojson = osm2geojson.xml2geojson(xml, filter_used_refs=False) # 在folium中加载显示 # 替换location为目标区域的大致经纬度(比如该relation的中心点) m = folium.Map(location=[40.7128, -74.0060], zoom_start=12) folium.GeoJson(geojson).add_to(m) m.save('osm_relation_map.html')
方法2:用osmium-tool补全现有数据(适合批量处理)
如果已经有原始的relation XML,可以用osmium-tool下载缺失的依赖元素:
- 安装osmium-tool(根据系统选择包管理器安装,比如
apt install osmium-tool或brew install osmium-tool) - 执行命令补全数据:
osmium getid -r -t node,way ykt.xml relation/151234 -o ykt_full.xml
之后用补全后的ykt_full.xml进行转换即可。
注意事项
- 如果转换时仍有少量警告,可能是部分way/node已被OSM删除,这种情况可以忽略,或设置
filter_used_refs=True过滤无效引用,但可能导致部分几何形状缺失。 - 确保folium的
location参数设置为目标relation所在区域的大致经纬度,否则地图可能无法自动定位到目标区域。
内容的提问来源于stack exchange,提问作者MXNS
相关产品推荐
相关产品推荐

