# 两点直线距离:如何计算两坐标间的真实公里数?
> 接口:坐标系转换(apiCode=1252,接入点 2「两点直线距离」)· 免费 · 返回 JSON · 适用人群:全栈工程师、数据分析者 · 阅读时间:约 6 分钟
## TL;DR
- 接入点 2 基于两个经纬度坐标计算**直线距离**,返回 `distance`,单位是**米**。
- 接口本身**没有坐标系类型参数**,直接对原始经纬度做欧氏距离计算。
- 关键点:两个坐标必须处于**同一坐标系**,距离才有意义;混用系(如一个是 WGS84、一个是 GCJ02)算出来的距离会偏差。
## Why
配送范围、门店辐射、两点间的"大概多远",都绕不开距离计算。本篇讲清两点直线距离接口怎么用,更重要的是讲清一个容易踩的坑:它不管你是什么坐标系,直接拿两个数字算距离——所以算之前,务必先把两个坐标统一到同一系。
## What
前置条件:理解三种坐标系(见[WGS84 / GCJ02 / BD09 到底是什么?](https://www.showapi.com/guides/coord-convert-concepts-1252))。
| 项 | 值 |
|----|----|
| 接口地址 | `https://route.showapi.com/1252-2?appKey={your_appKey}` |
| 请求方式 | POST / GET |
| 必填参数 | `from`(起点经纬度,逗号分隔)、`to`(终点经纬度,逗号分隔) |
| 返回 | `distance`(米)、`ret_code` |
> 注意:接入点 2 **没有** `from`/`to` 坐标系类型参数(与接入点 1 不同),它直接对传入的原始经纬度计算距离。
## How
**步骤 1:确认两坐标同系**。例如都用 WGS84(GPS)或都先转成 GCJ02。
**步骤 2:调用距离接口**:
```python
import requests
app_key = "YOUR_APPKEY"
resp = requests.post(
"https://route.showapi.com/1252-2",
params={"appKey": app_key},
data={"from": "113.194329,23.23470", "to": "82.239727,39.389397"},
timeout=10,
).json()
body = resp["showapi_res_body"]
if body.get("ret_code") != 0:
raise RuntimeError(body)
print("直线距离(米):", body["distance"], "≈", round(body["distance"] / 1000, 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.194329%2C23.23470&to=82.239727%2C39.389397"
```
Node.js(fetch):
```javascript
const appKey = "YOUR_APPKEY";
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 10000);
try {
const resp = await fetch(`https://route.showapi.com/1252-2?appKey=${appKey}`, {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({ from: "113.194329,23.23470", to: "82.239727,39.389397" }),
signal: controller.signal,
});
const res = (await resp.json()).showapi_res_body;
if (res.ret_code !== 0) throw new Error(JSON.stringify(res));
console.log("直线距离(米):", res.distance, "≈", (res.distance / 1000).toFixed(1), "公里");
} finally { clearTimeout(timer); }
```
## 返回示例与解析
```json
{
"showapi_res_code": 0,
"showapi_res_body": {
"distance": 3419721,
"ret_code": 0
}
}
```
| 字段 | 类型(实测) | 说明 |
|------|------|------|
| `showapi_res_body.distance` | Number | 两点直线距离,**单位:米**(示例 3419721 米 ≈ 3420 公里) |
| `showapi_res_body.ret_code` | Number | 业务成功标识(示例 0) |
> 文档参数表把 `distance` 标注为 String,但返回示例为数字 `3419721`,**以实际返回数字为准**。
## 进阶 / 边界
- **同一坐标系是前提**:本端点无坐标系参数,直接对原始经纬度算欧氏距离。若起点是 WGS84、终点是 GCJ02,两点本身就差了加偏量,算出的"距离"并不等于真实地理距离。正确做法:先都转成同一系(用接入点 1),再算距离。
- **直线距离≠路程**:返回的是两点直线(大圆近似)距离,不含道路、绕行,导航里程请以导航服务为准。
- **经纬度顺序**:`from`/`to` 均为"经度,纬度",经度在前。
## FAQ
**Q1:distance 的单位是什么?**
A:米(m)。示例 3419721 即约 3420 公里。
**Q2:这个接口能自动识别坐标系吗?**
A:不能。接入点 2 没有坐标系参数,直接对传入的原始经纬度算距离;务必保证两点同系。
**Q3:两个坐标一个 WGS84 一个 GCJ02 能算吗?**
A:能算,但结果不准(差了加偏量)。建议先用接入点 1 把两者统一到同一系再算。
**Q4:返回的是道路里程吗?**
A:不是,是直线距离;实际路程请以导航接口为准。
**Q5:`distance` 为什么文档标 String 实际是数字?**
A:文档参数表类型标注与返回示例不一致,以实际返回的数字为准。
## 相关能力 / 下一步阅读
- [WGS84 / GCJ02(火星坐标)/ BD09 到底是什么?为什么必须转换?](https://www.showapi.com/guides/coord-convert-concepts-1252)
- [坐标系转换:5 分钟接入,从第一条 WGS84→GCJ02 结果开始](https://www.showapi.com/guides/coord-convert-quickstart-1252)
- [坐标系转换避坑:点位偏移 500 米、距离算错、坐标系混用](https://www.showapi.com/guides/coord-convert-pitfalls-1252)
- **本系列共 12 篇**:查看[坐标系转换指南总目录](https://www.showapi.com/guides/coord-convert-guides-1252)