import L from 'leaflet';
import 'leaflet-draw'
/*** 案例
* async ceju(){
* let that = this
* const p1 = await new Promise(function(resolve,reject){
* let a = new Draw(that.baseMap,that.measureGroup,resolve,reject)
* a.rectangle()
* });
* console.log(p1);
*
* },
***/
//new的时候需要传入map以及承接的layergroup
//返回值的时候需要用异步去承接,所以采用了promise
class Draw{
constructor(map,measureGroup,resolve,reject){
this.map = map
this.drawDataMap = []
this.stopRectArea = null
this.locations = {}
this.resolve = resolve
this.reject = reject
this.measureGroup = measureGroup
this.geometry = []
}
rectangle(){
let that = this
console.log('开始框选');
that.map.off("click")
that.map.off("dblclick")
that.map.off("dblclick")
if(that.stopRectArea != null){ //stopRectArea在data中定义,清除重复的拉框操作
that.map.off('mousedown', that.stopRectArea.mousedown);
}
var rectangleMeasure = {
startPoint: null,
endPoint: null,
rectangle:null,
layer: that.measureGroup,
color: "rgba(51,136,255,1)",
addRectangle:function(){
rectangleMeasure.destory();
var bounds = [];
bounds.push(rectangleMeasure.startPoint);
bounds.push(rectangleMeasure.endPoint);
rectangleMeasure.rectangle = L.rectangle(bounds, {color: rectangleMeasure.color, weight: 1});
rectangleMeasure.rectangle.addTo(rectangleMeasure.layer);
rectangleMeasure.layer.addTo(that.map);
},
mousedown: function(e){
rectangleMeasure.rectangle = null;
that.map.dragging.disable();
rectangleMeasure.startPoint = e.latlng;
that.map.on('mousemove',rectangleMeasure.mousemove)
},
mousemove:function(e){
rectangleMeasure.endPoint = e.latlng;
rectangleMeasure.addRectangle();
that.map.off('mousedown ', rectangleMeasure.mousedown).on('mouseup', rectangleMeasure.mouseup);
},
mouseup: function(){
that.map.dragging.enable();
that.map.off('mousemove',rectangleMeasure.mousemove).off('mouseup', rectangleMeasure.mouseup);
that.locations = {}; //locations在data中定义
that.locations['leftX'] = rectangleMeasure.startPoint.lat;
that.locations['leftY'] = rectangleMeasure.startPoint.lng;
that.locations['rightX'] = rectangleMeasure.endPoint.lat;
that.locations['rightY'] = rectangleMeasure.endPoint.lng;
that.locations['layer_id'] = rectangleMeasure.layer._leaflet_id;
that.locations['layer'] = rectangleMeasure.layer;
that.locations['rectangle'] = rectangleMeasure.rectangle;
that.drawDataMap.push([rectangleMeasure.startPoint.lat,rectangleMeasure.startPoint.lng])
that.drawDataMap.push([rectangleMeasure.endPoint.lat,rectangleMeasure.startPoint.lng])
that.drawDataMap.push([rectangleMeasure.endPoint.lat,rectangleMeasure.endPoint.lng])
that.drawDataMap.push([rectangleMeasure.startPoint.lat,rectangleMeasure.endPoint.lng])
that.resolve(that.drawDataMap)
},
destory:function(){
if(rectangleMeasure.rectangle)
rectangleMeasure.layer.removeLayer(rectangleMeasure.rectangle);
}
};
that.stopRectArea = rectangleMeasure; //记录已点击拉框按钮,未在地图上拉框
that.map.on('mousedown', rectangleMeasure.mousedown); //在地图上拉框
}
polygon(){
let that = this
that.measureGroup.clearLayers()
var points,lines,tempLines,node;
that.map.off("mousemove")
that.map.off("mousedown")
that.map.off("mouseup")
function drawPolygon(){
that.map.doubleClickZoom.disable();
lines = new L.polyline([]);
tempLines = new L.polyline([],{ dashArray: 5 });
points = [];
that.geometry = [];
that.map.on('click', onClick); //点击地图
that.map.on('dblclick', onDoubleClick);
that.map.on('mousemove', onMove)//双击地图
function onClick(e) {
points.push([e.latlng.lat, e.latlng.lng])
lines.addLatLng(e.latlng)
that.measureGroup.addLayer(tempLines)
that.measureGroup.addLayer(lines)
node=L.circle(e.latlng, { color: '#ff0000', fillColor: 'ff0000', fillOpacity: 1 })
that.measureGroup.addLayer(node)
that.geometry.push(node)
}
function onMove(e) {
if (points.length > 0) {
let ls = [points[points.length - 1], [e.latlng.lat, e.latlng.lng], points[0]]
tempLines.setLatLngs(ls)
// that.map.addLayer(tempLines)
}
}
function onDoubleClick() {
that.geometry.push(L.polygon(points).addTo(that.map))
that.drawDataMap = points
that.drawDataMap.splice(that.drawDataMap.length-1,1)
points = [];
node=null;
that.map.off('click', onClick); //点击地图
that.map.off('dblclick', onDoubleClick);
that.map.off('mousemove', onMove)//双击地图
that.map.doubleClickZoom.enable();
that.resolve(that.drawDataMap)
}
}
that.removePolygon()
drawPolygon()
}
removePolygon(){
for(let ooo of this.geometry){
ooo.remove();
}
}
}
export default Draw