博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百度地图-矩形编辑的模拟实现
阅读量:7080 次
发布时间:2019-06-28

本文共 2871 字,大约阅读时间需要 9 分钟。

百度地图的绘制功能drawingManager其中矩形和多边形采用的是同一种绘制原理

矩形和多边形构造函数是一致的
因此在面可编辑模式enableEditing下矩形就会和多边形一样产生多个节点的可选状态
矩形的编辑状态
更重要的是,拖动角点不会作为矩形移动
矩形的拖动状态


在网上搜也没看到对应的解决,因此自己就把一个模拟的解决方案分享一下吧,

实现原理:

1.定位两斜角点;

2.使用marker对两点进行标注;
3.监听marker的移动状态;
4.根据移动状态使用setPath实现多边形的重绘,模拟矩形的可编辑状态;

主要代码

//初始化绘制工具栏const drawingManager = new BMapLib.DrawingManager(this.map, {                isOpen: false,                  enableDrawingTool: true,                enableCalculate: false,                drawingToolOptions: {                    anchor: BMAP_ANCHOR_TOP_LEFT,                    drawingModes : [                        BMAP_DRAWING_CIRCLE,                        BMAP_DRAWING_RECTANGLE,                        BMAP_DRAWING_POLYGON                     ]                }            });//监听绘制完成drawingManager.addEventListener("overlaycomplete", (e)=> {                /*                    在此判断分离出矩形的方法                 */                if (e.drawingMode=='rectangle') {                    var myIcon = new BMap.Icon(select, new BMap.Size(13,13));//增加icon,可以截取百度默认的选择框增加相似度                    e.overlay.ia.map((item,index)=>{                        if (index==0) {//左上角点                            this.startPoint=item                            let markerStart = new BMap.Marker(item,{icon:myIcon})                            markerStart.enableDragging()                            markerStart.addEventListener('dragging',(target)=>{                                this.startPoint = target.point                                e.overlay.setPath(this._getRectanglePoint(target.point,this.endPoint),this.options);                            })                            this.map.addOverlay(markerStart);                         }else if (index==2) {//右下角点                            this.endPoint=item                            let markerEnd = new BMap.Marker(item,{icon:myIcon})                            markerEnd.enableDragging()                            markerEnd.addEventListener('dragging',(target)=>{                                this.endPoint=target.point                                e.overlay.setPath(this._getRectanglePoint(this.startPoint,target.point),this.options);                            })                            this.map.addOverlay(markerEnd);                         }                    })                }else{                    //其它图形打开编辑功能                                                                                                                                                   e.overlay.enableEditing();                }                            });_getRectanglePoint(startPoint,endPoint){            return [                new BMap.Point(startPoint.lng,startPoint.lat),                new BMap.Point(endPoint.lng,startPoint.lat),                new BMap.Point(endPoint.lng,endPoint.lat),                new BMap.Point(startPoint.lng,endPoint.lat)            ];        }

效果如下

动态效果图

转载地址:http://tcvml.baihongyu.com/

你可能感兴趣的文章
微服务架构
查看>>
有关Ossim 4.8系统首次登陆设置密码失败问题的解决方法
查看>>
简单快速的上手使用gitbash
查看>>
neo4j开发
查看>>
系统规划笔记
查看>>
jtds用PreparedStatement查询大数据时慢的问题(轉)
查看>>
jsp中include指令静态导入和动态导入的区别详解
查看>>
Java构造和解析Json数据的两种方法详解一
查看>>
CopyOnWriteArrayList
查看>>
mysql数据库详解(续二)
查看>>
我的友情链接
查看>>
通过简单设置让CACTI支持中文显示
查看>>
WAF+SLB负载不均衡案例分享
查看>>
我的友情链接
查看>>
java final关键字
查看>>
磁盘分配
查看>>
我的友情链接
查看>>
斯坦佛编程教程-Unix编程工具(三)
查看>>
DHCP和TFTP配置以及CentOS 7上的服务控制
查看>>
Python 5.5 使用枚举类
查看>>