高德地图adcode实战:打造智能城市选择器的完整指南
每次开发需要用户填写地址的表单时,最头疼的就是那个省市区三级联动的下拉框。手动维护城市列表不仅耗时,还容易出错。去年我们电商项目就因为手动维护的地址数据有误,导致一批订单配送出错,损失不小。后来发现高德地图的adcode接口简直就是救星——它提供了标准化的行政区划编码,还能自动更新。
1. 理解adcode:高德地图的城市编码体系
adcode(Administrative Division Code)是高德地图对国内行政区划的唯一编码系统。这套编码由6位数字组成,前两位代表省份,中间两位代表城市,最后两位代表区县。比如:
- 北京市:110000
- 上海市:310000
- 广东省广州市:440100
- 深圳市南山区:440305
与常见的邮政编码不同,adcode有几个显著特点:
- 层级明确:编码结构直接反映行政隶属关系
- 全国覆盖:包含省、市、县三级完整数据
- 官方维护:高德定期更新行政区划变更
注意:adcode与citycode不同,后者是电话区号,而adcode是纯粹的地理编码系统
实际项目中,我们通常需要处理这样的数据结构:
json复制{
"name": "广东省",
"adcode": "440000",
"districts": [
{
"name": "广州市",
"adcode": "440100",
"districts": [
{"name": "天河区", "adcode": "440106"},
{"name": "越秀区", "adcode": "440104"}
]
}
]
}
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 获取adcode数据的三种方式
2.1 官方API直接调用
高德提供了行政区划查询API,这是最动态的方式:
javascript复制// 获取省级数据
fetch(`https://restapi.amap.com/v3/config/district?keywords=中国&subdistrict=1&key=您的高德KEY`)
.then(response => response.json())
.then(data => console.log(data.districts[0].districts));
参数说明:
| 参数 | 必填 | 说明 |
|---|---|---|
| keywords | 是 | 查询关键字,全国数据用"中国" |
| subdistrict | 是 | 子级行政区划层级:1-3 |
| key | 是 | 高德开发者KEY |
| extensions | 否 | 返回结果扩展:base/all |
2.2 下载离线JSON文件
对于需要离线使用的场景,可以从高德开放平台下载完整的行政区划JSON文件。我们团队维护了一个定期更新的Gist:
bash复制wget https://gist.githubusercontent.com/username/xxxx/raw/cities.json
2.3 数据库存储方案
对于大型应用,建议将adcode存入数据库。这是我们的MySQL表结构设计:
sql复制CREATE TABLE `amap_adcode` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`adcode` varchar(6) NOT NULL,
`parent_id` int(11) DEFAULT NULL,
`level` tinyint(1) NOT NULL COMMENT '1-省 2-市 3-区县',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_adcode` (`adcode`),
KEY `idx_parent` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 构建智能城市选择器
3.1 基础三级联动实现
使用Vue+ElementUI的典型实现:
html复制<template>
<div>
<el-select v-model="province" @change="handleProvinceChange">
<el-option
v-for="item in provinces"
:key="item.adcode"
:label="item.name"
:value="item.adcode"
