vue項(xiàng)目中使用高德地圖api(自定義標(biāo)記點(diǎn)為例)

現(xiàn)在實(shí)現(xiàn)的業(yè)務(wù)是在地圖上用經(jīng)緯度顯示相應(yīng)的標(biāo)記點(diǎn)及數(shù)據(jù)(自定義標(biāo)記點(diǎn)),之前使用過(guò)高德地圖行政區(qū)域放大的api辛友,由于代碼量有點(diǎn)多就用了這個(gè)最近使用的自定義標(biāo)記點(diǎn)的示例來(lái)做展示黄琼,實(shí)現(xiàn)的方式都是一樣的琅轧。
高德地圖JS API:https://lbs.amap.com/api/javascript-api/guide/overlays/marker

這是示例中源代碼的效果圖鹊碍,紅框標(biāo)記就是自定義標(biāo)記點(diǎn)

而現(xiàn)在我想實(shí)現(xiàn)下圖的效果:

下面看一下他的源代碼,源代碼中province明顯是一個(gè)數(shù)組寸五,標(biāo)記點(diǎn)是通過(guò)遍歷這個(gè)數(shù)組的數(shù)據(jù)插入的,provinces[i].type === 2里面("<div class = 'taiwan'>寶島臺(tái)灣</div>")的就是我要做的自定義標(biāo)記點(diǎn)耿币,其實(shí)就是一個(gè)div梳杏,標(biāo)記點(diǎn)的自定義就是通過(guò)修改這個(gè)div實(shí)現(xiàn)的。

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="chrome=1">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <style type="text/css">
      body,html,#container{
        height: 100%;
        margin: 0px;
        font:12px Arial;
      }
      .taiwan{
        border: solid 1px red;
        color: red;
        float: left;
        width: 50px;
        background-color: rgba(255,0,0,0.1)
      }
    </style>
    <title>Marker example</title>
  </head>
  <body>
   <div id="container" tabindex="0"></div>
   <script src="https://webapi.amap.com/js/marker.js"></script>
   <script src="https://webapi.amap.com/maps?v=1.4.2&key=608d75903d29ad471362f8c58c550daf"></script>
   <script type="text/javascript">

        var map = new AMap.Map('container',{resizeEnable: true,zoom:4});
        var markers = []; //province見(jiàn)Demo引用的JS文件
        for (var i = 0; i < provinces.length; i += 1) {
                var marker;
                if (provinces[i].type === 0) {
                    var icon = new AMap.Icon({
                        image: 'https://vdata.amap.com/icons/b18/1/2.png',
                        size: new AMap.Size(24, 24)
                    });
                    marker = new AMap.Marker({
                        icon: icon,
                        position: provinces[i].center.split(','),
                        offset: new AMap.Pixel(-12,-12),
                        zIndex: 101,
                        title: provinces[i].name,
                        map: map
                    });
                } else {
                    marker = new AMap.Marker({
                        position: provinces[i].center.split(','),
                        title: provinces[i].name,
                        map: map
                    });
            if (provinces[i].type === 2) {
                    var content= "<div class = 'taiwan'>寶島臺(tái)灣</div>";
                    baodao = new AMap.Marker({
                        content: content,
                        position: provinces[i].center.split(','),
                        title: provinces[i].name,
                        offset: new AMap.Pixel(0,0),
                        map: map
                    });
            }
                }
                markers.push(marker);
            }
              map.setFitView();
    </script>
    <script type="text/javascript" src="https://webapi.amap.com/demos/js/liteToolbar.js"></script>
  </body>
</html>

了解了源代碼實(shí)現(xiàn)過(guò)程淹接,現(xiàn)在是如何引入api十性,很多一開(kāi)始接觸相關(guān)業(yè)務(wù)時(shí)肯定會(huì)考慮vue的地圖插件vue-amap,我也試著去實(shí)現(xiàn)過(guò)塑悼,但是他的文檔實(shí)在是過(guò)于抽象也很難找到相應(yīng)示例(可能只有我找不到)蟹肘,對(duì)于很多初學(xué)者或者沒(méi)怎么接觸這方面業(yè)務(wù)的開(kāi)發(fā)者來(lái)說(shuō)這似乎有點(diǎn)不太好實(shí)現(xiàn)。了解了高德地圖的api后發(fā)現(xiàn)也不是不能實(shí)現(xiàn)张吉,源代碼是原生的那就用原生的方式實(shí)現(xiàn)晕城。

首先看看他引入的東西是啥:

//分別是:
<script src="https://webapi.amap.com/js/marker.js"></script>
<script src="https://webapi.amap.com/maps?v=1.4.2&key=608d75903d29ad471362f8c58c550daf"></script>

//還有
<script type="text/javascript" src="https://webapi.amap.com/demos/js/liteToolbar.js"></script>

注冊(cè)賬號(hào)和申請(qǐng)key的過(guò)程如下:
1. 首先,注冊(cè)開(kāi)發(fā)者賬號(hào)郭怪,成為高德開(kāi)放平臺(tái)開(kāi)發(fā)者
2. 登陸之后支示,在進(jìn)入「應(yīng)用管理」 頁(yè)面「創(chuàng)建新應(yīng)用」
3. 為應(yīng)用添加 Key,「服務(wù)平臺(tái)」一項(xiàng)請(qǐng)選擇「 Web 端 ( JSAPI )」

通過(guò)異步的的方式引入:引入的方法后面可以封裝一下鄙才;只需要將provinces[i].type === 2里的內(nèi)容放入遍歷里面修改一下颂鸿。這樣基本的效果就是實(shí)現(xiàn)了,content的內(nèi)容可以根據(jù)業(yè)務(wù)自定義攒庵,后面可以根據(jù)業(yè)務(wù)需求進(jìn)行修改嘴纺。最后記得在destroyed中把引入的內(nèi)容清除。

async mounted() {
        let that = this;
        try{
            await that.createMarker();
            await that.createCoreScript()
            await that.createDemo();

            console.log('所有資源成功獲取...')
            that.map = new AMap.Map('container', {
                resizeEnable: true,
                zoom:4
            });
            let markers = [];
            
            let dataList [{        //dataList數(shù)據(jù)根據(jù)具體業(yè)務(wù)修改
              lng: '',
              lat: '',
              name: '龍華'浓冒,
              count: '25'
            },{
              lng: '',
              lat: '',
              name: '龍華'栽渴,
              count: '25'
            }]

            for (var i = 0; i < that.dataList.length; i += 1) {
                let marker;
                let content= `<div id = 'taiwan' 
                    style='display:flex;flex-direction: column;justify-content:center;align-items:center;color: #333;width: 80px; height:80px;border-radius:50%;text-align:center;background-color: #e2991a;font-weight:bold'
                >
                    <div style='margin-bottom:6px'>${that.dataList[i].name}</div>
                    <div>${that.dataList[i].count}個(gè)樓盤</div>
                </div>`;
                marker = new AMap.Marker({
                    content: content,
                    position: [that.dataList[i].Lng,that.dataList[i].Lat],
                    title: that.dataList[i].name,
                    offset: new AMap.Pixel(0,0),
                    map: that.map
                });
                markers.push(marker);
            }
        } catch(e) {
            console.log('資源獲取失敗')
        }
    },
    destroyed() {
        let coreScript = document.getElementById('coreScript');
        let markerScript = document.getElementById('markerScript');
        let demoScript = document.getElementById('demoScript');

        coreScript.parentNode.removeChild(coreScript);
        markerScript.parentNode.removeChild(markerScript);
        demoScript.parentNode.removeChild(demoScript);
    },
 methods: {
        createCoreScript() {
            return new Promise((resolve, reject) => {
                console.log('進(jìn)入加載核心資源')
                let url = `http://webapi.amap.com/maps?v=1.4.2&key=${this.KEY}`;
                let $script =document.createElement('script');
                $script.id = 'coreScript';
                $script.src = url;
                $script.type = 'text/javascript';
                $script.addEventListener('load', (event) => {
                    console.log('核心script 獲取成功')
                    resolve()
                })
                $script.onerror = function (e) {
                    console.log('js資源加載失敗了')
                }
                document.body.appendChild($script)
            })
        },

        createMarker() {
            return new Promise((resolve, reject) => {
            let url = `http://webapi.amap.com/js/marker.js`;
            let $script = document.createElement('script');
            $script.id = 'markerScript';
            $script.src = url;
            $script.type = 'text/javascript';
            $script.addEventListener('load', (event) => {
                console.log('Marker script 獲取成功')
                resolve()
            })
            document.body.appendChild($script)
            })
        },

        createDemo() {
            return new Promise((resolve, reject) => {
            let url = `http://webapi.amap.com/demos/js/liteToolbar.js`;
            let $script = document.createElement('script');
            $script.id = 'demoScript';
            $script.src = url;
            $script.type = 'text/javascript';
            $script.addEventListener('load', (event) => {
                console.log('demo script 獲取成功')
                resolve()
            })
            document.body.appendChild($script)
            })
        },

    }

下面是完整基本實(shí)現(xiàn)的代碼:其他api的實(shí)現(xiàn)方法也一樣

<template>
        <div class="container">
            <div id="container"></div>
        </div>
</template>

<script>
export default {
    name: 'HelloWorld',
    data() {
        return {
            map: '',
            KEY: '',    //將開(kāi)發(fā)者賬號(hào)申請(qǐng)的key放入
        }
    },
    async mounted() {
        let that = this;
        try{
            await that.createMarker();
            await that.createCoreScript()
            await that.createDemo();

            console.log('所有資源成功獲取...')
            that.map = new AMap.Map('container', {
                resizeEnable: true,
                zoom:4
            });
            let markers = [];
             let dataList [{        //dataList數(shù)據(jù)根據(jù)具體業(yè)務(wù)修改
              lng: '',
              lat: '',
              name: '龍華',
              count: '25'
            },{
              lng: '',
              lat: '',
              name: '龍華'稳懒,
              count: '25'
            }]

            for (var i = 0; i < that.dataList.length; i += 1) {
                let marker;
                console.log(i)
                let content= `<div id = 'taiwan' 
                    style='display:flex;flex-direction: column;justify-content:center;align-items:center;color: #333;width: 80px; height:80px;border-radius:50%;text-align:center;background-color: #e2991a;font-weight:bold'
                >
                    <div style='margin-bottom:6px'>${that.dataList[i].name}</div>
                    <div>${that.dataList[i].count}個(gè)樓盤</div>
                </div>`;
                marker = new AMap.Marker({
                    content: content,
                    position: [that.dataList[i].Lng,that.dataList[i].Lat],
                    title: that.dataList[i].name,
                    offset: new AMap.Pixel(0,0),
                    map: that.map
                });
                markers.push(marker);
            }
        } catch(e) {
            console.log('資源獲取失敗')
        }
    },
    destroyed() {
        let coreScript = document.getElementById('coreScript');
        let markerScript = document.getElementById('markerScript');
        let demoScript = document.getElementById('demoScript');

        coreScript.parentNode.removeChild(coreScript);
        markerScript.parentNode.removeChild(markerScript);
        demoScript.parentNode.removeChild(demoScript);
    },
    methods: {
        async getData(){
            const res = await this.$axios.get('/index/v1.index/find');
            this.dataList = res.data;
        },
        createCoreScript() {
            return new Promise((resolve, reject) => {
                console.log('進(jìn)入加載核心資源')
                let url = `http://webapi.amap.com/maps?v=1.4.2&key=${this.KEY}`;
                let $script = document.createElement('script');
                $script.id = 'coreScript';
                $script.src = url;
                $script.type = 'text/javascript';
                
                $script.addEventListener('load', (event) => {
                    console.log('核心script 獲取成功')
                    resolve()
                })
                $script.onerror = function (e) {
                    console.log('js資源加載失敗了')
                }
                document.body.appendChild($script)
            })
        },

        createMarker() {
            return new Promise((resolve, reject) => {
            let url = `http://webapi.amap.com/js/marker.js`;
            let $script = document.createElement('script');
            $script.id = 'markerScript';
            $script.src = url;
            $script.type = 'text/javascript';
            $script.addEventListener('load', (event) => {
                console.log('Marker script 獲取成功')
                resolve()
            })
            document.body.appendChild($script)
            })
        },

        createDemo() {
            return new Promise((resolve, reject) => {
            let url = `http://webapi.amap.com/demos/js/liteToolbar.js`;
            let $script = document.createElement('script');
            $script.id = 'demoScript';
            $script.src = url;
            $script.type = 'text/javascript';
            $script.addEventListener('load', (event) => {
                console.log('demo script 獲取成功')
                resolve()
            })
            document.body.appendChild($script)
            })
        },

    }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss" scoped>
.container{
    width: 100%;
    height: 1000px;
    margin: 0 auto;
    #container{
        height: 100%;
        margin: 0px;
        font:12px Arial;
    }
    .taiwan{
        border: solid 1px rgb(223, 52, 52);
        color: red;
        float: left;
        width: 50px;
        background-color: rgba(228, 162, 40, 0.1);
        background-color: #fff;
    }
}


</style>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闲擦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌墅冷,老刑警劉巖纯路,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寞忿,居然都是意外死亡驰唬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門腔彰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叫编,“玉大人,你說(shuō)我怎么就攤上這事霹抛〈暧猓” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵上炎,是天一觀的道長(zhǎng)恃逻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)藕施,這世上最難降的妖魔是什么寇损? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮裳食,結(jié)果婚禮上矛市,老公的妹妹穿的比我還像新娘。我一直安慰自己诲祸,他們只是感情好浊吏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著救氯,像睡著了一般找田。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上着憨,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天墩衙,我揣著相機(jī)與錄音,去河邊找鬼甲抖。 笑死漆改,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的准谚。 我是一名探鬼主播挫剑,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柱衔!你這毒婦竟也來(lái)了樊破?” 一聲冷哼從身側(cè)響起愉棱,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捶码,沒(méi)想到半個(gè)月后羽氮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惫恼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澳盐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祈纯。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叼耙,靈堂內(nèi)的尸體忽然破棺而出腕窥,到底是詐尸還是另有隱情,我是刑警寧澤筛婉,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布簇爆,位于F島的核電站,受9級(jí)特大地震影響爽撒,放射性物質(zhì)發(fā)生泄漏入蛆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一硕勿、第九天 我趴在偏房一處隱蔽的房頂上張望哨毁。 院中可真熱鬧,春花似錦源武、人聲如沸扼褪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)话浇。三九已至,卻和暖如春闹究,著一層夾襖步出監(jiān)牢的瞬間幔崖,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工跋核, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岖瑰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓砂代,卻偏偏與公主長(zhǎng)得像蹋订,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刻伊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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