vue项目中使用高德地图api(自定义标记点为例)

现在实现的业务是在地图上用经纬度显示相应的标记点及数据(自定义标记点),之前使用过高德地图行政区域放大的api,由于代码量有点多就用了这个最近使用的自定义标记点的示例来做展示,实现的方式都是一样的。
高德地图JS API:https://lbs.amap.com/api/javascript-api/guide/overlays/marker

这是示例中源代码的效果图,红框标记就是自定义标记点

而现在我想实现下图的效果:

下面看一下他的源代码,源代码中province明显是一个数组,标记点是通过遍历这个数组的数据插入的,provinces[i].type === 2里面("<div class = 'taiwan'>宝岛台湾</div>")的就是我要做的自定义标记点,其实就是一个div,标记点的自定义就是通过修改这个div实现的。

<!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见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'>宝岛台湾</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>

了解了源代码实现过程,现在是如何引入api,很多一开始接触相关业务时肯定会考虑vue的地图插件vue-amap,我也试着去实现过,但是他的文档实在是过于抽象也很难找到相应示例(可能只有我找不到),对于很多初学者或者没怎么接触这方面业务的开发者来说这似乎有点不太好实现。了解了高德地图的api后发现也不是不能实现,源代码是原生的那就用原生的方式实现。

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

//分别是:
<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>

注册账号和申请key的过程如下:
1. 首先,注册开发者账号,成为高德开放平台开发者
2. 登陆之后,在进入「应用管理」 页面「创建新应用」
3. 为应用添加 Key,「服务平台」一项请选择「 Web 端 ( JSAPI )」

通过异步的的方式引入:引入的方法后面可以封装一下;只需要将provinces[i].type === 2里的内容放入遍历里面修改一下。这样基本的效果就是实现了,content的内容可以根据业务自定义,后面可以根据业务需求进行修改。最后记得在destroyed中把引入的内容清除。

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数据根据具体业务修改
              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}个楼盘</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('进入加载核心资源')
                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)
            })
        },

    }

下面是完整基本实现的代码:其他api的实现方法也一样

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

<script>
export default {
    name: 'HelloWorld',
    data() {
        return {
            map: '',
            KEY: '',    //将开发者账号申请的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数据根据具体业务修改
              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}个楼盘</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('进入加载核心资源')
                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>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容