技术+好处:微信原生定位+解析省市区,无任何第三方依赖
✅ 无需腾讯 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解析经纬度不成功的原因…我还会回来的!!!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐