微信小程序使用wx.chooseLocation返回的数据没有省份的处理方法

微信小程序使用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>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值