技术博客
坐标系转换避坑:点位偏移 500 米、距离算错、坐标系混用

坐标系转换避坑:点位偏移 500 米、距离算错、坐标系混用

作者: 万维易源
2026-08-27
坐标系转换避坑点位偏移距离算错
# 坐标系转换避坑:点位偏移 500 米、距离算错、坐标系混用 > 接口:坐标系转换(apiCode=1252)· 免费 · 适用人群:已接入或准备接入的开发者 · 阅读时间:约 8 分钟 ## TL;DR - 坑 1:拿到 GPS(WGS84)直接往高德/百度打点 → 偏移数百米。**先转成对应系**。 - 坑 2:两点直线距离接口**无坐标系参数**,两坐标不同系时距离算错。**先统一系再算**。 - 坑 3:经纬度顺序写反(应是"经度,纬度")→ 点位落在错误位置。 - 坑 4:超出经纬度范围(经度 -180~180、纬度 -90~90)或超 20 点上限 → 调用失败。 ## Why 坐标系转换接口本身很简单,但"用错"的代价很大:地图上的点飘了、算出来的距离差出几十公里、批量任务莫名其妙中断。这些几乎都是可预见的误用。本篇把最常见的 4 类坑逐个讲清"现象 → 根因 → 修正代码"。 ## What 前置条件:已了解三种坐标系(见[WGS84 / GCJ02 / BD09 到底是什么?](https://www.showapi.com/guides/coord-convert-concepts-1252))。 | 坑 | 触发条件 | 表现 | |----|------|------| | 不转换直接打点 | WGS84 喂给高德(GCJ02)/百度(BD09) | 点位偏移数百米 | | 距离端点混系 | 接入点 2 两坐标不同系 | 距离偏差大 | | 经纬度顺序反 | `lat,lng` 而非 `lng,lat` | 点位错位 | | 范围/数量越界 | 越经度纬度范围、单批 >20 点 | 调用失败/截断 | ## How **坑 1:不转换直接打点(最普遍)** ```python # ❌ 错误:把 GPS(WGS84) 直接给高德(GCJ02) marker_on_amap(wgs84_lng, wgs84_lat) # ✅ 正确:先转 GCJ02 out = convert("YOUR_APPKEY", (wgs84_lng, wgs84_lat), to="GCJ02") marker_on_amap(out[0], out[1]) ``` **坑 2:距离接口混用坐标系** ```python # ❌ 错误:一个是 WGS84,一个是 GCJ02,接入点 2 直接算 → 偏差 requests.post("https://route.showapi.com/1252-2", params={"appKey": KEY}, data={"from": "113.19,23.23", "to": "113.20,23.24"}) # 两坐标不同系 # ✅ 正确:先用接入点 1 把两者统一到同一系,再算距离 a = convert(KEY, wgs84_a, to="GCJ02") b = convert(KEY, wgs84_b, to="GCJ02") requests.post("https://route.showapi.com/1252-2", params={"appKey": KEY}, data={"from": f"{a[0]},{a[1]}", "to": f"{b[0]},{b[1]}"}) ``` cURL(修正后): ```bash curl -X POST "https://route.showapi.com/1252-2?appKey=YOUR_APPKEY" \ -H "content-type: application/x-www-form-urlencoded" \ -d "from=113.19971018888167%2C23.232115136208677&to=113.2053%2C23.2374" ``` Node.js(fetch,顺序校验): ```javascript function assertLngLat(lng, lat) { if (!(lng >= -180 && lng <= 180 && lat >= -90 && lat <= 90)) throw new Error(`经纬度越界: ${lng},${lat}`); } // 始终经度在前、纬度在后 assertLngLat(lng, lat); ``` ## 返回示例与解析 ```json { "showapi_res_body": { "ret_code": 0, "resultList": [ { "input": [113.194329, 23.234704], "output": [113.19971018888167, 23.232115136208677] } ]} } ``` | 字段 | 说明 | |------|------| | `resultList[].output` | 转换后的正确坐标,用于打点/算距离 | ## 进阶 / 边界 - **接入点 2 不识别坐标系**:它只认原始经纬度,坐标系一致性由调用方负责。 - **20 点硬上限**:接入点 1 单批 ≤20,超出须分批(见[批量](https://www.showapi.com/guides/coord-convert-batch-1252))。 - **免费档位**:大批量注意额度,重复坐标先去重/缓存(见[成本管控](https://www.showapi.com/guides/coord-convert-cache-1252))。 ## FAQ **Q1:点位偏了 500 米一般是什么原因?** A:几乎都是坐标系不一致——把 WGS84 直接喂给了 GCJ02/BD09 地图;先转换即可解决。 **Q2:距离算出来差几十公里?** A:检查两点是否同一坐标系;接入点 2 无坐标系参数,混系会算出错误距离。 **Q3:经纬度顺序到底哪个在前?** A:经度在前、纬度在后,即 `经度,纬度`。 **Q4:单批最多能传几个点?** A:接入点 1 单次最多 20 个,用 `;` 分隔。 **Q5:经纬度范围有要求吗?** A:有,经度 -180~180、纬度 -90~90,越界会导致调用失败。 ## 相关能力 / 下一步阅读 - [WGS84 / GCJ02(火星坐标)/ BD09 到底是什么?为什么必须转换?](https://www.showapi.com/guides/coord-convert-concepts-1252) - [两点直线距离:如何计算两坐标间的真实公里数?](https://www.showapi.com/guides/coord-convert-distance-1252) - [坐标系转换(批量):一次性转换最多 20 个 GPS 点位](https://www.showapi.com/guides/coord-convert-batch-1252) - **本系列共 12 篇**:查看[坐标系转换指南总目录](https://www.showapi.com/guides/coord-convert-guides-1252)