uni.getLocation仅返回经纬度,需调用高德逆地理编码API(/v3/geocode/regeo)传location=经度,纬度和key获取adcode;百度API存在跨域、401及city_code为空等问题;adcode为国标6位行政区划码,业务城市ID应由后端映射。

uni.getLocation 拿到的是经纬度,不是城市编码
uni-app 的 uni.getLocation 只返回 latitude 和 longitude,没有内置字段能直接拿到城市编码(比如高德的 adcode 或百度的 city_id)。必须调用地图服务商的「逆地理编码 API」,把坐标转成结构化地址信息。
用高德逆解析接口获取 adcode 最可靠
高德地图的 https://restapi.amap.com/v3/geocode/regeo 支持返回 adcode(行政区划代码),且对 uni-app 友好:支持 HTTPS、无需服务端中转(可配白名单后前端直连)、文档清晰。
实操要点:
- 在 高德开放平台 创建应用,开启「Web 服务 API」,添加 uni-app 的
h5域名或小程序 AppID 到「Web 服务授权域名」 - 请求参数必传:
location=经度,纬度(注意顺序是“经,纬”,和uni.getLocation返回的longitude,latitude一致) - 加
extensions=base即可返回adcode;用extensions=all还能拿到更细的district、city等字段 - 别漏掉
key参数,否则返回"infocode":"10007"错误
简单示例:
uni.getLocation({
type: 'gcj02',
success: (res) => {
const url = `https://restapi.amap.com/v3/geocode/regeo?location=${res.longitude},${res.latitude}&extensions=base&key=YOUR_AMAP_KEY`;
uni.request({ url, success: (r) => {
const adcode = r.data.regeocode.addressComponent.adcode;
console.log('城市编码:', adcode);
}});
}
});
uni-app 调用百度逆解析会跨域或 401
百度地图 Web 服务 API 默认禁止前端直连,uni-app 的 H5 端发请求会被浏览器拦截(CORS),小程序端也可能因 referer 校验失败返回 "status":401。即使配置了 referer 白名单,百度对小程序的支持也不稳定。
常见错误现象:
- H5 页面控制台报
Failed to fetch或No 'Access-Control-Allow-Origin' - 小程序里
uni.request返回status: 401,提示"message":"Referer is not allowed" - 即使绕过 referer(如用云函数中转),百度返回的
city_code字段值常为空或不标准
adcode 不等于城市 ID,注意使用场景
高德的 adcode 是国家统计局标准的 6 位行政区划代码(如北京市是 110000,朝阳区是 110105),但很多业务系统用的「城市 ID」是自家定义的数字或字符串(如美团用 1 表示北京)。别直接拿 adcode 当作业务侧的城市 ID 传给后端。
容易踩的坑:
- 后端没按国标设计城市表,直接用
adcode查询导致查不到数据 - 前端缓存了
adcode,但用户切换定位后没重新解析,导致城市编码滞留旧值 - 用户开了飞行模式或定位失败时,
uni.getLocation报错,但代码没兜底,后续逆解析直接崩掉
真要对接业务城市 ID,建议后端提供一个 /api/city/match?adcode=110105 映射接口,前端只管传 adcode,由后端决定怎么映射。











