坐标系转换避坑:点位偏移 500 米、距离算错、坐标系混用
# 坐标系转换避坑:点位偏移 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)