百度地图绘制网格、编辑网格边界、编辑网格中心点坐标

文章介绍了如何结合vxe-modal弹框和百度地图API来实现网格的绘制和编辑功能。在初始化地图后,根据已有数据或默认坐标设置中心点,通过监听事件处理网格边界的修改和新增。同时,允许用户通过拖动中心点标记来编辑网格中心的坐标。

各个网格弹框使用vxe-modal弹框进行展示
引入相应css与js

<!--鼠标绘制样式文件-->
<link rel="stylesheet" href="https://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css" />
<script type="text/javascript"src="https://api.map.baidu.com/api?v='版本号'&ak='百度地图key'"></script>
<!--鼠标绘制js文件-->
<script type="text/javascript" src="https://api.map.baidu.com/librar/DrawingManager/1.4/src/DrawingManager_min.js"></script>

一、绘制网格,编辑网格边界

话不多说,直接上代码

initGisMap() {
 let obj = this
 let temp = ''
 let tem1 = ''
 let centrMarkers = ''
 let arr = []
 console.log(obj.formData.gridCenterNode)//已有网格数据
 if (obj.formData.gridCenterNode != '' && obj.formData.gridCenterNode != null) {
   //对接口返回的数据进行整理
      temp = obj.formData.gridCenterNode.replace("\"", "").replace("\"", "")
      tem1 = temp.substring(1, temp.length - 1)
      centrMarkers = [tem1.split(',')[0], tem1.split(',')[1]]
      console.log(centrMarkers)
      map = new BMap.Map("container");//初始化地图
      let point = new BMap.Point(centrMarkers[0], centrMarkers[1])
      map.centerAndZoom(point, 15);
      map.enableScrollWheelZoom();
      marker = new BMap.Marker(point);
      map.addOverlay(marker);
   } else {
      centrMarkers = [102.70514021110947, 25.07732362444036]//默认中心点坐标
      map = new BMap.Map("container");
      let point = new BMap.Point(centrMarkers[0], centrMarkers[1])
      map.centerAndZoom(point, 15);
      map.enableScrollWheelZoom();
      marker = new BMap.Marker(point);
      map.addOverlay(marker);
   }
 if((obj.formData.gridNode != '' && obj.formData.gridNode != null)||obj.showView){
   //修改网格边界
      obj.gridMapType = 'update'
      let arrNeed = JSON.parse(obj.formData.gridNode)//网格边界坐标
      let needPoint = []
      arrNeed.forEach(item=>{
        needPoint.push(new BMap.Point(item.lng, item.lat))
     })
     //绘制多边形
     polygon = new BMap.Polygon(needPoint, {strokeColor:"red",fillColor: "red", strokeWeight:3, strokeOpacity:0.8});   //创建折线
     map.addOverlay(polygon);   //增加折线
     if(obj.showView){
       polygon.disableEditing()
     }else {
       polygon.enableEditing()
     }
     polygon.addEventListener('lineupdate', (type, target) => {
       let path = type.currentTarget.getPath();
       let targetArr = []
       for (let i = 0; i < path.length; i++) {
         targetArr.push({lng:path[i].lng,lat:path[i].lat})
       }
         targetArr = JSON.stringify(targetArr)
         obj.formData.gridNode = targetArr
     })
}else{
//新增网格,绘制区域
    obj.gridMapType = 'add'
    //鼠标绘制完成回调方法   获取各个点的经纬度
    var overlays = [];
    var styleOptions = {
        strokeColor: "red", //边线颜色。
        fillColor: "red", //填充颜色。当参数为空时,圆形将没有填充效果。
        strokeWeight: 3, //边线的宽度,以像素为单位。
        strokeOpacity: 0.8, //边线透明度,取值范围0 - 1。
        fillOpacity: 0.6, //填充的透明度,取值范围0 - 1。
        strokeStyle: 'solid' //边线的样式,solid或dashed。
     }
     //实例化鼠标绘制工具
     var drawingManager = new BMapLib.DrawingManager(map, {
        isOpen: true, //是否开启绘制模式
        enableDrawingTool: true, //是否显示工具栏
        drawingMode: BMAP_DRAWING_POLYGON, //绘制模式  多边形
        drawingToolOptions: {
        anchor: BMAP_ANCHOR_TOP_RIGHT, //位置
        offset: new BMap.Size(5, 5), //偏离值
        drawingModes: [
          BMAP_DRAWING_POLYGON
        ]
     },
     polygonOptions: styleOptions //多边形的样式
   });
  drawingManager.addEventListener('overlaycomplete', function (e) {
     overlays.push(e.overlay);
     let path = e.overlay.getPath(); //Array<Point> 返回多边型的点数组
     let targetArr = []
     for (let i = 0; i < path.length; i++) {
       console.log("lng:" + path[i].lng + "\n lat:" + path[i].lat);
       targetArr.push({lng:path[i].lng,lat:path[i].lat})
     }
     targetArr = JSON.stringify(targetArr)
     obj.formData.gridNode = targetArr
    });
  }
},

效果图:

  1. 编辑网格边界
    在这里插入图片描述
  2. 新增网格,绘制边界
    单击鼠标标点——移动鼠标画折现——双击鼠标绘制结束
    在这里插入图片描述
    绘制成功展示:在这里插入图片描述

二、编辑网格中心节点坐标

initMap() {
	let obj = this
	let marker = []
	let centerMarke = []
	 let temp = ''
	 let tem1 = ''
	 let markers, map
	 if (obj.formData.gridCenterNode != '' && obj.formData.gridCenterNode != null) {
	 	temp = obj.formData.gridCenterNode.replace("\"", "").replace("\"", "")
	 	tem1 = temp.substring(1, temp.length - 1)
	 	centerMarke = [tem1.split(',')[0], tem1.split(',')[1]]
	 	map = new BMap.Map("mapContent");
	 	let point = new BMap.Point(centerMarke[0], centerMarke[1])
	 	map.centerAndZoom(point, 15);
	 	map.enableScrollWheelZoom();
	 	marker = new BMap.Marker(point);
	 	map.addOverlay(marker);
	 	marker.enableDragging();
	 	map.addEventListener('click', (e) => {
	 		map.removeOverlay(marker)
	 		marker = new BMap.Marker(new BMap.Point(e.point.lng, e.point.lat));
	 		map.addOverlay(marker);
	 		marker.enableDragging();
	 		let arr = [e.point.lng + ',' + e.point.lat]
	 		obj.centerMarker = arr
	 	})
	 } else {
	 	centerMarke = [102.70566637350713, 25.077097062450438]
	 	obj.centerMarker = centerMarke
	 	map = new BMap.Map("mapContent");
	 	let point = new BMap.Point(centerMarke[0], centerMarke[1])
	 	marker = new BMap.Marker(point);
	 	map.addOverlay(marker);
	 	map.centerAndZoom(point, 15);
	 	map.enableScrollWheelZoom();
	 	map.enableContinuousZoom();
	 	map.addEventListener('click', (e) => {
	 		map.removeOverlay(marker)
	 		marker = new BMap.Marker(new BMap.Point(e.point.lng, e.point.lat));
	 		map.addOverlay(marker);
	 		marker.enableDragging();
	 		let arr = [e.point.lng + ',' + e.point.lat]
	 		obj.centerMarker = arr
	 	})
	 }
},

效果图:
中心点通过鼠标拖动默认中心点进行改变
在这里插入图片描述

### 原理 SLAM(同步定位与地图构建)网格地图是将环境空间划分为一个个小的网格单元,每个网格单元都有一个值来表示该网格被占据、空闲或者未知的概率。在SLAM过程中,传感器(如激光雷达)不断获取环境信息,根据传感器数据更新每个网格单元的状态概率。例如,当激光雷达的光线经过某个网格时,该网格被认为是空闲的概率增加;若光线在某个网格处检测到障碍物,则该网格被占据的概率增加。通过不断地更新这些概率,最终形成对环境的地图表示。 ### 应用 - **机器人导航**:为机器人在未知环境中提供精确的地图信息,帮助机器人规划路径,避开障碍物,实现自主导航。例如在仓库中,机器人可以根据SLAM网格地图自主移动到指定位置完成货物搬运任务。 - **自动驾驶**:车辆可以利用SLAM网格地图识别道路、交通标志和其他障碍物,从而实现自动驾驶功能,提高行车安全性和效率。 - **增强现实(AR)与虚拟现实(VR)**:在AR/VR应用中,SLAM网格地图可用于创建真实环境的三维模型,使虚拟物体能够与真实环境更好地融合,提升用户的沉浸感。 ### 实现方法 - **数据获取**:通常使用激光雷达、视觉传感器等获取环境的距离和图像信息。例如激光SLAM系统使用激光雷达获取环境中的距离测量数据,这些数据是构建网格地图的基础[^2]。 - **数据处理与更新**:根据传感器数据更新每个网格单元的状态概率。常用的方法有贝叶斯滤波,通过不断地融合新的传感器数据,更新网格单元被占据或空闲的概率。 - **匹配与定位**:将当前传感器数据与已构建的网格地图进行匹配,估计机器人的位置和姿态。这一步骤是SLAM的关键部分,常用的匹配算法有迭代最近点(ICP)算法等。 - **地图优化**:随着机器人的移动和新数据的获取,需要对网格地图进行优化,以提高地图的准确性和一致性。例如使用图优化方法,对地图中的约束关系进行优化。 ```python # 以下是一个简单的示例代码,用于模拟网格地图的更新 import numpy as np # 初始化网格地图 grid_size = 10 grid_map = np.zeros((grid_size, grid_size)) # 初始时所有网格未知 # 模拟传感器数据 sensor_data = [(2, 3), (4, 5)] # 检测到障碍物的网格坐标 # 更新网格地图 for x, y in sensor_data: grid_map[x, y] = 1 # 标记为被占据 print(grid_map) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值