微信小程序使用wx.chooseLocation返回的数据没有省份的处理方法
遇到的问题:
第一个坑: 使用wx.chooseLocation获取地址,当输入地址时,有时候第一个搜索结果没有省市区信息,选择第一个时报错;错误信息如下
解决方案: 当选择没有返回省份的地址时,根据返回的经纬度去获取地址,将获取的地址再次执行一次,就能成功拿到或者切换地址了
源代码(报错的代码)
function chooseLocation(){
wx.chooseLocation({
success:function(res){
console.log('地址信息: ', res);
var regex = /^(北京市|天津市|重庆市|上海市|香港特别行政区|澳门特别行政区)/;
var REGION_PROVINCE=[];
var addressBean = {
REGION_PROVINCE:null,
REGION_COUNTRY:null,
REGION_CITY:null,
ADDRESS:null};
function regexAddressBean(address, addressBean){
regex = /^(.*?[市州]|.*?地区|.*?特别行政区)(.*?[市区县])(.*?)$/g;
var addxress = regex.exec(address);
addressBean.REGION_CITY=addxress[1];
addressBean.REGION_COUNTRY=addxress[2];
addressBean.ADDRESS=addxress[3]+"("+res.name+")";
}
if(!(REGION_PROVINCE = regex.exec(res.address))){
regex = /^(.*?(省|自治区))(.*?)$/;
REGION_PROVINCE = regex.exec(res.address);
console.log('是否有省份: ', REGION_PROVINCE);
if (!REGION_PROVINCE) { // 没有省份和自治州时,根据返回的经纬度获取新地址
const latitude = res.latitude
const longitude = res.longitude
let location={
latitude,
longitude
}
qmapsdk.reverseGeocoder({
location:location,
sig:"0P5KMyVUQyftieppAGHhti5Ul5T5dqC",
success: function(res) {
regex = /^(.*?(省|自治区))(.*?)$/;
REGION_PROVINCE = regex.exec(res.result.address);
addressBean.REGION_PROVINCE= REGION_PROVINCE[1];
regexAddressBean(REGION_PROVINCE[3],addressBean);
},
fail: function(error) {
wx.hideLoading()
wx.showToast({
title: "地址解析失败,请稍后重试",
icon: 'none',
duration: 5000,
});
}
})
} else {
addressBean.REGION_PROVINCE= REGION_PROVINCE[1];
regexAddressBean(REGION_PROVINCE[3],addressBean);
}
} else {
addressBean.REGION_PROVINCE= REGION_PROVINCE[1];
regexAddressBean(res.address, addressBean);
}
setTimeout(() => {
callBack(addressBean)
}, 800);
},
fail:function(){
}
})
}
修改后的代码
function chooseLocation(){
wx.chooseLocation({
success:function(res){
console.log('地址信息: ', res);
var regex = /^(北京市|天津市|重庆市|上海市|香港特别行政区|澳门特别行政区)/;
var REGION_PROVINCE=[];
var addressBean = {
REGION_PROVINCE:null,
REGION_COUNTRY:null,
REGION_CITY:null,
ADDRESS:null};
function regexAddressBean(address, addressBean){
regex = /^(.*?[市州]|.*?地区|.*?特别行政区)(.*?[市区县])(.*?)$/g;
var addxress = regex.exec(address);
addressBean.REGION_CITY=addxress[1];
addressBean.REGION_COUNTRY=addxress[2];
addressBean.ADDRESS=addxress[3]+"("+res.name+")";
}
if(!(REGION_PROVINCE = regex.exec(res.address))){
regex = /^(.*?(省|自治区))(.*?)$/;
REGION_PROVINCE = regex.exec(res.address);
console.log('是否有省份: ', REGION_PROVINCE);
if (!REGION_PROVINCE) { // 没有省份和自治州时,根据返回的经纬度获取新地址
const latitude = res.latitude
const longitude = res.longitude
let location={
latitude,
longitude
}
qmapsdk.reverseGeocoder({
location:location,
sig:"0P5KMyVUQyftieppAGHhti5Ul5T5dqC",
success: function(res) {
regex = /^(.*?(省|自治区))(.*?)$/;
REGION_PROVINCE = regex.exec(res.result.address);
addressBean.REGION_PROVINCE= REGION_PROVINCE[1];
regexAddressBean(REGION_PROVINCE[3],addressBean);
},
fail: function(error) {
wx.hideLoading()
wx.showToast({
title: "地址解析失败,请稍后重试",
icon: 'none',
duration: 5000,
});
}
})
} else {
addressBean.REGION_PROVINCE= REGION_PROVINCE[1];
regexAddressBean(REGION_PROVINCE[3],addressBean);
}
} else {
addressBean.REGION_PROVINCE= REGION_PROVINCE[1];
regexAddressBean(res.address, addressBean);
}
setTimeout(() => {
callBack(addressBean)
}, 800);
},
fail:function(){
}
})
}
改变之处
第二个坑: 正则表达式匹配问题;当输入的城市没有区时,也会报错,例如输入东莞市
报错位置:
修改: 多加一个判断,处理没有匹配到区的情况
两次优化后的最终代码
function chooseLocation() {
wx.chooseLocation({
success: function(res) {
var regex = /^(北京市|天津市|重庆市|上海市|香港特别行政区|澳门特别行政区)/;
var REGION_PROVINCE = [];
var addxress = '' // 匹配市区县
var addressBean = {
REGION_PROVINCE: null,
REGION_COUNTRY: null,
REGION_CITY: null,
ADDRESS: null};
function regexAddressBean(address, addressBean) {
console.log('address: ', address);
regex = /^(.*?[市州]|.*?地区|.*?特别行政区)(.*?[市区县])(.*?)$/g;
addxress = regex.exec(address);
if (!addxress) { // 没有区县的情况,直接匹配地址
regex = /^(.*?[市州]|.*?地区|.*?特别行政区)(.*?[道镇]|.*?管委会|.*?生态园)(.*?)$/g; // 东莞市的区是以 道/镇/管委会/生态园
addxress = regex.exec(address);
console.log('addxress: ', addxress);
addressBean.REGION_CITY = addxress[1];
addressBean.REGION_COUNTRY = addxress[2];
addressBean.ADDRESS = addxress[3]+"("+res.name+")"
} else {
addressBean.REGION_CITY = addxress[1];
addressBean.REGION_COUNTRY = addxress[2];
addressBean.ADDRESS = addxress[3]+"("+res.name+")";
}
}
if (!(REGION_PROVINCE = regex.exec(res.address))) {
regex = /^(.*?(省|自治区))(.*?)$/;
REGION_PROVINCE = regex.exec(res.address);
if (!REGION_PROVINCE) { // 没有省份和自治州时,根据返回的经纬度获取新地址
console.log('没有省份:', REGION_PROVINCE)
const latitude = res.latitude
const longitude = res.longitude
let location={
latitude,
longitude
}
qmapsdk.reverseGeocoder({
location:location,
sig:"0P5KMyVUQyftieppAGHhti5Ul5T5dqC",
success: function(res) {
regex = /^(.*?(省|自治区))(.*?)$/;
REGION_PROVINCE = regex.exec(res.result.address);
addressBean.REGION_PROVINCE= REGION_PROVINCE[1];
regexAddressBean(REGION_PROVINCE[3],addressBean);
},
fail: function(error) {
wx.hideLoading()
wx.showToast({
title: "地址解析失败,请稍后重试",
icon: 'none',
duration: 5000,
});
}
})
} else {
console.log('有省份:', REGION_PROVINCE)
addressBean.REGION_PROVINCE= REGION_PROVINCE[1];
regexAddressBean(REGION_PROVINCE[3],addressBean);
}
} else {
addressBean.REGION_PROVINCE = REGION_PROVINCE[1];
regexAddressBean(res.address, addressBean);
}
setTimeout(() => {
callBack(addressBean);
}, 800);
},
fail: function() {
}
});
}
改变之处
以上代码是封装在公共文件中的代码
页面中引用
js:
/**
* 打开定位
*/
import tools from "../../tools/tools.js";
methods: {
openLocation() {
let that = this;
function callBack(addressBean) {
console.log('获取到地址信息:', addressBean.REGION_PROVINCE);
let province = addressBean.REGION_PROVINCE;
let city = addressBean.REGION_CITY;
let area = addressBean.REGION_COUNTRY;
let Address = addressBean.ADDRESS;
if (province == city) { // 直辖市
that.reserveForm.address = `${city}${area}${Address}`
} else {
that.reserveForm.address = `${province}${city}${area}${Address}`
}
}
openLocation(callBack);
},
}
wxml:
<view class="icon_wrap" @click="openLocation">
<image class="icon_location" src="./icon/location.png"/>
</view>