# 获取外网IP:用经纬度在地图上标出访问者位置
> 接口:获取外网IP(apiCode 632,接入点 1) · 免费 · POST/GET · JSON · 适用:前端、数据可视化工程师 · 阅读约 6 分钟
## 核心要点
- 接口返回 `lnt`(经度)/ `lat`(纬度),可直接在地图底图上标点。
- 文档未声明坐标系(WGS-84 还是 GCJ-02),在国内底图上标点前需确认,必要时做坐标转换。
- 多个访问者时,把每次返回的坐标聚合成点阵/热力图,就是访问者分布图。
## Why:把 IP 变成地图上的点
"我们的用户遍布哪些城市"用表格能说清,但用地图一眼就懂。获取外网IP 返回的经纬度,正好让你把每个访问者标到地图上——无论是后台运营大屏,还是给老板看的一页汇报。
## What:坐标系与字段速览
| 项 | 值 |
|----|----|
| 经度字段 | `lnt`(注意不是 `lat`) |
| 纬度字段 | `lat` |
| 国家短码 | `en_name_short`(如 `CN`),**不是纬度** |
| 坐标系 | ⚠️ 文档未声明,国内底图(高德/百度)多为 GCJ-02,需以官方为准确认 |
## How:前端 fetch 后地图标点
以高德地图 JS API 为例(坐标系转换仅示意,请按官方确认):
```html
<!-- 后端转发获取外网IP(避免 AppKey 暴露),返回 {lng, lat} -->
<script>
async function markVisitor(map) {
const res = await fetch("/api/my-ip"); // 你的后端转发获取外网IP
const { lng, lat } = await res.json();
// 若接口返回 WGS-84 而底图为 GCJ-02,需先做坐标转换(此处省略,以官方为准)
const marker = new AMap.Marker({ position: [parseFloat(lng), parseFloat(lat)] });
map.add(marker);
}
</script>
```
服务端转发(Node.js):
```javascript
import express from "express";
import fetch from "node-fetch";
const APP_KEY = "YOUR_APPKEY"; // 服务端持有,不暴露给前端
const app = express();
app.get("/api/my-ip", async (req, res) => {
try {
const r = await fetch(
`https://route.showapi.com/632-1?appKey=${APP_KEY}`,
{ method: "POST", headers: { "content-type": "application/x-www-form-urlencoded" } }
);
const data = await r.json();
if (data.showapi_res_code !== 0) return res.status(502).json({ error: data.showapi_res_error });
const b = data.showapi_res_body;
res.json({ lng: b.lnt, lat: b.lat, region: b.region, city: b.city });
} catch (e) {
res.status(502).json({ error: String(e) });
}
});
app.listen(3000);
```
多访问者分布:把每次返回的 `[lng, lat]` 收集成数组,逐一点 marker,或转热力图 `AMap.HeatMap`。
## 返回示例与解析
```json
{
"showapi_res_code": 0,
"showapi_res_body": {
"lnt": "102.712251",
"lat": "25.040609",
"region": "云南",
"city": "昆明"
}
}
```
标点坐标取 `lng = parseFloat(lnt)`、`lat = parseFloat(lat)`;`region`/`city` 可标在气泡上做文字说明。
## 进阶 / 边界
- **坐标系转换(重要)**:国内主流地图底图使用 GCJ-02(火星坐标),若接口返回的是 WGS-84,直接标点会有数百米偏移。请在集成前以官方文档确认为准,必要时用成熟的坐标转换库。
- **空坐标**:内网/IDC 出口可能返回空 `lnt`/`lat`,标点前做非空 + 数值校验,跳过无效点。
- **批量性能**:大量访问者建议服务端聚合后再下发,前端只渲染聚合结果,避免一次性打上万 marker。
## FAQ
**Q:为什么标点偏了几百米?**
A:大概率是坐标系不一致(WGS-84 vs GCJ-02)。文档未声明接口坐标系,集成前请向官方确认,必要时转换。
**Q:`en_name_short` 能当纬度用吗?**
A:不能。它是国家英文短码(CN/Local),纬度字段是 `lat`,经度是 `lnt`。详见[返回字段全解](https://www.showapi.com/guides/getip-fields-632)。
**Q:内网访问时坐标全空怎么办?**
A:属正常:内网出口无公网坐标。建议对 `lnt`/`lat` 为空的点跳过或单独归类,不影响公网用户标点。
**Q:前端能直接调接口拿坐标吗?**
A:不推荐——AppKey 会暴露且可能跨域。应由后端转发,前端只拿你自己的 `/api/my-ip`。
## 相关能力 / 下一步阅读
- [获取外网IP:返回字段全解(IP / 经纬度 / 归属地 / 运营商)](https://www.showapi.com/guides/getip-fields-632)
- [获取外网IP:用户地域分布分析怎么做(市场地域分析实战)](https://www.showapi.com/guides/getip-geo-analysis-632)
- **本系列共 8 篇**:查看[获取外网IP 指南总目录](https://www.showapi.com/guides/getip-guides-632)