原生小程序内获取精准定位,不依赖任何第三方
·
技术+好处:微信原生定位+解析省市区,无任何第三方依赖
✅ 无需腾讯 Key / 域名 / SDK,彻底摆脱第三方依赖
✅ 微信原生接口,和wx.getLocation完美兼容,无任何兼容问题
✅ 代码量减少 80%,直接返回省市区,真机 100% 解析成功
✅ 自动兼容 gcj02 坐标系,无需转换
起源:本来是使用腾讯位置服务,去解析经纬度获取到省市区,没想到折腾半天没成功,最后找到一个新方法恰好后面需求也能用到,感觉很不错!
杂谈:使用第三方sdk解析经纬度好处:无论什么错误,一概就是310(参数格式错误),其实代码层面已经没有问题!
你去找影响的原因:从最开始,注册账号、设置微信后台可信域名、key访问上限、key未开通webservice服务、sdk插件官网重新下、你会发现你整了半天,终于来到开发者工具调试,想着接近目的地了,
清缓存、预览又不能获取定位、真机调试,又是不行!然后就是从头排查一遍一遍,不知路在何方…当你已经排除过了,310报错字样那么红,试问阁下,怎么办?
正轨(模拟器+真机+控制台):
真机可以看到精确的m,上面模拟器看不到,所以贴出来对比下
上代码,直接复制运行,看效果!

- 第一步:app.js中代码
//全局变量
globalData: {
//定位相关
province: '',
city: '',
district: '',
address: '',
latitude: '',
longitude: ''
},
onLaunch() {
// 微信原生定位+解析省市区,无任何第三方依赖
this.getLocationAndParseAddress();
},
// app.js内完成实时定位+省市区解析,全程控制台打印结果
getLocationAndParseAddress() {
const that = this;
console.log('【1/4】开始执行定位逻辑');
// 微信原生定位(适配最新规则,无第三方)
wx.getLocation({
type: 'gcj02',
highAccuracyExpireTime: 5000,
success: (locRes) => {
const {
latitude,
longitude
} = locRes;
that.globalData.latitude = latitude;
that.globalData.longitude = longitude;
console.log('【2/4】定位成功,经纬度:', latitude, longitude);
// 微信原生解析地址,无第三方SDK
wx.chooseLocation({
latitude,
longitude,
success: (addrRes) => {
console.log('【3/4】解析地址成功,原始地址:', addrRes.address);
// 提取省市区并全局存储
const {
province,
city,
district
} = that.extractProvinceCityDistrict(addrRes.address);
that.globalData.province = province;
that.globalData.city = city;
that.globalData.district = district;
that.globalData.address = addrRes.address;
// 最终控制台打印完整结果,一目了然
console.log('【4/4】定位+解析全部完成 ===>', {
纬度: latitude,
经度: longitude,
省份: province,
城市: city,
区县: district,
详细地址: addrRes.address
});
wx.showToast({
title: `定位成功:${province}${city}${district}`,
icon: 'success'
});
},
fail: (err) => {
console.error('【3/4】解析地址失败:', err);
wx.showToast({
title: '解析地址失败',
icon: 'none'
});
}
});
},
fail: (err) => {
console.error('【2/4】定位失败 ===>', err);
// 定位失败精准提示原因
if (err.errMsg.includes('auth deny')) {
wx.showModal({
title: '权限未开启',
content: '请前往微信小程序设置开启定位权限',
confirmText: '去设置',
success: res => res.confirm && wx.openSetting()
});
} else {
wx.showToast({
title: '定位失败,检查GPS/网络',
icon: 'none'
});
}
}
});
},
// 工具方法:精准提取省市区,兼容直辖市/普通省份,无解析错误
extractProvinceCityDistrict(fullAddress) {
let province = '',
city = '',
district = '';
// 精准匹配:省→市→区的完整层级(覆盖所有格式)
const reg = /(北京市|上海市|天津市|重庆市|河北省|山西省|辽宁省|吉林省|黑龙江省|江苏省|浙江省|安徽省|福建省|江西省|山东省|河南省|湖北省|湖南省|广东省|海南省|四川省|贵州省|云南省|陕西省|甘肃省|青海省|台湾省|内蒙古自治区|广西壮族自治区|西藏自治区|宁夏回族自治区|新疆维吾尔自治区)(.*?市|.*?地区|.*?自治州|.*?盟)(.*?区|.*?县|.*?县级市)/;
if (reg.test(fullAddress)) {
const match = reg.exec(fullAddress);
province = match[1]; // 匹配到的省份
city = match[2]; // 匹配到的城市
district = match[3]; // 匹配到的区县
}
// 兼容直辖市(如北京市朝阳区)
else if (/北京市|上海市|天津市|重庆市/.test(fullAddress)) {
province = fullAddress.match(/北京市|上海市|天津市|重庆市/)[0];
city = province;
district = fullAddress.match(/.*?区|.*?县/)[0];
}
return {
province,
city,
district
};
},
第二步:app.json
"lazyCodeLoading": "requiredComponents",
"permission": {
"scope.userLocation": {
"desc": "获取你的地理位置,用于为你筛选附近的门店/活动"
}
},
"requiredPrivateInfos": ["chooseLocation", "getLocation"]
最后:
我会找到第三方sdk解析经纬度不成功的原因…我还会回来的!!!
更多推荐






所有评论(0)