开始最前提到对地图覆盖物的使用,到目前为止只剩  Polygon(多边形)  Circle(圆形)这两个还没有进一步说明,那么今天我们所要讲解的电子围栏功能会用到这两个覆盖物,当然也会用到Marker覆盖物 Polyline(折线)一起来实现:

实现思路(多边形实现):

  • 用户触发添加按钮,打开添加电子围栏模式(当然通过布尔变量来决定是否可以绘制)
  • 当用户打开电子围栏绘制是,点击第一个顶点是可以给一个参照使用Marker覆盖物做一个锚点
  • 点击第二个或锚点是移除第一个顶点的锚点,并且通过Polyline(折线)将一 二顶点连接,接下来的顶点自动连接即可
  • 当用需要保持电子围栏时,将之前的点位全部传入PolygonOptions,生成PolygonOptions对象,添加到地图
  • 需要实现是将 Polygon对象显示出来
  • 需要保存数据是,通过地图可以获取到Polygon对象,通过Polygon对象可以获取到经纬度的集合,保存即可
  • 使用时有经纬度的集合可,可以显示电子围栏也,可以根据经纬度集合判断指定的位置是否在围栏中

看到这里可能有点懵,怎么一会儿是Polygon对象一会儿又是PolygonOptions对象,其实给地图添加覆盖物时需要的参数都是xxOptions对象,但是添加到地图时,返回的可操作对象就是xx了。之前添加Marker覆盖物添加时必须使用MarkerOptions,而返回的对象就是Marker对象。

开始实现功能(代码部分使用的kotlin实现):

高德地图:

用户点击地图选择电子围栏范围:

//地图上点击监听
aMap.setOnMapClickListener {/*** 根据用户在地图上的点击,绘制多边形的定点*/if (iseDitMode) { //iseditMode是一个控制当用户点击添加电子围栏时该变量修改为true//将位置加入集合latLngs.add(it)//判断是否为第一个顶点if (latLngs.size > 1) {/** 如果非首个顶点添加到轨迹中*///这里逻辑在运动轨迹文章中已经介绍var  polyline =  aMap.addPolyline(PolylineOptions()//集合数据.addAll(latLngs).width(4f).setDottedLine(false).geodesic(true)//颜色.color(Color.argb(255, 255, 68, 0)))polylines.add(polyline)//移除首个锚点this.marker!!.remove()} else {如果是首个顶点那么先标记成锚点markerOptions.position(it)marker = aMap.addMarker(markerOptions);trajectory(it)}}}

选择好电子围栏顶点点击保存:

//使用本次添加的顶点生成多边形对象并存储起来
mPolygonOptions.add(PolygonOptions().addAll(latLngs))/*** 移除绘制过程的定点覆盖物
*/for (polyline in polylines) {polyline.remove()
}

显示电子围栏

/*** 根据用户存储的多边形对象显示电子围栏* 通过aMap.addPolygon(polygonOptions)可以得到多边形对象* 通过polygon.contains(LatLng)可以判断出该Latlng对象是否在电子围栏中**/private fun showPolygonOptions() {//将存储的多边形对象取出添加到地图上for (polygonOptions in mPolygonOptions) {polygonOptions.fillColor(Color.argb(150, 239, 113, 113)).strokeColor(Color.argb(150, 239, 113, 113)).strokeWidth(1f)var  polygon = aMap.addPolygon(polygonOptions);mPolygons.add(aMap.addPolygon(polygonOptions))}}

关闭电子围栏显示:

 /*** 关闭显示的电子围覆盖层*/private fun closAllPolygonOptions() {//循化将多个电子围栏覆盖物移除for (polygon in mPolygons) {polygon.remove()}aMap.invalidate()}

到目前高德地图的设置不规则电子围栏设置步骤完成,但是代码还有待优化尤其显示和关闭,其实可以用显示和隐藏,不用每次添加和移除。百度地图的实现将使用不同的方式,这里就不给贴代码了 。

百度地图:

用户点击地图选择电子围栏范围:

//用户点击地图回调mBaiduMap.setOnMapClickListener(object : BaiduMap.OnMapClickListener {override fun onMapClick(latLng: LatLng) {/*** 根据用户的点击绘制多边形的定点*/if (iseDitMode) {latLngs.add(latLng)if (latLngs.size > 1) {if (bdPolyline != null) {bdPolyline!!.remove()}mPolylineOptions.points(latLngs).dottedLine(false).color(Color.argb(255, 255, 20, 147)).width(5)bdPolyline = mBaiduMap.addOverlay(mPolylineOptions);bdStartMarker1!!.remove()} else if (latLngs.size > 0) {var markerOption = MarkerOptions()markerOption.position(latLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.express_icon_location_centre_point))bdStartMarker1 = mBaiduMap.addOverlay(markerOption)}}}override fun onMapPoiClick(mapPoi: MapPoi): Boolean {return false}})

用户点击保存电子围栏:

/*** 根据定点生产多边形对象,及可以作为围栏对象* 通过com.baidu.mapapi.utils*                SpatialRelationUtil*              可以判断经纬度是否在电子围栏中*              isPolygonContainsPoint()可以判断对象点位是否在电子围栏中*/private fun savPolygonOptions() {if (latLngs.size > 2) {//latLngs.add(latLngs.get(0))var latLng = arrayListOf<LatLng>()latLng = latLngs.clone() as ArrayList<LatLng>;//生成多边形对象var polygonOptions = PolygonOptions().points(latLngs).fillColor(Color.argb(150, 239, 113, 113))//设置为不可见polygonOptions.visible(false)//将多边形对象存储bdPolygonOptions.add(polygonOptions)//添加多边形到地图,并将返回的可操作对象(电子围栏)存储bdDrawPolylineOptionsOverlayList.add(mBaiduMap.addOverlay(polygonOptions))//移除添加电子围栏时的选点过程if (bdPolyline != null) {bdPolyline!!.remove()}trajectory.setText("显示围栏")} else {Toast.makeText(this, "至少添加三个点才能建立围栏", Toast.LENGTH_LONG).show()}}

显示电子围栏

/*** 显示围栏对象(高德地图也可以使用该方式显示,)*/private fun showPolygonOptions() {//将电子存储的电子围栏对象取出通过setVisible(true)方法显示出来for (overlay in bdDrawPolylineOptionsOverlayList) {overlay.setVisible(true)}}

关闭电子围栏:

/*** 隐藏围栏对象*/private fun closAllPolygonOptions() {for (overlay in bdDrawPolylineOptionsOverlayList) {overlay.setVisible(false)}}

百度地图添加电子围栏过程到这里完成了

拓展:

通过以上分别介绍了高德地图和百度地图的电子围栏实现方法,但是怎么确定某一个位置是否位于电子围栏中呢:

高德地图通过:Polygon的contains(LatLng latLng) 方法可以知道指定的位置是否在电子围栏中不

百度地图需要通过一个工具类:com.baidu.mapapi.utils.SpatialRelationUtil

后两个方法可以判断指定位置是否在区域中

总结:

这里是通过百度地图提供的一些覆盖为去划定,区域做电子围栏添加和管理,其实还可以自定义一个画图控件覆盖在地图上,通过手动绘制区域,通过地图的Api获取屏幕位置对应的Api可以添加电子围栏,电子围栏其实就是划定的一个区域,通过两个的对不您应该发现了,百度地图和高德地图有一些Api的使用和甚至名称都相同。如果您有更好的实现过程请您分享一下。地图的使用文章更新到这里,如果有问题欢迎提问

项目已经上传Github项目地址点击这里

百度、高德地图功能进一步探索之—电子围栏绘制(三)相关推荐

  1. 百度高德地图行政区域边界GeoJSON数据获取并绘制行政区域

    highcharts 是提供地图数据包的:https://www.highcharts.com/docs/maps/map-collection echart矢量地图或者地图绘制矢量图层,GeoJSO ...

  2. vue人员轨迹_在vue中高德地图引入和轨迹的绘制的实现

    高德地图引入和轨迹的绘制 1.第一步 vue中使用cdn引入高德地图,并在main.js中进行全局配置.(百度上有高德地图引入与配置方法,这里就不详细介绍): 1)npm install vue-am ...

  3. vue是否可以做行车轨迹_在vue中高德地图引入和轨迹的绘制的实现

    高德地图引入和轨迹的绘制 1.第一步 vue中使用cdn引入高德地图,并在main.js中进行全局配置.(百度上有高德地图引入与配置方法,这里就不详细介绍): 1)npm install vue-am ...

  4. 南京:探索实施“电子围栏”管理新模式 缓解商圈周边道路交通拥堵

    来源:交通言究社 导 语 城市商圈周边道路普遍存在拥堵.秩序混乱等问题,南京新街口商圈周边道路常年拥堵,而且在南京全市各区域中车辆运行速度最低.为缓解拥堵,南京交警分析拥堵原因,创新管理模式,深化警企 ...

  5. 移动互联风口频现,百度高德谁已手握地图关键钥匙

    随着有车一族的增多,地图的重要性日益凸显,当前国内地图市场竞争已经变得越发激烈.近来,百度地图与高德地图皆在多个与地图.出行.LBS.生活等相关的领域谋篇布局.4月19日,百度地图公布国际化战略,宣布 ...

  6. 移动端地图技术分享 百度高德SDK

    移动端地图技术分享 字数4797 阅读8121 评论7 喜欢16 http://www.jianshu.com/p/41179be5893a 该文章属于<简书 - 刘小壮>原创,转载请注明 ...

  7. 高德地图路径轨迹起点标点不变_前有百度高德,后有华为滴滴,腾讯地图该如何上演王者归来的戏码?...

    腾讯地图界面(图片来自网络) 文 | 魏启扬 来源 | 智能相对论(ID:aixdlun) BAT的商战大戏是科技圈永不过时的话题. 手机地图的竞争版图中,阿里的高德地图.百度地图两骑绝尘,拥有绝对的 ...

  8. 前有百度高德,后有华为滴滴,腾讯地图该如何上演王者归来戏码?

    腾讯地图界面(图片来自网络) 文 | 魏启扬 来源 | 智能相对论(ID:aixdlun) BAT的商战大戏是科技圈永不过时的话题. 手机地图的竞争版图中,阿里的高德地图.百度地图两骑绝尘,拥有绝对的 ...

  9. AR+LBS街景实景红包PokemonGo游戏捉妖夺宝营销解决方案定制开发暨百度高德地图Unity插件SDK

    AR+LBS街景实景红包PokemonGo游戏捉妖夺宝营销解决方案定制开发暨百度高德地图Unity插件SDK 作者 komstone https://blog.csdn.net/komstone/ar ...

最新文章

  1. 腾讯 Node.js 基础设施 Tencent Server Web 正式开源
  2. 6463: Tak and Hotels II(倍增)
  3. matlab正弦光栅,科学网—光栅-正弦,矩形 - 宗兆玉的博文
  4. Jmeter中JDBC链接配置 JDBC Connection Configuration
  5. mysql 运行模式_MySQL的运行模式及一些特性,引擎、事务、并发控制、优化总结...
  6. php如何安装源码包,php源码包安装步骤是什么
  7. vagrant 的安装与使用
  8. 记录下我磕磕碰碰的三个月找工作经历,BAT大厂面试总结
  9. (转)Astar寻路教程
  10. 【python】断言的用法
  11. V4L2框架-control
  12. 利用bilibili增强脚本下载B站视频+更多强大功能
  13. 如何生成java dump文件
  14. windows无法自动修复此计算机 鼠标,win10出现你的账户已被停用。开机按F8进不去。自动修复鼠标和键盘都用...
  15. 支付系统 — 支付路由
  16. python编程入门第九讲_python 基础 19 习题9 讲解
  17. 俺同学的QQ签名,我晕~
  18. 浙江省计算机二级office大纲,(2016浙江省计算机二级office大纲.docx
  19. vue中字典值存在多个进行反写
  20. 来自520的福利----视频直播平台性能测试

热门文章

  1. 网络上的计算机之间又是如何交换信息的。(TCP/IP协议、IPX/SPX协议、NetBEUI协议)
  2. CSDN Markdown 去除图片水印——最新方法
  3. 基于QT的考试管理系统设计与实现
  4. Synergy配置过程--实现跨电脑的键鼠互通操作
  5. 带你走进微处理架构的世界
  6. 2022年湖南成考潇湘成招健康打卡时间已调整
  7. SyntaxError: Non-ASCII character ‘\xe2‘ in file
  8. 无处不在的Oracle数据库控制文件备份
  9. 第55周收录123起融资,国内一半未披露金额,全球电商值得关注 | 潜在周报
  10. 网络合同翻译 英中互译常用术语有哪些