import L from 'leaflet';
import 'leaflet-draw'
class DrawPlug {constructor(map,measureGroup) {
// 测距侧面
this.DRAWING = false; // 是否正在绘制
this.DRAWLAYERS = [];
this.BarDRAWLAYERS = [];
this.ISMEASURE = true; // 是否是量距
this.MEASURETOOLTIP; // 量距提醒
this.MEASUREAREATOOLTIP; // 量面提醒
this.MEASURERESULT = 0; // 测量后果
this.DRAWPOLYLINE; // 绘制的折线
this.DRAWMOVEPOLYLINE; // 绘制过程中的折线
this.DRAWPOLYLINEPOINTS = []; // 绘制的折线的节点集
this.DRAWPOLYGON; // 绘制的面
this.DRAWMOVEPOLYGON; // 绘制过程中的面
this.DRAWPOLYGONPOINTS = []; // 绘制的面的节点集
this.map = map;
this.measureGroup = measureGroup;
}
startDrawLine() {
let that = this
that.MEASURERESULT = 0; // 测量后果
that.map.getContainer().style.cursor = 'crosshair';
var shapeOptions = {
color: '#3388ff',
weight: 3,
opacity: 0.8,
fill: false,
clickable: true
}
that.DRAWPOLYLINE = new L.Polyline([], shapeOptions); // 绘制的折线
that.measureGroup.addLayer(that.DRAWPOLYLINE);
if (that.ISMEASURE) { // 是否是量距
that.MEASURETOOLTIP = new L.Tooltip(that.map); // 量距提醒
}
that.map.on('mousedown', onClick);
that.map.on('dblclick', onDoubleClick);
function onClick(e) {console.log('onClick');
that.DRAWING = true; // 是否正在绘制
that.DRAWPOLYLINEPOINTS.push(e.latlng); // 绘制的折线的节点集
if (that.DRAWPOLYLINEPOINTS.length > 1 && that.ISMEASURE) { // 是否是量距
that.MEASURERESULT += e.latlng.distanceTo(that.DRAWPOLYLINEPOINTS[that.DRAWPOLYLINEPOINTS.length - 2]);
}
that.DRAWPOLYLINE.addLatLng(e.latlng); // 绘制的折线
that.map.on('mousemove', onMove);
}
function onMove(e) {if (that.DRAWING) { // 是否正在绘制
if (that.DRAWMOVEPOLYLINE != undefined && that.DRAWMOVEPOLYLINE != null) { // 绘制过程中的折线
that.measureGroup.removeLayer(that.DRAWMOVEPOLYLINE);
}
var prevPoint = that.DRAWPOLYLINEPOINTS[that.DRAWPOLYLINEPOINTS.length - 1];
that.DRAWMOVEPOLYLINE = new L.Polyline([prevPoint, e.latlng], shapeOptions);
that.measureGroup.addLayer(that.DRAWMOVEPOLYLINE);
if (that.ISMEASURE) {var distance = that.MEASURERESULT + e.latlng.distanceTo(that.DRAWPOLYLINEPOINTS[that.DRAWPOLYLINEPOINTS.length - 1]);
console.log(distance);
}
}
}
function onDoubleClick(e) {that.map.getContainer().style.cursor = '';
/* 显示两点间隔 */
var distance = that.MEASURERESULT + e.latlng.distanceTo(that.DRAWPOLYLINEPOINTS[that.DRAWPOLYLINEPOINTS.length - 1]);
var myIcon = L.divIcon({// html: (distance / 1000).toFixed(2) + "公里",
className: 'my-div-icon',
html:"<div>"+"<p>"+(distance / 1000).toFixed(2)+"KM</p>"+"</div>",
iconSize:26
});
for(let i=0;i<that.DRAWPOLYLINEPOINTS.length-2;i++){let distance_cust = that.DRAWPOLYLINEPOINTS[i].distanceTo(that.DRAWPOLYLINEPOINTS[i+1]);
let myIcon_cust = L.divIcon({// html: (distance / 1000).toFixed(2) + "公里",
className: 'my-div-icon',
html:"<div>"+"<p>"+(distance_cust / 1000).toFixed(2)+"KM</p>"+"</div>",
iconSize:26
});
let site_c = L.polyline([that.DRAWPOLYLINEPOINTS[i],that.DRAWPOLYLINEPOINTS[i+1]],{color:'rgba(0,0,0,0)',}).addTo(that.measureGroup);
let as = site_c.getCenter()
let c = new L.Marker(as, { draggable: false,icon: myIcon_cust});
that.measureGroup.addLayer(c)
}
let marker = new L.Marker(e.latlng, { draggable: false,icon: myIcon});
that.measureGroup.addLayer(marker)
if (that.DRAWING) {if (that.DRAWMOVEPOLYLINE != undefined && that.DRAWMOVEPOLYLINE != null) {that.map.removeLayer(that.DRAWMOVEPOLYLINE);
that.DRAWMOVEPOLYLINE = null;
}
that.BarDRAWLAYERS.push(that.DRAWPOLYLINE);
that.DRAWPOLYLINEPOINTS = [];
that.DRAWING = false;
that.ISMEASURE = false;
that.map.off('mousedown');
that.map.off('mousemove');
that.map.off('dblclick');
}
}
}
clearLayer(){
let that = this
that.measureGroup.clearLayers()}
startDrawPolygon() {
let that = this
that.MEASURERESULT = 0;
that.map.getContainer().style.cursor = 'crosshair';
that.map.on('mousedown', function(e) {
that.DRAWING = true;
that.DRAWPOLYGONPOINTS.push(e.latlng);
that.DRAWPOLYGON.addLatLng(e.latlng);
});
that.map.on('mousemove', function(e) {if (that.DRAWING) {if (that.DRAWMOVEPOLYGON != undefined && that.DRAWMOVEPOLYGON != null) {that.map.removeLayer(that.DRAWMOVEPOLYGON);
}
var prevPoint = that.DRAWPOLYGONPOINTS[that.DRAWPOLYGONPOINTS.length - 1];
var firstPoint = that.DRAWPOLYGONPOINTS[0];
that.DRAWMOVEPOLYGON = new L.Polygon([firstPoint, prevPoint, e.latlng], shapeOptions);
that.measureGroup.addLayer(that.DRAWMOVEPOLYGON);
}
});
that.map.on('dblclick', function(e) {that.map.getContainer().style.cursor = '';
var tempPoints = [];
for (var i = 0; i < that.DRAWPOLYGONPOINTS.length; i++) {tempPoints.push(that.DRAWPOLYGONPOINTS[i]);
}
let as = that.DRAWPOLYGON.getLatLngs()[0]
as.pop()
let last = as[0]
as.push(last)
for(let i=0;i<as.length-1;i++){let distance_cust = as[i].distanceTo(as[i+1]);
let myIcon_cust = L.divIcon({// html: (distance / 1000).toFixed(2) + "公里",
className: 'my-div-icon',
html:"<div>"+"<p>"+(distance_cust / 1000).toFixed(2)+"KM</p>"+"</div>",
iconSize:26
});
let site_c = L.polyline([as[i],as[i+1]],{color:'rgba(0,0,0,0)',}).addTo(that.measureGroup);
let as_ccc = site_c.getCenter()
let c = new L.Marker(as_ccc, { draggable: false,icon: myIcon_cust});
that.measureGroup.addLayer(c)
}
console.log(as);
tempPoints.push(e.latlng);
let CC = that.DRAWPOLYGON.getCenter()
var distance = CalArea(tempPoints);
var myIcon = L.divIcon({html:"<div>"+"<p>"+(distance / 1000000).toFixed(3)+"KM²</p>"+"</div>",
className: 'my-div-icon',
iconSize:26
});
let marker = new L.Marker(CC, { draggable: false,icon:myIcon});
that.measureGroup.addLayer(marker);
// marker.bindPopup("总面积:" + (distance / 1000000).toFixed(3) + '平方公里').openPopup();
if (that.DRAWING) {if (that.DRAWMOVEPOLYGON != undefined && that.DRAWMOVEPOLYGON != null) {that.map.removeLayer(that.DRAWMOVEPOLYGON);
that.DRAWMOVEPOLYGON = null;
}
that.BarDRAWLAYERS.push(that.DRAWPOLYGON);
that.DRAWPOLYGONPOINTS = [];
that.DRAWING = false;
that.ISMEASURE = false;
that.map.off('mousedown');
that.map.off('mousemove');
that.map.off('dblclick');
}
});
var shapeOptions = {
color: '#3388ff',
weight: 3,
opacity: 0.8,
fill: true,
fillColor: null,
fillOpacity: 0.2,
clickable: true
}
that.DRAWPOLYGON = new L.Polygon([], shapeOptions);
that.measureGroup.addLayer(that.DRAWPOLYGON);
if (that.ISMEASURE) {that.MEASUREAREATOOLTIP = new L.Tooltip(that.map);
}
function CalArea(latLngs) {
var pointsCount = latLngs.length,
area = 0.0,
d2r = Math.PI / 180,
p1, p2;
if (pointsCount > 2) {for (var i = 0; i < pointsCount; i++) {p1 = latLngs[i];
p2 = latLngs[(i + 1) % pointsCount];
area += ((p2.lng - p1.lng) * d2r) *
(2 + Math.sin(p1.lat * d2r) + Math.sin(p2.lat * d2r));
}
area = area * 6378137.0 * 6378137.0 / 2.0;
}
return Math.abs(area);
}
}
}
export default DrawPlug