技术博客
获取外网IP:用经纬度在地图上标出访问者位置

获取外网IP:用经纬度在地图上标出访问者位置

作者: 万维易源
2026-09-02
获取外网IP地图标点经纬度可视化高德地图
# 获取外网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)