鼠标绘制库 bmap-draw 功能拓展

发布时间 2023-08-22 00:29:38作者: 混名汪小星

图标连线

image

思路:
参考ANTV X6 边线配置将两点之间的线定义为边,边会绑定两个属性来指定边对应的两个图标绘制物的key
source:起点绘制物key
target:目标绘制物key

定义edge 来 临时存储边线,点击第一个图标,会存储souce的key

       new BMapGL.MenuItem("连线", (e) => {
             this.edge = {
              source: overlay.key,
              vertices: [e],//经纬度e ={lat,lon}
            };
            sessionStorage.setItem("match", JSON.stringify(e));
          })

重点部分:此处对应需要改动bmap-draw.min.js源码实现两点连线后不弹出编辑按钮

sessionStorage.setItem("match", JSON.stringify(e));

image

点击第二个图标

       let point = overlay.getPosition();
        //增加连线
        if (this.edge.source) {
          let edgeKey = "edge_" + new Date().getTime();
         this.edge = {
            ...this.edge,
            target: overlay.key,
            key: edgeKey,
            vertices: [...this.edge.vertices, point],
          };
     //自定义的绘制直线方法可忽略此处代码
          this.initMapDraw(this.edge);
	 //绘制完成后清空边线
          this.edge = {}

点击图标 删除时

 // 创建 GeoJSON 图层
      this.polyLayer = new BMapGL.GeoJSONLayer("poly", {
        dataSource: null,
      });
      // 将 GeoJSON 数据添加到图层中
      this.map.addGeoJSONLayer(this.polyLayer);
      this.scene.attachSnapSource(this.polyLayer.overlayData);

//此处是图标删除时 将关联边线也删除
 let allEdgeData = [...this.polyLayer.overlayData];
        allEdgeData.forEach((ii) => {
          if (ii.source == overlay.key || ii.target == overlay.key) {
            this.polyLayer.removeOverlay(ii);
          }
        });

直线布设

image

需求:已知起始点经纬度,设定将直线均分为n个点,点位设置图标
思路:将直线均分,将均分的经纬度打上图标
计算两点的偏移量及距离,不需要用正弦,余弦,就是个简单的数学问题
参考 作业帮
image

/**
 * 
 * @param {object} start  开始点位
 * @param {object} end  结束点位
 * @param {number} n 等分数
 * @return array
 */
export function getLineCenter(start, end, n) {
  var disX = end.lng - start.lng;
  var disY = end.lat - start.lat;
  let pointArr = [];
  let i = 0; //disX和disy分别除以N,得到每个等分点的经纬度分别需要偏移的值
  var newdisX = disX / n,
    newdisY = disY / n;
  while (i <= n) {
    //得到新的经纬度坐标
    var newptX = start.lng + newdisX * i,
      newptY = start.lat + newdisY * i;
    //将新的坐标点存到一个新的数组中,该数组即为我们需要的坐标点的集合

    let point = new BMapGL.Point(newptX, newptY);
    pointArr.push(point);

    i++;
  }
  return pointArr;
}