小程序切换城市名同时切换地图定位

1,353 阅读3分钟

最近接到一个需求,要求切换城市名的时候同时切换地图的经纬度定位 最后实现的效果是 切换到那个市区,地图就会定位到该城市的中心经纬度

预览如下

1丶 要是实现这个效果 得先准备一个地区选择器。

这里我用的是一个组件从github上找的 https://github.com/staven630/wx-city-picker/issues
这里有个问题 就是组价渲染了 然后字是白色的,可以自己调整一下 
下图中的信息都能在文档中找到,就不在赘述

2 丶 数据源的获取

要获得全国所有的省市区,可以从后端获取,也可以自己从腾讯的sdk获取,这里我建议是前端自己获取。就不劳烦后端了
在这里申请 key  

腾讯地图Sdk 然后配置WebService 权限 那个key后面用得着

1 获取全国数据 然后进行处理 适用组件
   var QQMapWX = require('../../utils/qqmap-wx-jssdk.min.js'); // 这个js你可以在官网下载 也可以使用行政区划那个api不需要下载额外的js文件
   var qqmapsdk = new QQMapWX({
     key: '你申请的key值' // 必填
   });
   
   // onLoad 函数中 处理获取的地区信息
     //调用获取城市列表接口
   qqmapsdk.getCityList({
     success: function (res) {//成功后的回调
       res.result[0].map((item,index)=>{
         res.result[1].map((item1, index1)=>{
           let name1 = item.id.slice(0, 2)
           let name2 = item1.id.slice(0, 2)
           if(name1 == name2 ){
             if (!item.children){
               item.children=[]
             }
              item.children.push(item1)
            }
           })
       })
       console.log("准备就绪位置", res.result[0])
       _this.setData({
       // 这里获得的数据  会带有该地区的经纬度 我只要定位要市级 所以我只保存了市级的信息
         citys: res.result[0],
         citysChid:res.result[1]
       })
     },
   

到这里全国省市区的信息已经拿到了。 选择器也有信息了 我建议是进来的时候有个默认定位当前地区,代码可以参考

wx.getLocation({
     altitude:true,
     success:function(e){
       let latitude = e.latitude;
       let longitude = e.longitude;
       _this.setData({
         newLoacl:e
       })
       //  地图逆向解析
       wx.request({
         url: `https://apis.map.qq.com/ws/geocoder/v1/?location=${latitude},${longitude}&key=你的key值`,
         success:res=>{
           let newList = [res.data.result.address_component.province, res.data.result.address_component.city]
           console.log('获取当前位置 经纬度')
           _this.setData({
             region: newList
           },()=>{
             _this.getLoaclList()
           })
         }
       })

     }
   })

2丶 地图map组件

小程序自带的地图map组件不用多说  这里我们动态绑定他的初始经纬度,在每一次选择了地图之后都会切换一次就OK了

```
//newLoacl 对象里携带着他的经纬度信息
<map id="map" class="allMap" longitude="{{newLoacl.longitude}}" latitude="{{newLoacl.latitude}}"  scale="14"  bindcontroltap="controltap" show-location style="width: 100%; height: 300px;"></map>
```

3丶 联动

选择器触发 onSelect 事件  里面会有你选择的地区位置的id  
也可以去改源码 把选择的哪一项的全部信息传出
或者然后去遍历你保存的地区数组信息

然后拿到当前位置的经纬度

  onSelect:function(e){
    var _this=this
      let  str={}
      //遍历获取经纬度信息
    _this.data.citysChid.map((item,index)=>{
      if (e.detail.code[1] == item.id){
        str=item
      }
    })
    let  newlocal={
      longitude: str.location.lng,
      latitude: str.location.lat
    }
        // 更新位置信息
      this.setData({
        newLoacl: newlocal
      },()=>{
      
      })
 
  },

里面有一些细节部分 有所出入,但大体应该是这样的,那个数据源获取是关键,我建议是也可以从后台,也可以都用腾讯的,还行吧。