/*
|
* @Author: shuishen 1109946754@qq.com
|
* @Date: 2022-10-18 17:17:50
|
* @LastEditors: shuishen 1109946754@qq.com
|
* @LastEditTime: 2022-11-18 09:22:49
|
* @FilePath: \srs-police-affairs\src\utils\EntityDraw.js
|
* @Description:
|
*
|
* Copyright (c) 2022 by shuishen 1109946754@qq.com, All Rights Reserved.
|
*/
|
|
// 1m的经度
|
const lngOneM = 0.00001141
|
// 1m的纬度
|
const latOneM = 0.00000899
|
|
export default class EntityDraw {
|
|
drawPolygonLayer = null
|
drawPolylineLayer = null
|
|
drawPolyLineGonLayer = null
|
|
drawPointLayer = null
|
|
activeShapePoints = []
|
|
activeShape = null
|
|
drawCompletePosition = []
|
|
type = ''
|
|
emitPointLayer = null
|
|
eventHandler = null
|
|
EditMoveCenterEntity = null
|
|
Cesium = null
|
|
EditMoveCenterPositoin = null
|
|
isEditing = false
|
|
editVertext = null
|
|
lastEventData = null
|
|
cb = () => { }
|
|
constructor() {
|
// 去除双击
|
this.deactivate()
|
|
// 初始化图层
|
this.initLayer()
|
|
// 修改this指向
|
this.getLeftEvent = this.getLeftEvent.bind(this)
|
this.getMoveEvent = this.getMoveEvent.bind(this)
|
this.getRightEvent = this.getRightEvent.bind(this)
|
|
this.resizePolyLineGon = this.resizePolyLineGon.bind(this)
|
|
this.Cesium = global.DC.Namespace.Cesium
|
|
this.eventHandler = new global.DC.Namespace.Cesium.ScreenSpaceEventHandler(global.viewer.scene.canvas)
|
}
|
|
initLayer () {
|
// 添加面图层
|
this.drawPolygonLayer = new global.DC.VectorLayer('drawPolygonLayer')
|
global.viewer.addLayer(this.drawPolygonLayer)
|
|
// 添加线图层
|
this.drawPolylineLayer = new global.DC.VectorLayer('drawPolylineLayer')
|
global.viewer.addLayer(this.drawPolylineLayer)
|
this.drawPolyLineGonLayer = new global.DC.VectorLayer('drawPolyLineGonLayer')
|
global.viewer.addLayer(this.drawPolyLineGonLayer)
|
|
// 添加点图层
|
this.drawPointLayer = new global.DC.VectorLayer('drawPointLayer')
|
global.viewer.addLayer(this.drawPointLayer)
|
|
// 添加编辑点图层
|
this.emitPointLayer = new global.DC.VectorLayer('emitPointLayer')
|
global.viewer.addLayer(this.emitPointLayer)
|
|
|
// global.viewer.scene.globe.depthTestAgainstTerrain = true
|
}
|
|
// draw执行这个
|
activate (type, cb) {
|
this.cb = cb
|
this.type = type
|
|
this.drawCompletePosition = []
|
|
this.clearLayer()
|
|
if (this.activeShapePoints.length > 0) {
|
this.clickInTheProcess()
|
}
|
|
this.registerEvents()
|
|
|
// this.initLeftDownEventHandler()
|
// this.initLeftUpEventHandler()
|
// this.initMouseMoveEventHandler()
|
}
|
|
deactivate () {
|
global.viewer.on(global.DC.MouseEventType.DB_CLICK, e => {
|
return
|
})
|
}
|
|
// 注册
|
registerEvents () {
|
global.viewer.tooltip.enable = true
|
|
// 这个是左键单击也就是添加点
|
global.viewer.on(global.DC.MouseEventType.CLICK, this.getLeftEvent)
|
|
// 这个是鼠标移动
|
global.viewer.on(global.DC.MouseEventType.MOUSE_MOVE, this.getMoveEvent)
|
|
// 这个是鼠标右键得,就是最后绘制结束 你要控制嘛 我调下
|
global.viewer.on(global.DC.MouseEventType.RIGHT_CLICK, this.getRightEvent)
|
}
|
|
// 解绑
|
unRegisterEvents () {
|
global.viewer.tooltip.enable = false
|
global.viewer.off(global.DC.MouseEventType.CLICK, this.getLeftEvent)
|
global.viewer.off(global.DC.MouseEventType.MOUSE_MOVE, this.getMoveEvent)
|
global.viewer.off(global.DC.MouseEventType.RIGHT_CLICK, this.getRightEvent)
|
}
|
|
// 绘制多边形
|
drawGraph (positionData) {
|
let graph
|
|
if (this.type === "polyline") {
|
graph = global.viewer.entities.add({
|
polyline: {
|
material: new global.DC.Namespace.Cesium.ColorMaterialProperty(
|
global.DC.Namespace.Cesium.Color.NAVAJOWHITE.withAlpha(0.7)
|
),
|
positions: positionData,
|
clampToGround: true,
|
width: 3,
|
},
|
})
|
} else {
|
graph = global.viewer.entities.add({
|
polygon: {
|
hierarchy: positionData,
|
material: new global.DC.Namespace.Cesium.ColorMaterialProperty(
|
global.DC.Namespace.Cesium.Color.NAVAJOWHITE.withAlpha(0.7)
|
),
|
}
|
})
|
}
|
|
return graph
|
}
|
|
// 左键
|
getLeftEvent (event) {
|
this.leftEvent(event)
|
}
|
|
leftEvent (event) {
|
const that = this
|
|
let point = new global.DC.Point(new global.DC.Position(event.wgs84SurfacePosition.lng, event.wgs84SurfacePosition.lat))
|
|
point.setStyle({
|
pixelSize: 10,
|
color: global.DC.Color.RED, //颜色
|
outlineColor: global.DC.Color.WHITE, //边框颜色
|
outlineWidth: 2, //边框大小,
|
})
|
|
that.drawPointLayer.addOverlay(point)
|
|
if (that.activeShapePoints.length === 0) {
|
that.activeShapePoints.push(event.surfacePosition)
|
|
const dynamicPositions = new global.DC.Namespace.Cesium.CallbackProperty(function () {
|
|
if (that.type === "polyline") {
|
return that.activeShapePoints
|
} else {
|
return new global.DC.Namespace.Cesium.PolygonHierarchy(that.activeShapePoints)
|
}
|
|
}, false)
|
|
that.activeShape = that.drawGraph(dynamicPositions)
|
|
}
|
|
that.activeShapePoints.push(event.surfacePosition)
|
}
|
|
// 移动
|
getMoveEvent (event) {
|
this.moveEvent(event)
|
}
|
|
moveEvent (event) {
|
global.viewer.tooltip.showAt(event.windowPosition, '左击选择点位,右击结束')
|
|
if (this.activeShapePoints.length >= 2) {
|
this.activeShapePoints.pop()
|
|
this.activeShapePoints.push(event.surfacePosition)
|
}
|
}
|
|
// 右键
|
getRightEvent (event) {
|
this.rightEvent(event)
|
}
|
|
rightEvent (event) {
|
if (this.type === "polyline") {
|
if (this.activeShapePoints.length < 2) {
|
global.viewer.tooltip.showAt(event.windowPosition, '不能绘制成线,请继续添加点')
|
return
|
}
|
} else {
|
if (this.activeShapePoints.length < 3) {
|
global.viewer.tooltip.showAt(event.windowPosition, '不能绘制成面,请继续添加点')
|
return
|
}
|
}
|
|
this.terminateShape()
|
}
|
|
terminateShape () {
|
this.activeShapePoints.pop()
|
|
this.activeShapePoints.forEach(item => {
|
|
let pointPosition = global.DC.Transform.transformCartesianToWGS84(item)
|
|
this.drawCompletePosition.push({ lng: pointPosition.lng, lat: pointPosition.lat })
|
|
})
|
|
if (this.type === "polyline") {
|
|
let polyline = new global.DC.Polyline(this.drawCompletePosition)
|
|
polyline.setStyle({
|
material: new global.DC.Namespace.Cesium.ColorMaterialProperty(
|
global.DC.Namespace.Cesium.Color.NAVAJOWHITE.withAlpha(0.7)
|
)
|
})
|
|
this.drawPolylineLayer.addOverlay(polyline)
|
|
this.addPolyLineGon(100, this.cb)
|
|
// this.EditMoveCenterPositoin = this.Cesium.Cartesian3.fromDegrees(this.drawCompletePosition[this.drawCompletePosition.length - 1].lng + 200 * lngOneM, this.drawCompletePosition[this.drawCompletePosition.length - 1].lat + 200 * latOneM, 0)
|
|
|
|
// this.createEditMoveCenterEntity()
|
} else {
|
let polygon = new global.DC.Polygon(this.drawCompletePosition)
|
|
polygon.setStyle({
|
material: new global.DC.Namespace.Cesium.ColorMaterialProperty(
|
global.DC.Namespace.Cesium.Color.NAVAJOWHITE.withAlpha(0.7)
|
)
|
})
|
|
|
// console.log(polygon, 999)
|
|
this.drawPolygonLayer.addOverlay(polygon)
|
|
this.lastEventData = {
|
type: 'polygon',
|
data: this.drawCompletePosition
|
}
|
|
this.cb(this.lastEventData)
|
}
|
|
this.clickInTheProcess()
|
}
|
|
clickInTheProcess () {
|
if (this.activeShape != null) {
|
global.viewer.entities.remove(this.activeShape)
|
}
|
|
this.drawPointLayer.clear()
|
|
this.activeShape = null
|
|
this.activeShapePoints = []
|
|
this.unRegisterEvents()
|
}
|
|
// 清除
|
clearLayer () {
|
this.drawPolygonLayer.clear()
|
this.drawPolylineLayer.clear()
|
this.drawPolyLineGonLayer.clear()
|
|
this.removeViewerEvent()
|
|
global.viewer.entities.removeAll()
|
}
|
|
// 销毁
|
destroy () {
|
this.unRegisterEvents()
|
this.removeViewerEvent()
|
|
this.drawPolygonLayer.clear()
|
this.drawPolygonLayer.remove()
|
|
this.drawPolylineLayer.clear()
|
this.drawPolylineLayer.remove()
|
|
this.drawPolyLineGonLayer.clear()
|
this.drawPolyLineGonLayer.remove()
|
|
this.drawPointLayer.clear()
|
this.drawPointLayer.remove()
|
|
global.viewer.entities.removeAll()
|
|
this.activeShape = null
|
this.activeShapePoints = []
|
this.drawCompletePosition = []
|
}
|
|
resizePolyLineGon (num) {
|
this.addPolyLineGon(num)
|
}
|
|
addPolyLineGon (num, cb) {
|
this.drawPolyLineGonLayer.clear()
|
|
let coords = global.DC.GeoTools.polylineBuffer(this.drawCompletePosition, num)
|
|
let polygon = new global.DC.Polygon(coords)
|
|
polygon.setStyle({
|
material: global.DC.Color.RED.withAlpha(0.4)
|
})
|
|
this.drawPolyLineGonLayer.addOverlay(polygon)
|
|
this.lastEventData = {
|
type: 'line',
|
data: coords,
|
lineData: this.drawCompletePosition
|
}
|
|
cb(this.lastEventData)
|
}
|
|
//场景鼠标左键按下事件
|
initLeftDownEventHandler () {
|
const that = this
|
that.eventHandler.setInputAction((e) => {
|
let id = global.viewer.scene.pick(e.position)
|
// 拾取到对象 判断拾取到的对象类型
|
if (!id || !id.id || !id.id.type) return
|
//拾取到具有type 属性的entity对象
|
if (id.id.type == "EditVertex" || id.id.type == "EditMove") {
|
that.isEditing = true
|
//禁用场景的旋转移动功能 保留缩放功能
|
global.viewer.scene.screenSpaceCameraController.enableRotate = false
|
//改变鼠标状态
|
global.viewer.enableCursorStyle = false
|
document.body.style.cursor = "move"
|
that.editVertext = id.id
|
}
|
|
}, that.Cesium.ScreenSpaceEventType.LEFT_DOWN)
|
}
|
|
//场景鼠标左键抬起事件
|
initLeftUpEventHandler () {
|
const that = this
|
that.eventHandler.setInputAction(((e) => {
|
if (!that.isEditing) return
|
that.isEditing = false
|
global.viewer.scene.screenSpaceCameraController.enableRotate = true
|
global.viewer.enableCursorStyle = true
|
document.body.style.cursor = "default"
|
}), that.Cesium.ScreenSpaceEventType.LEFT_UP)
|
}
|
|
getScope (position) {
|
let Scope = Math.abs(position.lng - this.drawCompletePosition[this.drawCompletePosition.length - 1].lng) / lngOneM - 200
|
|
return Scope > 100 ? Scope : 100
|
}
|
|
//场景鼠标移动事件
|
initMouseMoveEventHandler () {
|
const that = this
|
that.eventHandler.setInputAction(((e) => {
|
// 鼠标移动的位置
|
let pickPosition = global.viewer.scene.pickPosition(e.endPosition)
|
if (!pickPosition) return
|
if (!that.isEditing) return
|
|
if (that.editVertext.type == "EditMove") {
|
|
let startPosition = that.EditMoveCenterPositoin
|
|
if (!startPosition) return
|
|
let position = global.DC.Transform.transformCartesianToWGS84(pickPosition)
|
|
that.addPolyLineGon(that.getScope(position))
|
}
|
|
that.isEdited = true
|
|
that.EditMoveCenterPositoin = pickPosition
|
}), that.Cesium.ScreenSpaceEventType.MOUSE_MOVE)
|
}
|
|
removeViewerEvent () {
|
if (this.eventHandler && this.eventHandler != null) {
|
this.eventHandler.removeInputAction(this.Cesium.ScreenSpaceEventType.LEFT_DOWN)
|
this.eventHandler.removeInputAction(this.Cesium.ScreenSpaceEventType.LEFT_UP)
|
this.eventHandler.removeInputAction(this.Cesium.ScreenSpaceEventType.MOUSE_MOVE)
|
}
|
}
|
|
createEditMoveCenterEntity () {
|
const that = this
|
that.EditMoveCenterEntity = global.viewer.entities.add({
|
position: new that.Cesium.CallbackProperty(e => {
|
return that.EditMoveCenterPositoin
|
}, false),
|
|
type: "EditMove",
|
|
point: {
|
color: that.Cesium.Color.RED.withAlpha(0.8),
|
pixelSize: 12,
|
outlineColor: that.Cesium.Color.WHITE.withAlpha(0.6),
|
outlineWidth: 4,
|
disableDepthTestDistance: 2000,
|
heightReference: that.Cesium.HeightReference.CLAMP_TO_GROUND
|
},
|
})
|
}
|
}
|