技术博客
全球IP地址查询:返回字段全解(area/country/city/lnt/lat 一文读懂)

全球IP地址查询:返回字段全解(area/country/city/lnt/lat 一文读懂)

作者: 万维易源
2026-08-27
全球IP地址查询返回字段IP归属地
# 全球IP地址查询:返回字段全解(area/country/city/lnt/lat 一文读懂) > 元信息:接口 全球IP地址查询(apiCode=20)· 接入点 20/1、20/2 · 免费 · 返回 JSON · 适用人群 开发者/数据分析 · 阅读时间 6 分钟 ## TL;DR 快速概览 - 所有业务字段都在 `showapi_res_body` 内;系统级字段(`showapi_res_code` 等)在外层。 - 核心字段:`country`(国家)、`region`(省)、`city`(市)、`county`(区县)、`isp`(运营商)、`lnt`/`lat`(经纬度)、`city_code`(行政区划编码)。 - 文档返回体表格**漏列**了 `continents`/`en_name`/`en_name_short`,实际返回里会有;`area`(片区)仅部分国内 IP 返回。 ## Why:为什么要把字段读透 字段读错 = 线上 bug。比如把 `lnt` 当纬度、把 `county` 空串当异常、以为每个 IP 都有 `area`……这些都会让前端显示错位或报警误发。本文把实测返回结构一次讲清,并标注文档与示例不一致的地方。 ## What:返回结构速览 系统级(外层)与业务级(`showapi_res_body`)两层: | 层级 | 字段 | 说明 | |------|------|------| | 系统级 | `showapi_res_code` | 0 成功,非 0 系统错误 | | 系统级 | `showapi_res_error` | 系统错误信息 | | 系统级 | `showapi_res_id` | 本次请求 id | | 业务级 | `showapi_res_body` | 归属地数据对象,见下 | `showapi_res_body` 字段(含文档表未列、但示例实际返回的字段): | 字段 | 类型 | 示例 | 说明 | 是否每次返回 | |------|------|------|------|------| | `country` | String | 中国 | 国家 | 是 | | `region` | String | 广东 | 省级 | 是 | | `city` | String | 东莞 | 市级 | 是 | | `county` | String | (空串) | 区县级/乡镇级 | 是(可为空串) | | `isp` | String | 电信 | 运营商 | 是 | | `area` | String | 西南 | 片区 | 否(部分国内 IP 才有) | | `city_code` | String | 441900 | 我国行政区划编码 | 是 | | `lnt` | String | 113.760234 | 经度 | 是 | | `lat` | String | 23.048884 | 纬度 | 是 | | `continents` | String | 亚洲 | 所在洲 | 是(文档表未列) | | `en_name` | String | China | 英文国家名 | 是(文档表未列) | | `en_name_short` | String | CN | 英文国名缩写 | 是(文档表未列) | | `ret_code` | String | 0 | 0 成功,其他失败 | 是 | ## How:解析时怎么写才稳 ```python body = data["showapi_res_body"] # 1) 先判断业务成功 if body.get("ret_code") != "0": print("查询失败:", body.get("ret_code")) # 2) 字段按"可能缺失"取,避免 KeyError country = body.get("country", "") region = body.get("region", "") city = body.get("city", "") isp = body.get("isp", "") area = body.get("area") # 可能为 None lng = body.get("lnt") # 经度 lat = body.get("lat") # 纬度 code = body.get("city_code", "") # 3) 海外 IP 同样有 continents/en_name/en_name_short print(area, country, region, city, isp, lng, lat, code) ``` ## 返回示例(20/1,含文档表外字段) ```json { "showapi_res_code": 0, "showapi_res_error": "", "showapi_res_body": { "region": "广东", "county": "", "isp": "电信", "continents": "亚洲", "en_name": "China", "city_code": "441900", "lnt": "113.760234", "lat": "23.048884", "en_name_short": "CN", "city": "东莞", "country": "中国" } } ``` > 注:文档返回体表格还列了 `area`(片区,示例"西南"),但上例未出现,说明 `area` 仅部分 IP 返回;`county` 文档在 20/1 标"县级"、在 20/2 标"乡镇",属同一字段的两种描述,统一按"区县级"理解即可。 ## 进阶 / 边界 - **坐标系未声明**:`lnt`/`lat` 文档未说明采用 GCJ-02 / WGS-84 / BD-09 哪一套,是数据库近似坐标。画地图前请先做坐标系确认或转换(见[如何用 lnt/lat 在地图上标点](https://www.showapi.com/guides/ip-geo-coordinate-map-20))。 - **经纬度是字符串**:返回里 `lnt`/`lat` 是字符串类型,画图前需 `float()` 转换。 - **`county` 空串常态**:大量 IP 精确到市级即止,`county` 为空串,不要当错误。 ## FAQ **Q1:为什么有时候没有 `area` 字段?** A:`area`(片区) 仅部分国内 IP 返回,海外或某些 IP 不返回。代码用 `body.get("area")` 容错,不要假设它一定存在。 **Q2:`lnt` 和 `lat` 哪个是经度?** A:`lnt` 是经度(longitude),`lat` 是纬度(latitude)。二者都是字符串,需转 float 再用于地图。 **Q3:文档表格没写的 continents/en_name 是什么?** A:它们确实在真实返回里(示例 JSON 已包含):`continents` 是所在洲、`en_name` 是英文国名、`en_name_short` 是国名缩写(如 CN)。这是文档返回体表格的遗漏,实际调用会返回。 **Q4:返回的经纬度准吗?** A:文档未声明坐标系,坐标为 IP 库近似位置,适合大致区域判断与标注,不适合高精度测绘或导航。 **Q5:`city_code` 是什么编码?** A:我国行政区划编码(如 441900=东莞、110100=北京),可与国标行政区划表对照做区县聚合。 ## 相关能力 / 下一步阅读 - [5 分钟接入全球IP地址查询](https://www.showapi.com/guides/ip-geo-quickstart-20) — 先跑通再回来读字段 - [全球IP地址查询:如何用 lnt/lat 在地图上标点](https://www.showapi.com/guides/ip-geo-coordinate-map-20) — 坐标实战 - [全球IP地址查询接入点详解:IP → 归属地定位(20-1)](https://www.showapi.com/guides/ip-geo-ip-query-20) — 单接入点深入 - **本系列共 10 篇**:查看[全球IP地址查询指南总目录](https://www.showapi.com/guides/ip-geo-guides-20)