vue中實現百度地圖拖拽地圖定位功能
效果如果所示,拖動地圖。中間圖標不動,並且自動獲取地圖當前中心點的經緯度。然後就可以用經緯度做其他的操作了。。。首先查看了百度地圖的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中實現百度地圖拖拽地圖定位功能