vue 引入高德地图点标记

项目场景:

vue 引入高德地图 实现点聚合 自定义图标标记、遮罩层


解决方案

提示:实现的效果、自定义图标  以及左右耳朵展示不同效果

  getAllRegionNameById(this.regionCode).then((res) => {

                if (res.data != null) {

                    let names = res.data.split('/')

                    if (names.length == 3) {

                        this.district(names[2])

                    } else if (names.length == 1) {

                        this.district(names[0]) //加载反向遮罩

                    } else {

                        this.district(names[1]) //加载反向遮罩

                    }

                }

            })

 

 下面是完整代码

     loadMap: function (flag) {

            getAllRegionNameById(this.regionCode).then((res) => {

                if (res.data != null) {

                    let names = res.data.split('/')

                    if (names.length == 3) {

                        this.district(names[2])

                    } else if (names.length == 1) {

                        this.district(names[0]) //加载反向遮罩

                    } else {

                        this.district(names[1]) //加载反向遮罩

                    }

                }

            })

  

        },

        district: function (cityname) {  

            // console.log(cityname);

            var _this = this

            //创建一个实例

 

            new AMap.DistrictSearch({

                extensions: 'all',

                subdistrict: 0,

            }).search(cityname, function (status, result) {

                /*获取中心点后,再初始化地图,防止跳闪*/

                var _map = new AMap.Map('allmap', {

                    zoom: 11,

                    minZoom: 1,

                    center: result.districtList[0].center,

                })

                var marker = new AMap.Marker({

                    content: ' ',

                    map: _map,

                    offset: new AMap.Pixel(-112, -269),

                })

                _this.marker = marker

                _this.map = _map

                _this.map.clearMap()

                _this.addMarkers()

                var outer = [

                    new AMap.LngLat(-360, 90, true),

                    new AMap.LngLat(-360, -90, true),

                    new AMap.LngLat(360, -90, true),

                    new AMap.LngLat(360, 90, true),

                ]

                var holes = result.districtList[0].boundaries //区域边界

                var pathArray = [outer]

                pathArray.push.apply(pathArray, holes)

                var polygon = new AMap.Polygon({

                    pathL: pathArray,

                    strokeColor: '#71B3ff', //边线颜色

                    strokeWeight: 1, //边线粗细

                    fillColor: '#71B3ff', //遮罩颜色

                    fillOpacity: 0.5, //遮罩透明度

                })

                polygon.setPath(pathArray)

                _map.add(polygon)

                _this.polygon = polygon

                /*初始化地图后,加载海量点*/

                // _this.massMarks(_this.enterLists)

                // console.log(_this.enterLists,'_this.enterLists');

            })

        },

        addMarkers() {

            this.options = []

            if (this.map && this.markerClusterer) {

                this.markerClusterer.clearMarkers() //

                // this.initMarkers();

            }

            let _this = this

            var marker = ''

            this.enterLists.forEach((element, index) => {

这块是 定义的左右耳朵不需要的可以不用看

                let numL = '',

                    numR = '',

                    bgL = 'left:-10px;',

                    bgR = 'left:27px;'

                let comcss =

                        'font-size:12px;color:#fff;width:20px;height:20px;border-radius: 50%;display:flex;justify-content: center;align-items: center;position: absolute;top:-6px;',

                    bg1 = 'background:#00DB5F;', // 状态1-正常、浓度1-合格

                    bg2 = 'background:red;', // 状态2-关

                    bg3 = 'background:#FF8000;', // 状态3-待清洗

                    bg4 = 'background:#FF0000;', // 状态4-故障、浓度2-超标

                    bg5 = 'background:#C6C6C6;', // 状态5-离线、设备状态2-离线

                    bg7 = 'background:#1E90FF;',

                    bg9 = 'background:black;',

                    bg8 =

                        'background:#ffff;color:#1E90FF;border:1px solid #1E90FF;'

                // bg6 =

                //     'background:#ffffff; color:#138BF5;border:1px solid #138BF5' // 多个浓度

                if (element.gkaStates.length > 0) {

                    if (element.gkaCount > 1) {

                        bgR += bg8

                        numR = element.gkaCount

                    } else {

                        // 1展示右耳朵 2展示两耳朵

                        if (element.gkaStates[0] == 1) {

                            // 正常

                            bgR += bg7

                            numR = element.gkaCount

                        } else if (element.gkaStates[0] == 2) {

                            // 关闭

                            bgR += bg5

                            numR = element.gkaCount

                        } else if (element.gkaStates[0] == 3) {

                            // 待清洗

                            bgR += bg1

                            numR = element.gkaCount

                        } else if (element.gkaStates[0] == 4) {

                            // 故障

                            bgR += bg3

                            numR = element.gkaCount

                        } else if (element.gkaStates[0] == 5) {

                            // 故障

                            bgR += bg2

                            numR = element.gkaCount

                        } else if (element.gkaStates[0] == 6) {

                            // 故障

                            bgR += bg9

                            numR = element.gkaCount

                        }

                    }

                }

                if (element.rawStates.length > 0) {

                    if (element.rawCount > 1) {

                        bgL += bg8

                        numL = element.rawCount

                    } else {

                        if (element.rawStates[0] == 1) {

                            // 正常

                            bgL += bg1

                            numL = element.rawCount

                        } else if (element.rawStates[0] == 2) {

                            // 关闭

                            bgL += bg4

                            numL = element.rawCount

                        } else if (element.rawStates[0] == 3) {

                            // 待清洗

                            bgL += bg5

                            numL = element.rawCount

                        } else if (element.rawStates[0] == 4) {

                            // 故障

                            bgL += bg7

                            numL = element.rawCount

                        }

                        if (numL == 0) {

                            //左耳朵为零时不展示左耳朵

                            numL = ''

                        } else if (numR == 0) {

                            numR = ''

                        }

                    }

                }

//左右耳朵end

                let markerContent =

                    '<div class="custom-content-marker" style="position: relative;width:40px;height:40px;">'

                markerContent +=

                    '<image src="static/base/youyan4/map/marker_blue.png" style="position: absolute;width:40px;height:40px;z-index:5"></image>'

                // if (numL !== '' && numL !== null) {

                markerContent +=

                    '<div style="' + comcss + bgL + '">' + numL + '</div>'

                // }

                // if (numR !== '' && numR !== null) {

                markerContent +=

                    '<div style="' + comcss + bgR + '">' + numR + '</div>'

                // }

                markerContent += '</div>'

                marker = new AMap.Marker({

                    position: [element.longitude, element.latitude],

                    offset: new AMap.Pixel(-13, -30),

                    size: new AMap.Size(40, 50),

                    content: markerContent,

                })

                marker.on('click', (e) => {

                    _this.initDialogData(element)

                })

                this.options.push(marker)

            })

            this.map.plugin(['AMap.MarkerClusterer'], function () {

                _this.markerClusterer = new AMap.MarkerClusterer(

                    _this.map,

                    _this.options,

                    { gridSize: 80 }

                ) // 点聚合

            })

        },

要让 Vue 中的高德地图标记击后跳动一下,可以利用高德地图 JavaScript API 的 Marker 类和 Animation 类来实现。 首先,在 Vue引入高德地图 JavaScript API: ```html <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script> ``` 然后,在 Vue 组件中创建地图标记: ```vue <template> <div ref="mapContainer" style="height: 400px;"></div> </template> <script> export default { data() { return { map: null, marker: null }; }, mounted() { this.initMap(); }, methods: { initMap() { this.map = new window.AMap.Map(this.$refs.mapContainer, { center: [116.397428, 39.90923], zoom: 13 }); this.marker = new window.AMap.Marker({ position: [116.397428, 39.90923], map: this.map, animation: 'AMAP_ANIMATION_DROP' }); this.marker.on('click', () => { this.marker.setAnimation('AMAP_ANIMATION_BOUNCE'); }); } } }; </script> ``` 在上面的代码中,首先在 mounted 钩子函数中调用 initMap 方法创建地图标记。在 initMap 方法中,我们通过创建 AMap.Map 实例来创建地图,并且通过创建 AMap.Marker 实例来创建标记。在创建标记的时候,我们设置了 animation 属性为 AMAP_ANIMATION_DROP,这样标记就会在创建时从天上掉下来。然后通过监听标记的 click 事件,在回调函数中设置 animation 属性为 AMAP_ANIMATION_BOUNCE,这样标记就会跳动起来。 注意,要让标记跳动起来,需要在创建标记时设置 animation 属性为 AMAP_ANIMATION_BOUNCE。另外,在改变标记的动画效果时,需要通过 setAnimation 方法来设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值