首先在html中需要有一個實例對象元素
<div id="mapDiv"></div>
然后在data中定義三個變量用於存儲地圖實例和經緯度
data(){
map:null,
currentLng:116.4,
currentLat:39.9,
}
初始化天地圖
initMap(){
//初始化地圖對象
if(!this.map){ //此判斷因為map實例會被重復創建所以需要使用最新實例(這一判斷其實我之前也想過,因為我是需要顯示在dialog彈窗中,在取消關閉彈窗的時候將map變量實例置空,但再次打開彈窗,實際效果並未拿到最新實例,並且地圖無法拖動,結果請求大佬之后才知道需要此判斷)
var marker; //如果不加此判斷,每次打開地圖地圖實例和覆蓋物會被重復創建,會造成頁面覆蓋物重復並且地圖無法拖動問題(因為鄙人使用是在element dialog框中,所以每次打開需重復創建實例,直接顯示在頁面中好像不會出現問題,各位可自行嘗試)
var zoom = 16;
this.map = new T.Map("mapDiv");
}
this.map.clearOverLays(); // 清除地圖中的覆蓋物(因為實例和覆蓋物會被重復創建最新的,所以在最新的生成前需要清除掉之前的)
//設置顯示地圖的中心點和級別
this.map.centerAndZoom(new T.LngLat(this.currentLng, this.currentLat), zoom);
var point = new T.LngLat(this.currentLng,this.currentLat);
marker = new T.Marker(point);// 創建標注
this.map.addOverLay(marker); // 將標注添加到地圖中
marker.enableDragging(); // 可拖拽
marker.addEventListener("dragend",this.dragMarker) //此處為覆蓋物添加拖拽事件,更多事件參照官網http://lbs.tianditu.gov.cn/api/js4.0/class.html
},
監聽拖拽事件
dragMarker(e){
var current = e.target
if(current instanceof T.Marker){
console.log(current.getLngLat().lng) //拖拽完后獲取到經緯度之后你就可以開始自己的業務邏輯操作了
console.log(current.getLngLat().lat)
}else{
console.log("無法獲取該坐標位置");
}
},
重點來了!!!↓ ↓ ↓
當我們調用地圖時需要使用
setTimeout做延遲
getMap() {
setTimeout(()=>{
this.initMap()
},100)
},
鄙解(鄙人理解):因為業務需要,需要將地圖顯示在彈窗中,elment diaplog的原理是通過v-if來實現的,需要重復的創建刪除節點,當打開彈窗的一瞬間就調用地圖實例,但彈窗中的dom元素還未生成,所以未獲取到dom實例。
上面只是個人理解,對錯未知,如有大佬懂之,並為之糾錯,吾謝之!!
