让高德地图上点标记显示发光效果

  第一次写东西,技术水平不是很高,只是为了方便记忆。

  最近项目中有一个在地图上显示定位的需求,这本来没什么,只要初始化一个地图,将后台传过来的定位信息通过高德API在地图上显示就行了,最主要的是需要让点像光源一样有闪烁的效果,本来是想在网上找一下copy的,结果没找到。所以自己研究了一下。

  为了方便记忆,所以会将从怎么创建地图,到显示定位点的整个过程纪录下来。

  首先声明这里用的是vue加高德API,第一步,将高德API引入vue,在这里先将下面这句代码放到index.html的头部。

<script src="https://webapi.amap.com/maps?v=1.4.10&key=你的key值"></script>

  然后在webpack.base.conf.js中加入,这里window.AMap好像可以直接写AMap

externals: {
    'AMap': 'window.AMap'
  }

  然后在你需要的界面引用就行了

import AMap from 'AMap'

  到此为止,是前期的准备工作。

  接下来开始创建地图了,因为有时需要在地图上做数据更新,所以需要把地图的创建用一个方法提取出来,只在mounted里调用一次就行,避免数据更新是重复创建。

initmap() {
            //创建地图
            this.map = new AMap.Map("container", {
                center: [120.061897, 30.356648], //设置中心点
                // pitch: 60,
                // rotation: -35,
                resizeEnable: true, //是否监控地图容器尺寸变化
                features: ["bg", "road", "point"], //隐藏默认楼块
                mapStyle: "amap://styles/bf8a443a1cae459d53212187f63b444c", //设置地图的显示样式
                // layers: [new AMap.TileLayer.Satellite()], //地图图层(卫星图层)    new AMap.TileLayer()
                zoom: 16 //地图显示的缩放级别
            });
}

  这里值得注意的是mapStyle这个参数的值里bf8a443a1cae459d53212187f63b444c这个值,是我登录高德开发者平台,在自定义地图里自己创建发布的一个地图样式,个人认为根据图片创建地图更舒服一些。

  接下来,因为我们的后台数据还没有对接好,所以自己定义了一条假数据。

var capitals = [
                {
                    center:[120.060824,30.357574],
                    color:'#00e921',
                    animations:'myfirst01'
                },
                {
                    center:[120.061824,30.358574],
                    color:'#fffa02',
                    animations:'myfirst02'
                },
                {
                    center:[120.062824,30.354574],
                    color:'#00e921',
                    animations:'myfirst01'
                },
                {
                    center:[120.063824,30.35974],
                    color:'#fffa02',
                    animations:'myfirst02'
                },
                {
                    center:[120.057824,30.352574],
                    color:'#00e921',
                    animations:'myfirst01'
                },
                {
                    center:[120.056824,30.354574],
                    color:'#fffa02',
                    animations:'myfirst02'
                },
                {
                    center:[120.055824,30.360574],
                    color:'#98014e',
                    animations:'myfirst03'
                },
                {
                    center:[120.071824,30.358574],
                    color:'#98014e',
                    animations:'myfirst03'
                },
                {
                    center:[120.061824,30.358574],
                    color:'#ff7d00',
                    animations:'myfirst04'
                },
                {
                    center:[120.061824,30.358574],
                    color:'#ff7d00',
                    animations:'myfirst04'
                },
            ]

  在这里解释一下为什么会有animations这个属性,这是因为我在这里做了两种效果,等一下会一一解释。在这之前我在高德地图上加定位标记都是点标记,通过new AMap.Marker()。但是这个方法只支持对直径,颜色,透明度,边框直径,边框颜色,边框透明度的修改,并没有对点标记样式的修改,当然,你也可以让ui给你设计一款图片,但是图片加载总会耗资源的,最后找了一会发现其实文本标记是可以随意修改样式的,所以最后第一种方法是这样的:

js

for(var i=0;i<capitals.length;i+=1){
                var text = new AMap.Text({
                    text:' ',
                    textAlign:'center',
                    verticalAlign:'middle', //middle 、bottom
                    draggable:true,
                    cursor:'pointer',
                    angle:10,
                    style:{
                        'width': '10px',
                        'height': '10px',
                        'border-radius': '50%',
                        'border-width': 0,
                        'text-align': 'center',
                        'font-size': '12px',
                        'color': 'blue',
                        'background-color':capitals[i].color,
                        // '-moz-box-shadow': '0px 0px 20px 2px '+capitals[i].color,
                        // 'box-shadow': '0px 0px 20px 2px '+capitals[i].color,
                        'animation': capitals[i].animations+' 1s infinite',
                        // 'animation': 'myfirst 1s infinite'
                    },
                    position: capitals[i].center
                })
                text.setMap(this.map);
            }

css

@keyframes myfirst01{
        0% {
            -moz-box-shadow: 0px 0px 10px 2px #00e921;
            box-shadow: 0px 0px 10px 2px #00e921;
        }
        50% {
            -moz-box-shadow: 0px 0px 20px 2px #00e921;
            box-shadow: 0px 0px 20px 2px #00e921;
        }
        100% {
            -moz-box-shadow: 0px 0px 10px 2px #00e921;
            box-shadow: 0px 0px 10px 2px #00e921;
        }
        
}
@keyframes myfirst02{
        0% {
            -moz-box-shadow: 0px 0px 10px 2px #fffa02;
            box-shadow: 0px 0px 10px 2px #fffa02;
        }
        50% {
            -moz-box-shadow: 0px 0px 20px 2px #fffa02;
            box-shadow: 0px 0px 20px 2px #fffa02;
        }
        100% {
            -moz-box-shadow: 0px 0px 10px 2px #fffa02;
            box-shadow: 0px 0px 10px 2px #fffa02;
        }
        
}
@keyframes myfirst03{
        0% {
            -moz-box-shadow: 0px 0px 10px 2px #98014e;
            box-shadow: 0px 0px 10px 2px #98014e;
        }
        50% {
            -moz-box-shadow: 0px 0px 20px 2px #98014e;
            box-shadow: 0px 0px 20px 2px #98014e;
        }
        100% {
            -moz-box-shadow: 0px 0px 10px 2px #98014e;
            box-shadow: 0px 0px 10px 2px #98014e;
        }
        
}
@keyframes myfirst04{
        0% {
            -moz-box-shadow: 0px 0px 10px 2px #ff7d00;
            box-shadow: 0px 0px 10px 2px #ff7d00;
        }
        50% {
            -moz-box-shadow: 0px 0px 20px 2px #ff7d00;
            box-shadow: 0px 0px 20px 2px #ff7d00;
        }
        100% {
            -moz-box-shadow: 0px 0px 10px 2px #ff7d00;
            box-shadow: 0px 0px 10px 2px #ff7d00;
        }
        
}

  这种方法就需要用到animations这个属性,至于为啥会有这么多的动画,是因为我创建的点的颜色不止一种,如果对样式不满意的话可以自己修改,并没有什么很偏僻的样式。

  尴尬!!!不知道怎么录屏,反正这种方法的效果就是本体大小不变,外部光圈大小改变。

  第二种方法就是:

js

for(var i=0;i<capitals.length;i+=1){
                var text = new AMap.Text({
                    text:' ',
                    textAlign:'center',
                    verticalAlign:'middle', //middle 、bottom
                    draggable:true,
                    cursor:'pointer',
                    angle:10,
                    style:{
                        'width': '10px',
                        'height': '10px',
                        'border-radius': '50%',
                        'border-width': 0,
                        'text-align': 'center',
                        'font-size': '12px',
                        'color': 'blue',
                        'background-color':capitals[i].color,
                        '-moz-box-shadow': '0px 0px 20px 2px '+capitals[i].color,
                        'box-shadow': '0px 0px 20px 2px '+capitals[i].color,
                        // 'animation': capitals[i].animations+' 1s infinite',
                        'animation': 'myfirst 1s infinite'
                    },
                    position: capitals[i].center
                })
                text.setMap(this.map);
            }

css

@keyframes myfirst{
    0% {transform: scale(1);}
    50% {transform: scale(1.5);}
    100% {transform: scale(1);}
}

  这种就是本身大小和光圈大小同时改变。同样,没有例子上传。

  ok,打完收工,第一次写这个,感觉还行。就是写的东西没什么技术含量,汗。。。。。。

 

posted @ 2018-10-16 18:19  剑流芒  阅读(7155)  评论(0编辑  收藏  举报