如何使用pyproj将经纬度坐标转换为SUMO路网投影坐标
WGS84经纬度转SUMO路网投影坐标实现方法
从SUMO路网文件的<location>标签提取核心转换参数后,通过pyproj完成坐标转换只需要投影+偏移两步计算,具体实现如下:
提前提取的配置参数
从给出的路网配置中,可以直接拿到转换必需的两个核心参数:
- 投影坐标系定义串:
+proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs - 路网全局偏移量:
netOffset = (-395885.58, -6185860.67)
实现步骤
安装依赖库
执行命令安装pyproj:pip install pyproj转换逻辑说明
SUMO路网坐标不是直接的投影坐标,是原始UTM投影坐标叠加全局偏移后的结果,目的是把路网整体平移到坐标原点附近,避免大数值坐标带来的计算精度问题:
- 第一步:将WGS84基准的经纬度坐标,通过给定的投影参数转换为UTM平面投影坐标
- 第二步:将UTM坐标叠加netOffset偏移值,得到最终在SUMO路网中使用的坐标
- 可直接运行的代码示例
from pyproj import Transformer # 路网配置参数 PROJ_STR = "+proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs" OFFSET_X, OFFSET_Y = -395885.58, -6185860.67 # 初始化转换器,always_xy=True指定输入坐标顺序为(经度, 纬度),避免轴顺序匹配错误 transformer = Transformer.from_crs("EPSG:4326", PROJ_STR, always_xy=True) def lonlat_to_sumo(lon: float, lat: float) -> tuple[float, float]: """ 输入WGS84坐标系的经度、纬度,返回对应SUMO路网下的(x, y)平面坐标 """ utm_x, utm_y = transformer.transform(lon, lat) sumo_x = utm_x + OFFSET_X sumo_y = utm_y + OFFSET_Y return sumo_x, sumo_y # 正确性验证:用路网配置里的边界点测试 # origBoundary左下角经纬度:37.338524, 55.806366,对应SUMO坐标应接近(0, 0) test_x, test_y = lonlat_to_sumo(37.338524, 55.806366) print(f"边界点转换结果:x={test_x:.2f}, y={test_y:.2f}")
注意事项
- 输入顺序不要搞反:转换函数要求经度在前、纬度在后,如果你的原始数据存储格式是(纬度, 经度),调用时需要调换参数顺序
- 结果校验:可以用配置中origBoundary给出的四个边角经纬度做测试,转换结果应当和convBoundary给出的坐标范围(0.00,0.00 ~ 3442.30,2845.95)匹配,米级以内的误差属于正常范围
- 如果结果偏差超过10米,优先检查三个常见问题:投影带号是否和配置一致、经纬度顺序是否传反、偏移量的正负号是否写反
内容的提问来源于stack exchange,提问作者benzom
相关产品推荐
相关产品推荐

