<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      uniapp+騰訊地圖map 實現附近點吸附

      思路

      uniapp的map組件與騰訊地圖微信小程序sdk均未提供點位吸附,因此思路為,通過地圖拖動事件監聽地圖中心點,再計算該點與所有Markers點的距離,獲取距離最短的marker對象,然后將地圖中心設置為該marker即可

      uniapp Map:

      https://uniapp.dcloud.net.cn/component/map.html#map

      騰訊地圖微信小程序SDK

      https://lbs.qq.com/miniProgram/jsSdk/jsSdkGuide/jsSdkOverview

      效果:

       

      下載sdk并引入

      import QQMapWX from '@/static/qqmap/qqmap-wx-jssdk.min.js'

      初始化map對象

      this.qqmap = new QQMapWX({
                      key: ‘yourKey’
                  });

      初始化markers,過程省略,markers參數格式見官方文檔https://uniapp.dcloud.net.cn/component/map.html#marker

      this.markers = [{
          customCallout: {
              anchorX: -10
              anchorY: 10
              display: "ALWAYS"
          },
          callout {
              anchorX: 0
              anchorY: -10
              bgColor: "#FFFFFF"
              borderColor: "#198DFF"
              borderRadius: "10"
              borderWidth: 10
              content: "xxxxx"
              display: "BYCLICK"
              fontSize: 15
          }
          height: "30px"
          iconPath: "../icon.png"
          id: 0
          latitude: "19.982247"
          longitude: "110.343734"
          name: "xxxxx"
          width: "30px"
      }, {
          customCallout: {...},
          callout {...}
          height: "30px"
          iconPath: "../icon.png"
          id: 0
          latitude: "19.982247"
          longitude: "110.343734"
          name: "xxxxx"
          width: "30px"
      },
      ......
      ......]

      渲染地圖并添加移動監視

      <map  class="map" :markers="markers" :scale="13"  :latitude="centerLat" :longitude="centerLng" :show-location="true" id="map" ref="map"
                  @markertap="markertap" @regionchange="changeRegiion" @end="functionName" @begin="functionName" >

      注:map組件的regionchange 事件直接在組件上寫成 @regionchange,同時這個事件也非常特殊,它的 event type 有 begin 和 end 兩個,導致我們無法在handleProxy 中區分到底是什么事件,所以你在監聽此類事件的時候同時監聽事件名和事件類型既 <map @regionchange="functionName" @end="functionName" @begin="functionName"><map>

      "centerLat、centerLng"為當前的中心點坐標

      監聽地圖中心點移動,重新設置中心點到距離最近的點

       注:僅在事件為拖動(drag)和拖動結束(end)時執行

      changeRegiion(e) {
                      if (e.type == 'end' && e.causedBy == 'drag') {
                          let point = {
                              latitude: e.detail.centerLocation.latitude,
                              longitude: e.detail.centerLocation.longitude,
                          }
                          let _self = this;
                          let distanceList = []
                          //1.計算中心離每個點的距離
                          
                          let vmarkers = _self.markers
                          vmarkers.forEach((item, index, ) => {
                              let distance = _self.calculateDistance(item.latitude, item.longitude, point.latitude, point
                                  .longitude);
                              distanceList.push({
                                  name: item.name, 
                                  index: item.id,
                                  distance: distance
                              })
                          })
                          //2.找出距離最近的點
                          let sortedList = distanceList.sort((a, b) => a.distance - b.distance)
      
                          //3.重新設置中心點到該點
                          let markerIndex = sortedList[0].index;
      
                          _self.centerLng = _self.markers[markerIndex].longitude;
                          _self.centerLat = _self.markers[markerIndex].latitude;
                      }
                  }

      計算兩個經緯度之間的距離函數:

                  //計算兩個經緯度距離
                  calculateDistance(lat1, lon1, lat2, lon2) {
                      const radians = Math.PI / 180;
                      const R = 6371; // 地球半徑,單位為千米
      
                      const deltaLat = (lat2 - lat1) * radians;
                      const deltaLon = (lon2 - lon1) * radians;
      
                      lat1 = lat1 * radians;
                      lat2 = lat2 * radians;
      
                      const a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) +
                          Math.cos(lat1) * Math.cos(lat2) *
                          Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2);
                      const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
                      const distance = R * c;
      
                      return distance;
                  }

      PS:上面這樣寫的話,是不論移動到多遠,都會有一個最近的點,即沒有一個吸附距離的設置,如果需要設置吸附距離(距離小于多少才吸附),在計算完畢的距離列表中篩選即可,以2公里為例:

      //小于2公里    
      if
      (sortedList[0].distance<=2){ _self.centerLng = _self.markers[markerIndex].longitude; _self.centerLat = _self.markers[markerIndex].latitude; _self.changeSelectStr(markerIndex); }

      完整的:

      changeRegiion(e) {
                      if (e.type == 'end' && e.causedBy == 'drag') {
                          let point = {
                              latitude: e.detail.centerLocation.latitude,
                              longitude: e.detail.centerLocation.longitude,
                          }
                          let _self = this;
                          let distanceList = []
                          //1.計算中心離每個點的距離
                          
                          let vmarkers = _self.markers
                          vmarkers.forEach((item, index, ) => {
                              let distance = _self.calculateDistance(item.latitude, item.longitude, point.latitude, point
                                  .longitude);
                              distanceList.push({
                                  name: item.name, 
                                  index: item.id,
                                  distance: distance
                              })
                          })
                          //2.找出距離最近的點
                          let sortedList = distanceList.sort((a, b) => a.distance - b.distance)
      
                          //3.重新設置中心點到該點(小于2公里時)    
                           if(sortedList[0].distance<=2){
                          _self.centerLng = _self.markers[markerIndex].longitude;
                          _self.centerLat = _self.markers[markerIndex].latitude;
                          _self.changeSelectStr(markerIndex);
                          }
       } }

      完畢

       

      posted @ 2025-05-30 17:23  陳鵬昱Chen  閱讀(94)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲熟妇无码另类久久久| 欧美一区二区三区欧美日韩亚洲| 亚洲国产精品久久久天堂麻豆宅男| 少妇伦子伦精品无吗| 免费福利视频一区二区三区高清| 久久久久人妻一区精品| 中文字幕日韩国产精品| 三穗县| 99久久精品国产一区色| 亚洲高清WWW色好看美女| 人妻精品动漫H无码中字| 亚洲av日韩av中文高清性色| 免费播放一区二区三区| 午夜福利国产精品视频| 夜夜添无码一区二区三区| 人妻无码ΑV中文字幕久久琪琪布 国产乱人伦AV在线麻豆A | 国产叼嘿视频一区二区三区 | 亚洲av无码片在线播放| 热久久99精品这里有精品| 91高清免费国产自产拍| 国产午夜一区二区在线观看| 国产精品一区二区三区色| 中文字幕亚洲精品人妻| 亚洲一区二区精品动漫| 日本激情久久精品人妻热| 亚洲精品有码在线观看| 久久国产精品波多野结衣| 亚东县| 亚洲熟妇精品一区二区| 女同另类激情在线三区| 少女韩国在线观看完整版免费| 日本精品极品视频在线| 国产丰满麻豆videossexhd| 亚洲综合国产精品第一页| 麻豆国产传媒精品视频| 国产乱码精品一区二区三区四川人| 中文字幕av一区| 日韩女同一区二区三区久久| 国产av一区二区三区综合| 青青草无码免费一二三区| 国产精品一码在线播放|