1. 程式人生 > >vue中實現百度地圖拖拽地圖定位功能

vue中實現百度地圖拖拽地圖定位功能

.com 元素 偏移量 locals 進行 函數 nco 查看 page

技術分享圖片

效果如果所示,拖動地圖。中間圖標不動,並且自動獲取地圖當前中心點的經緯度。然後就可以用經緯度做其他的操作了。。。首先查看了百度地圖的api。能實現這個功能最貼近的就是marker。marker可以拖拽,但是地圖卻動不了,我還用了另外一種是自己自定義一個marker。並且讓marker相對地圖位置絕對定位,地圖拖拽,marker不動,拖拽結束後使用marker.getposition來獲取當前位置,但是有個問題。自定義的marker在地圖拖動的時候就看不見了。。應該是層級問題。讓地圖給擋住了。。太醜了。沒辦法。最後我選擇第三種方案:

使用一個control來模擬,我們知道control類可以固定在地圖上不動。而且一直在地圖最上層,這就很棒了。我的思路是用一個自定義的control來模擬中間的固定圖標,然後通過地圖的獲取位置方法每次結束拖動後來獲取位置。

自定義control代碼如下:

//這部分是我提取的一個control的公用函數

function BaseControl(offset) {
/* // 設置默認停靠位置和偏移量
this.defaultAnchor = {left:pos.left,top:pos.top};*/
this.defaultAnchor = BMAP_ANCHOR_TOP_RIGHT;
this.defaultOffset = new BMap.Size(offset.left, offset.top);
}
// 通過JavaScript的prototype屬性繼承於BMap.Control
BaseControl.prototype = new BMap.Control();
//創建一個基礎的控件樣式
function baseBtnContent() {
var div = document.createElement("div");
// 添加文字說明
var size = "2.215rem";
div.style.width = size;
div.style.height = size;
div.style.background = "no-repeat center/cover";
return div;
}




//這個是中間的固定control,我讓他的背景圖變成第一張圖片的定位圖標的樣子。
function centerFixedControl(map,pos){ BaseControl.call(this,pos); this.map=map; } centerFixedControl.prototype = new BMap.Control(); centerFixedControl.prototype.initialize = function() { var div = baseBtnContent(); div.style.width="19px"; div.style.height="27px"; div.style.backgroundImage = "url(../static/images/wechatgroup/dw.png)"; var _this=this; // 添加DOM元素到地圖中 this.map.getContainer().appendChild(div); // 將DOM元素返回 return div; }

function cfc(map,pos){
var control=new centerFixedControl(map,pos);
map.addControl(control);
return this;
}

  然後就是把當前的控件加載到地圖中

control().cfc(map,{left:172,top:117});/control.是import導入進來的整個createMapControl方法/

  接下來就是在地圖的拖拽事件裏面獲取當前的位置

this.map.addEventListener("dragend",(e)=>{
      var pos=this.map.getCenter();
      this.searchAround(pos);
 },false);

 使用map.getCenter可以和marker.getposition同樣的效果,即得到一個經緯度,getCenter獲取的是地圖的中心點的經緯度,

然後就可以做很多,比如搜索附近

//搜索附近方法
   searchAround(point){
   	//搜索到附近的標誌建築之後進行排序,然後顯示出來
   	 this.loadSth=true;
   	 let _this=this;
     var localSearch=new BMap.LocalSearch(point,{
     	 onSearchComplete:(r)=>{
     	 /* var f=localSearch.getStatus();*/
           var resArr=[];
           for(var i=0,len=r.length;i<len;i++){
           	 if(r[i].vr.length>0){
               resArr=resArr.concat(r[i].vr);
           	 }
           }
          _this.addressArr=resArr;
          _this.loadSth=false;
     	}
     });
     localSearch.setPageCapacity(10);
     localSearch.searchNearby(["商場","寫字樓","公交站","地鐵站","銀行","酒店"],point,1000); 
   },

  ok。。結束

vue中實現百度地圖拖拽地圖定位功能