高德多边形编辑器边距实时计算

580 阅读2分钟

背景

就是接到需求,要求进行高德多边形编辑器操作点位时,临近的两个点位和当前操作点间的两条线实时显示长度。

技术背景

高德相应的 API

  • AMap.Polygon
  • AMap.PolygonEditor

快速看了一下,发现 AMap.PolygonEditor 的事件好像能支持这类行为😏(这波稳了)。

image.png

搞了个 demo 跑了一下,结果被这个 editor.adjust 的相应行为给蚌住了... 发现这个事件存在如下几点问题:

  • 只能在点位移动操作完成后响应;
  • 响应的结果是 target 即操作的多边形而不是当前操作的点;
  • 只有白色点(实际点)操作触发事件,蓝色点(中间点)则无法触发事件;

polygon_editor_move_point.gif

实现思路

基于以上的操作肯定是行不通的,只能另辟蹊径了。

分析一波

1、获取多边形编辑器的所有点(白色点+蓝色点);

2、基于这些点创建一个不可见的点位放在对应的操作点下;

3、给地图注册相应事件

  • mousedown: 判断鼠标点击的位置是否在这点圆内
  • mousemove: 操作点移动时,实时更新文本
  • mouseup: 清除本次操作相应的数据记录

4、命中某个圆点,则用这个圆点找到编辑器上对应的操作点(可通过经纬度查找)以及临近两个点的信息;

5、操作点移动时,使用当前鼠标移动点位和临近两个点建立两条直线并实时更新线长;

编码环节

全部代码有点多,直接简单的伪代码说明下处理流程😝.

// 基础代码

const map = new AMap.Map();

// 创建多边形
const polygon = new AMap.Polygon();

// 创建编辑器
const edtior = new AMap.PolygonEdtior(map, polygon);

// 类封装
class PolygonEdtiorRanging {

    constructor(polygonEdtior) {
        this.polygonEdtior = polygonEdtior;
    }

    start() {
        // 1、获取多边形编辑器的所有点(白色点+蓝色点)
        // 2、基于这些点创建一个不可见的点位放在对应的操作点下
        this.polygonPaths = this.getPolygonEditorTargetPaths();
        // this.circleMarkers 是一个点位收集类
        this.circleMarkers.createCircleMarkersByPaths(this.polygonPaths);

        // 3、给地图注册相应事件
        // 鼠标点下
        this.map.on('mousedown', this.onMouseDown);

        // 鼠标移动
        this.map.on('mousemove', this.onMouseMove);

        // 鼠标松开
        this.map.on('mouseup', this.onMouseUp);
    }
    
    onMouseDown(event) {
        // 4、命中某个圆点,则用这个圆点找到编辑器上对应的操作点(可通过经纬度查找)以及临近两个点的信息;
    }
    
    onMouseMove() {
        // 5、操作点移动时,使用当前鼠标移动点位和临近两个点建立两条直线并实时更新线长;
    }
    
    onMouseUp() {
        // 重置一些当前次操作数据
    }
}

结果

最后的实现效果~

polygon_editor_ranging.gif

通过上述思路进行处理的话,还可以实现其他的一些能力,如:

  • 多边形绘制时测距
  • 多边形边线测距
  • 多边形编辑器点事件扩展(mousedownmousemovemouseup

最后,为了方便有同样需求的同学,此类功能已经封装了一个 npm 包,供大家快速食用。

参考