如何将pyosmium的osmium.osm.location坐标转换为常规经纬度坐标
pyosmium坐标转换正确方案
osmium.osm.Location本身存储的就是通用WGS84(EPSG:4326)经纬度坐标,不需要额外做投影转换,之前转换出错是两个认知错误导致的:
- 误将原生4326坐标判定为EPSG:3857(Web墨卡托)坐标,转换逻辑从根源上错误
- 传入的-2916285、515160418是osmium内部为压缩存储使用的定点整数值,是真实经纬度乘以10^7后的结果,直接传入转换函数必然出错——Web墨卡托Y值理论上限仅为20037508,传入5亿多的超限值,自然返回纬度90的无效极点结果。
正确提取坐标的方法
直接调用Location对象自带属性即可,框架会自动将内部存储的整数转为浮点型常规经纬度,不需要自行计算,也不需要pyproj参与:
import osmium class CoordinateHandler(osmium.SimpleHandler): def node(self, n): # 先判断坐标有效性,避免空值报错 if n.location.valid(): lon = n.location.lon # 经度,通用WGS84格式 lat = n.location.lat # 纬度,通用WGS84格式 print(f"经度:{lon}, 纬度:{lat}") if __name__ == "__main__": handler = CoordinateHandler() # 替换为自身的osm/osm.pbf文件路径 handler.apply_file("target.osm.pbf")
特殊情况说明
如果拿到了Location的原始整数存储值(常规读取场景不会碰到),手动将x、y值都除以10000000即可得到正确经纬度,以给出的测试值为例:
- X值:-2916285 / 10000000 = -0.2916285(经度)
- Y值:515160418 / 10000000 = 51.5160418(纬度)
该坐标对应伦敦附近区域,符合OSM数据实际分布,和之前错误转换得到的极点结果完全不同。
内容的提问来源于stack exchange,提问作者data en
相关产品推荐
相关产品推荐

