在做基于LBS的应用中,时常会和地图打交道,最直接的解决方案,当然是去对应的地图官网找文档,然后一步步来玩。对于简单场景而言,体验应该还好,但对于一些状态多,变化频繁的复杂场景而言,不仅要时刻维护本地数据状态和地图状态同步,还要查找设置各种状态的地图API,实在是让人头疼的事情,这里我把我自己做过的经验分享一下,一来是自己做下笔记,二来是希望能给一些网友帮助。查看效果
- 项目目录结构
使用vue-cli创建的工程
- 引入高德地图资源
在index.html页面加入资源:
<script src="http://webapi.amap.com/maps?v=1.4.5&key=你的key"></script>
还没有创建过高德地图开发者账号的,这里有传送门
- 获取围栏列表
查看高德地图地理围栏API文档,传送门
通过查阅文档可知,查询围栏接口为:http://restapi.amap.com/v4/geofence/meta?key=用户key;这里建议开发者定义一个全局变量key,在后续的创建围栏、删除围栏都需要,这样方便以后更改。
获取数据结构为:
拿到数据后可以直接显示在页面当中:如图所示
- 创建围栏
1、创建地图对象
再edit.vue中首先选定地图的div容器,再创建地图对象。
<div id="container" tabindex="0"></div>
在钩子函数mounted中创建地图对象。为什么要在mounted而不是在created呢?
created是在实列创建之后执行的函数,而mounted是在HTML加载完成之后执行的函数。地图这里适合这里创建地图对象。
2、设置marker点标注
设置围栏需要设置知道经度纬度,这就需要点击地图上任意位置,点击了还需要知道点击了哪些位置,所以需要设置marker点标注。
给地图绑定点击事件,绑定点击事件后,点击的时候回返回经度纬度,这那个便可以这只marker点。
在高德地图API文档中有绑定事件说明。原始写法中是这样的:
在这里我是做了这样的处理:
//高德地图绑定点击事件
this.map.on("click", res => {
//获取到经度纬度
let data = { Lng: res.lnglat.getLng(), lat: res.lnglat.getLat() };
});
设置marker点:
高德地图API文档中设置marker 点写法为:
marker = new AMap.Marker({
position: provinces[i].center.split(','),
title: provinces[i].name
});
marker.setMap(mapObj);
我在设置围栏点时候,设置两种类型,一种是圆形围栏,另外一种是多边形围栏。在设置圆形围栏点时候,你需要有一个更新marker点,以为圆形围栏是只有一个点,只需要设置半径大小。每次点击地图上点任意点都是更新marker点,也就是重新这只圆形围栏。
//第一次点击设置标记
var positionMark;
postionMark = new AMap.Marker({
map: _this.map,//地图对象
icon: _this.markers[0].icon,//markers数组,储存marker点标注数据
position: [
_this.markers[0].position[0],
_this.markers[0].position[1]
],
offset: new AMap.Pixel(-12, -36)
});
postionMark.setMap(_this.map);
//更新点标注
//第二次更新标记,高德地图api方法
postionMark.setPosition([
_this.markers[0].position[0],
_this.markers[0].position[1]
]); //更新点标记位置
具体代码:
以上代码就是具体点设置地理围栏点方法,最重要点是查看API文档,高德地图里每个参数都是有写,仔细查看都能找到具体的方法。文档就写到这里,如果有什么问题可以随时在github上留言。把自己折腾的东西写出来是为了以后工作中快速找到问题点,再一个就是给自己给同样遇到问题的网友提供帮助。欢迎吐槽。。。