必须显式处理授权、坐标系和地址解析三处硬伤:先用uni.getSetting检查scope.userLocation权限,拒绝时调uni.openSetting引导;统一数据结构,手动选点提取name/address/lat/lng/city,自动定位后调高德逆地理编码补全;地图跳转需mapContext.moveToLocation且确保组件已挂载。

直接用 uni.chooseLocation + uni.getLocation 组合就能实现,但必须处理好「授权链路断裂」「坐标系错配」「地址解析缺失」这三处硬伤,否则用户点一次就卡住或返回空数据。
为什么 uni.chooseLocation 有时返回空对象或 fail?
这不是 API 失效,而是微信小程序对地理位置授权做了更严格的 runtime 检查:用户首次点击地图图标时,uni.chooseLocation 会静默尝试拉起定位,但若未提前申请 scope.userLocation 权限,它不会弹授权框,而是直接走 fail 回调。
- 必须在触发前显式调用
uni.getSetting判断权限状态,不能依赖chooseLocation自动唤起授权 - 如果
authSetting['scope.userLocation'] === false,得立刻调uni.openSetting引导用户手动开启——uni.authorize在微信里对位置权限无效 - 真机调试时,iOS 模拟器可能返回假坐标(如 0,0),Android 真机若未开启 GPS 或高精度模式,也可能超时失败
怎么让「当前定位」和「手动选点」返回的数据结构一致?
uni.getLocation 返回的是经纬度 + 速度 + 精度,uni.chooseLocation 返回的是经纬度 + 名称 + 地址 + 城市,二者字段不兼容。收货地址模块需要统一字段才能复用渲染逻辑。
- 手动选点后,把
res.address、res.name、res.latitude、res.longitude提取为标准地址对象,例如:{ name: res.name, address: res.address, lat: res.latitude, lng: res.longitude, city: res.city } - 自动定位成功后,必须调高德或腾讯的逆地理编码 API(如
https://restapi.amap.com/v3/geocode/regeo)补全address和city字段;uni.getLocation的geocode: true参数仅 App 支持,H5 和小程序不生效 - 注意坐标系:微信小程序默认用 gcj02,高德 API 也要求 gcj02,别传 wgs84 坐标进去,否则地址解析偏移几公里
切换地址后,地图组件如何同步跳转并标记?
uni-app 的 <map> 组件不支持响应式 longitude/latitude 更新,直接改 data 不会重绘中心点。
- 必须用
mapContext.moveToLocation主动触发跳转,且需确保 map 组件已挂载(ref可用后再调) - 标记点要用
mapContext.includePoints或markers数组控制,不要靠show-location属性——它只显示用户当前位置,不是你选的地址 - 如果页面有多个地址候选(如历史收货地列表),每次切换都要清空旧 marker 并重设新 marker,避免残留图标
最易被忽略的是逆地理编码的兜底逻辑:高德 API 调用失败时,不能留空地址字段,至少拼接 res.latitude.toFixed(6) + ',' + res.longitude.toFixed(6) 作为 fallback,否则订单提交会因地址不完整被后端拦截。



















