// import L from 'leaflet'
// import 'leaflet-clipper/dist/L.Clipper'
// import * as turf from '@turf/turf'
import config from '@/utils/map/sub/config'
import global from '@/utils/map/sub/global'
var toggleFlag = false
export default {
cpMarkLayerGroup: null, // 检查点标记图层组
cpMemoLayerGroup: null, // 检查点备注图层组
cpPathLayerGroup: null, // 检查点路线图层组
init() {
this.cpMarkLayerGroup = new L.featureGroup()
this.cpMemoLayerGroup = new L.featureGroup()
this.cpPathLayerGroup = new L.featureGroup()
},
// 即将开始地图缩放时触发本方法
onZoomStart(e) {
// this.cpMarkLayerGroup.remove()
this.cpMemoLayerGroup.remove()
this.cpPathLayerGroup.remove()
},
// 地图发生缩放时触发本方法
onZoom(e) {
},
// 地图缩放结束时触发本方法
onZoomEnd(e) {
this.drawPath()
// this.cpMarkLayerGroup.addTo(global.map)
this.cpMemoLayerGroup.addTo(global.map)
this.cpPathLayerGroup.addTo(global.map)
this.cpMarkLayerGroup.bringToBack()
this.cpMemoLayerGroup.bringToBack()
this.cpPathLayerGroup.bringToBack()
},
toggle(flag) {
// console.log('toggle:', flag)
if (flag != null) {
toggleFlag = !flag
}
if (toggleFlag) {
this.cpMarkLayerGroup.removeFrom(global.map)
this.cpMemoLayerGroup.removeFrom(global.map)
this.cpPathLayerGroup.removeFrom(global.map)
toggleFlag = false
} else {
this.cpMarkLayerGroup.addTo(global.map)
this.cpMemoLayerGroup.addTo(global.map)
this.cpPathLayerGroup.addTo(global.map)
this.cpMarkLayerGroup.bringToBack()
this.cpMemoLayerGroup.bringToBack()
this.cpPathLayerGroup.bringToBack()
toggleFlag = true
}
},
drawAllCheckPoints() {
if (this.cpMarkLayerGroup != null)
this.cpMarkLayerGroup.clearLayers()
if (this.cpMemoLayerGroup != null)
this.cpMemoLayerGroup.clearLayers()
for (let i = 0; i < global.checkPoints.length; i++) {
this.drawOneCheckPoint(global.checkPoints[i].cp_id)
}
},
drawOneCheckPoint(cpId) {
// var that = this
var checkPoint = global.getCheckPointById(cpId)
if (checkPoint == null) {
console.warn('[drawOneCheckPoint] 关键数据为空', checkPoint)
return
}
// var marker = L.circle([checkPoint.latitude, checkPoint.longitude], config.gStyle.checkPoint.default)
var marker = L.circleMarker([checkPoint.latitude, checkPoint.longitude], config.gStyle.checkPoint.default)
.addTo(this.cpMarkLayerGroup)
// .addTo(global.map)
// .bindPopup("Hello, I'm a Marker!
").openPopup();
// .bindTooltip(`检查点:${checkPoint.serial_num}`, config.gStyle.checkPoint.tooltip)
var myIcon = L.divIcon({
html: '
CP:' + checkPoint.serial_num + '
',
className: 'my-div-icon',
iconSize: [60, 20], //宽高
iconAnchor: [30, 35] //文字标注相对位置
});
var markerMemo = L.marker([checkPoint.latitude, checkPoint.longitude], {
icon: myIcon,
// zIndexOffset: -100
})
.addTo(this.cpMemoLayerGroup)
// this.cpMarkLayerGroup.addTo(global.map)
// this.cpMemoLayerGroup.addTo(global.map)
this.cpMarkLayerGroup.bringToBack()
this.cpMemoLayerGroup.bringToBack()
checkPoint.marker = marker
checkPoint.markerMemo = markerMemo
},
drawPath() {
if (this.cpPathLayerGroup != null) {
this.cpPathLayerGroup.clearLayers()
}
var latlngs = []
for (var i = 0; i < global.checkPoints.length; i++) {
var cp = global.checkPoints[i]
latlngs.push([cp.latitude, cp.longitude])
}
var radius = config.gStyle.checkPoint.default.radius
var Lines = this.getIntersection(latlngs, radius) // 获取(圆与路线的)交叉点坐标
// var polyline = L.polyline(latlngs, config.gStyle.checkPointPath.default)
var polyline = L.polyline(Lines, config.gStyle.checkPointPath.default)
.addTo(this.cpPathLayerGroup)
// this.cpPathLayerGroup.addTo(global.map)
this.cpPathLayerGroup.bringToBack()
},
// 获取(圆与路线的)交叉点坐标
getIntersection(LatLngArry, radius) {
// var LatLngArry = [
// [36.672562, 117.127572],
// [36.67165, 117.129262],
// [36.671409, 117.126752]
// ]
var PointArry = []
// var Circles = []
var radius = 20 // 圆的半径 px
var DistanceArry = []
var Lines = []
for (let i = 0; i < LatLngArry.length; i++) {
// 给定地理坐标,返回相应的像素坐标 (相对于原点像素)
let point = global.map.latLngToLayerPoint(LatLngArry[i])
PointArry.push(point)
// let circle = L.circle(LatLngArry[i], {
// radius: radius
// }).addTo(global.map);
// Circles.push(circle)
if (i > 0) {
// 计算相邻两个点之间的距离
let distance = L.point(PointArry[i]).distanceTo(L.point(PointArry[i-1]))
DistanceArry.push(distance)
// 计算圆半径占比
let per = parseFloat(radius.toFixed(16) / distance.toFixed(16)).toFixed(16)
// console.log('per:', per, i)
// console.log('PointArry:', PointArry[i])
let offsetX = parseFloat((PointArry[i].x.toFixed(16) - PointArry[i-1].x.toFixed(16)) * per).toFixed(16)
let offsetY = parseFloat((PointArry[i].y.toFixed(16) - PointArry[i-1].y.toFixed(16)) * per).toFixed(16)
// console.log('offset:', offsetX, offsetY)
// 给定相对于原点像素的像素坐标, 返回相应的地理坐标(对于当前缩放级别)
let line = [
global.map.layerPointToLatLng([
parseFloat(PointArry[i-1].x) + parseFloat(offsetX),
parseFloat(PointArry[i-1].y) + parseFloat(offsetY)
]),
global.map.layerPointToLatLng([
parseFloat(PointArry[i].x) - parseFloat(offsetX),
parseFloat(PointArry[i].y) - parseFloat(offsetY)
])
]
Lines.push(line)
}
}
// console.log('DistanceArry', DistanceArry)
// console.log('Lines', Lines)
// var polyline = L.polyline(Lines, config.gStyle.checkPointPath.default).addTo(global.map)
return Lines
},
test() {
},
free() {
}
}