Vue使用高德地圖實現(xiàn)點聚合+點擊點坐標(biāo)顯示點信息的功能

Vue使用高德地圖實現(xiàn)點聚合+點擊點坐標(biāo)顯示點信息的功能

業(yè)務(wù)場景

拿目前做的這個項目來說前联,需要完成這樣的一個場景:讀取數(shù)據(jù)庫將樹木的位置標(biāo)在地圖上秸脱,由于點比較多罗珍,要用點聚合的形式,點擊地圖上的點梆掸,會在右側(cè)的信息欄中獲取該樹木的所有信息瘪贱。demo圖如下(接口數(shù)據(jù)因為是真實數(shù)據(jù)纱控,遂隱藏):

demo.png
分析

這里先簡單列一下實現(xiàn)的思路:

  • 初始化地圖
  • 訪問接口拿到點的數(shù)據(jù)
  • 用點聚合的形式將數(shù)據(jù)渲染在地圖上
  • 給每個點綁定點擊事件
  • 點擊地圖上點的時候拿到里面的key值辆毡,查該點的信息
  • 用vue的雙向綁定菜秦,將信息渲染到右邊的單元格中
  • 在使用篩選功能時,先重置數(shù)據(jù)舶掖,刪除聚合點球昨,然后重新再調(diào)用查詢接口并重新繪制聚合點

解決思路有了之后,那么開始coding

實現(xiàn)

1.初始化地圖

initMap () {
    map = new AMap.Map('map', {
        // 放大級別
        zoom: 13,
        // 放大縮小
        resizeEnable: true,
        // 位置
        center: [117.094923,36.246692],
        // 是否顯示地圖文字標(biāo)記
        showLabel: false,
        ayers: [
            // 衛(wèi)星圖
            new AMap.TileLayer.Satellite(),
            // 路書
            new AMap.TileLayer.RoadNet()
        ]
    })
}

2.訪問業(yè)務(wù)接口拿到點的經(jīng)緯度信息坐標(biāo)

由于這里要查詢點的所有相關(guān)信息眨攘,這里接口設(shè)計時主慰,不僅只拿到lng,lat的值鲫售,還要有個數(shù)據(jù)的key值共螺,這里的接口返回格式為:

data: [
    {
        keyid: '1001',
        lnglat: [117.21564564, 36.3145486]
    },{
        keyid: '1002',
        lnglat: [117.21564564, 36.3145486]
    },{
        keyid: '1003',
        lnglat: [117.21564564, 36.3145486]
    },
    ......
]

查詢該數(shù)據(jù)接口,在查詢成功后調(diào)用初始化點聚合的功能情竹,具體實現(xiàn)如下:

// 獲取點聚合數(shù)據(jù)
getPoints () {
    axios.get(apiurl.getPointsList, {
        // 這里是查詢參數(shù)
        starttime: this.searchForm.starttime,
        endtime: this.searchForm.endtime,
        worked: this.searchForm.worked
    }).then(({data}) => {
        // 解構(gòu)賦值
        this.pointsList = data
        // 在查詢成功后藐不,調(diào)用點聚合的初始化功能
        this.initMarkers()
    }).catch((error) => {
        console.log(error)
    })
}

3.實現(xiàn)點聚合功能

調(diào)用initMarkers()函數(shù),將數(shù)據(jù)點以點聚合的形式渲染在地圖上,在添加點的同時雏蛮,給每個點賦予新的屬性涎嚼,及前面提到的keyid值,以便點擊該點時挑秉,將該keyid值傳入接口來實現(xiàn)查詢功能法梯。在這里,使用marker.setExtData()函數(shù)來實現(xiàn)添加額外屬性的功能犀概,這里需要傳入需要添加的屬性和屬性值立哑,使用marker.on()來綁定點擊事件。這里圈一下是重點姻灶,具體實現(xiàn)如下:

// 添加點聚合
initMarkers () {
    // 初始化聚合列表和點的列表
    let cluster, markers = [];
        // 循環(huán)讀取每一個點的經(jīng)緯度信息
        for (let i = 0; i < this.pointsList.length; i += 1) {
            // 添加點坐標(biāo)
            let marker = new AMap.Marker({
                position: this.pointsList[i]['lnglat'],
                content: '<div style="background-color: hsla(180, 100%, 50%, 0.7); height: 24px; width: 24px; border: 1px solid hsl(180, 100%, 40%); border-radius: 12px; box-shadow: hsl(180, 100%, 50%) 0px 0px 1px;"></div>',
                offset: new AMap.Pixel(-15, -15)
            })
        // 給marker點坐標(biāo)添加額外的屬性和對應(yīng)的屬性值刁憋,圈重點這里是關(guān)鍵
        marker.setExtData(this.pointsList[i]['treeId'])
        // 給每個點坐標(biāo)綁定click事件,這里是實現(xiàn)點擊功能的重點
        marker.on('click', this.markerClick)
        markers.push(marker)
    }

    let count = markers.length;
    // 設(shè)置聚合樣式木蹬,這里都是聚合樣式的配置
    let _renderClusterMarker = function (context) {
        let factor = Math.pow(context.count / count, 1 / 18);
        let div = document.createElement('div');
        let Hue = 180 - factor * 180;
        let bgColor = 'hsla(' + Hue + ',100%,50%,0.7)';
        let fontColor = 'hsla(' + Hue + ',100%,20%,1)';
        let borderColor = 'hsla(' + Hue + ',100%,40%,1)';
        let shadowColor = 'hsla(' + Hue + ',100%,50%,1)';
        div.style.backgroundColor = bgColor;
        let size = Math.round(30 + Math.pow(context.count / count, 1 / 5) * 20);
        div.style.width = div.style.height = size + 'px';
        div.style.border = 'solid 1px ' + borderColor;
        div.style.borderRadius = size / 2 + 'px';
        div.style.boxShadow = '0 0 1px ' + shadowColor;
        div.innerHTML = context.count;
        div.style.lineHeight = size + 'px';
        div.style.color = fontColor;
        div.style.fontSize = '14px';
        div.style.textAlign = 'center';
        context.marker.setOffset(new AMap.Pixel(-size / 2, -size / 2));
        context.marker.setContent(div)
    };
    
    // 調(diào)用函數(shù)添加點聚合功能                                               
    addCluster();
    function addCluster() {
        if (cluster) {
             cluster.setMap(null);
        } else {
              // 如果不設(shè)置renderClusterMarker至耻,聚合點為默認樣式
            cluster = new AMap.MarkerClusterer(map, markers, {
                gridSize: 50,
                //  使用上面設(shè)置的點聚合樣式
                renderClusterMarker: _renderClusterMarker
            });
        }
    }
}

這里提一下,在使用點聚合功能時镊叁,在html頁面上添加地圖key值的地方尘颓,需要引入點聚合的插件:&plugin=AMap.MarkerClusterer 。

<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=你的key值&plugin=AMap.MarkerClusterer"></script>

4.實現(xiàn)點坐標(biāo)的點擊事件

在前面已經(jīng)給每個marker點綁定點擊事件了晦譬,這里需要我們寫個函數(shù)加以實現(xiàn)疤苹。

// 點坐標(biāo)點擊事件,在點聚合功能中以完成綁定
markerClick (e) {
    console.log(e.target.getExtData())
    // 拿到之前賦予的keyid值敛腌,將該值傳入獲取詳細信息的函數(shù)
    const keyId = e.target.getExtData()
    // 調(diào)用獲取詳細信息的函數(shù)
    this.getDesMessage(keyId)
}

5.根據(jù)keyId獲取該點的詳細信息并渲染

這里就沒啥好說的了卧土,前面拿到了keyId值,用此值查詢數(shù)據(jù)庫像樊,將返回結(jié)果在頁面上進行渲染尤莺。

// 獲取列表值
getDesMessage (keyId) {
    axios.get(apiurl.desMessage, {
        // 查詢需要傳入的參數(shù)
        keyId: keyId,
    }).then(({data}) => {
        // 將查詢結(jié)果賦值給desMessage,然后利用vue的雙向綁定渲染到頁面上
        this.desMessage = data
    }).catch((error) => {
        console.log(error)
    })
}

6.完善

由于上面有篩選重置按鈕生棍,這里需要完善這兩個功能颤霎,在提交查詢時,先重置下頁面數(shù)據(jù)再調(diào)用點聚合的功能涂滴,重置也亦如此友酱。

// 提交查詢
onSubmit () {
    // 重置頁面數(shù)據(jù)
    // 刪除所有的聚合點
    this.removeMarkers()
    // 將點的結(jié)果集置空
    this.pointsList = []
    // 重新調(diào)用接口獲取數(shù)據(jù)
    this.getPoints()
},
// 重置
resetForm () {
    // 重置頁面數(shù)據(jù)
    // 刪除所有的聚合點
    this.removeMarkers()
    // 查詢表單置空
    this.searchForm = {}
    // 將點的結(jié)果集置空
    this.pointsList = []
    // 重新調(diào)用接口獲取數(shù)據(jù)
    this.getPoints()
},
// 刪除點聚合
removeMarkers () {
    map.clearMap()
}

到這里,點的聚合效果和點擊效果就全部完成柔纵。

所有代碼都為部分代碼缔杉,這里只是提供一個實現(xiàn)的思路。


如需轉(zhuǎn)載搁料,請加上本文的鏈接并標(biāo)明出處

一條愛吃屎的狗的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末或详,一起剝皮案震驚了整個濱河市进苍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸭叙,老刑警劉巖觉啊,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沈贝,居然都是意外死亡杠人,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門宋下,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗡善,“玉大人,你說我怎么就攤上這事学歧≌忠” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵枝笨,是天一觀的道長袁铐。 經(jīng)常有香客問我,道長横浑,這世上最難降的妖魔是什么剔桨? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮徙融,結(jié)果婚禮上洒缀,老公的妹妹穿的比我還像新娘。我一直安慰自己欺冀,他們只是感情好树绩,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隐轩,像睡著了一般饺饭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上龙助,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天砰奕,我揣著相機與錄音蛛芥,去河邊找鬼提鸟。 笑死,一個胖子當(dāng)著我的面吹牛仅淑,可吹牛的內(nèi)容都是我干的称勋。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼涯竟,長吁一口氣:“原來是場噩夢啊……” “哼赡鲜!你這毒婦竟也來了空厌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤银酬,失蹤者是張志新(化名)和其女友劉穎嘲更,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揩瞪,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡赋朦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了李破。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宠哄。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嗤攻,靈堂內(nèi)的尸體忽然破棺而出毛嫉,到底是詐尸還是另有隱情,我是刑警寧澤妇菱,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布承粤,位于F島的核電站,受9級特大地震影響闯团,放射性物質(zhì)發(fā)生泄漏密任。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一偷俭、第九天 我趴在偏房一處隱蔽的房頂上張望浪讳。 院中可真熱鬧,春花似錦涌萤、人聲如沸淹遵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽透揣。三九已至,卻和暖如春川抡,著一層夾襖步出監(jiān)牢的瞬間辐真,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工崖堤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侍咱,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓密幔,卻偏偏與公主長得像楔脯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胯甩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容