feat:引入naiveUI,实现工具条雏形,实现距离测量
							parent
							
								
									2da9f05c19
								
							
						
					
					
						commit
						819d0d32e5
					
				| @ -0,0 +1,242 @@ | |||||||
|  | import * as Cesium from 'cesium' | ||||||
|  | export default class MeasureDistance { | ||||||
|  |     constructor(viewer) { | ||||||
|  |         this.viewer = viewer | ||||||
|  |         this.isMeasure = false | ||||||
|  |         this.initEvents() | ||||||
|  |         this.positions = [] | ||||||
|  |         this.temPositions = []      // 鼠标移动时产生的临时点
 | ||||||
|  |         this.vertexEntities = []    // 节点元素
 | ||||||
|  |         this.lineEntity = undefined // 折线元素
 | ||||||
|  |         this.totalDistance = 0  // 总距离
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     initEvents(){ | ||||||
|  |         this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas) | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     //激活
 | ||||||
|  |     activate() { | ||||||
|  |         this.registerEvents(); //注册鼠标事件
 | ||||||
|  |         this.isMeasure = true; | ||||||
|  |         this.totalDistance = 0  // 总距离
 | ||||||
|  |         //设置鼠标样式
 | ||||||
|  |         this.viewer._element.style.cursor = 'crosshair'; | ||||||
|  |         this.viewer.enableCursorStyle = true; | ||||||
|  |         this.temPositions = []; | ||||||
|  |         this.positions = []; | ||||||
|  |         this.viewer.scene.globe.depthTestAgainstTerrain = true | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //禁用
 | ||||||
|  |     deactivate() { | ||||||
|  |         if (!this.isMeasure) return; | ||||||
|  |         this.unRegisterEvents(); | ||||||
|  |         this.viewer._element.style.cursor = 'default'; | ||||||
|  |         this.viewer.enableCursorStyle = true; | ||||||
|  |         this.isMeasure = false; | ||||||
|  |         this.viewer.scene.globe.depthTestAgainstTerrain = false | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //清空绘制
 | ||||||
|  |     clear() { | ||||||
|  |         //清除线对象
 | ||||||
|  |         this.viewer.entities.remove(this.lineEntity); | ||||||
|  |         this.lineEntity = undefined; | ||||||
|  | 
 | ||||||
|  |         //清除节点
 | ||||||
|  |         this.vertexEntities.forEach(item => { | ||||||
|  |             this.viewer.entities.remove(item); | ||||||
|  |         }); | ||||||
|  |         this.vertexEntities = []; | ||||||
|  |     } | ||||||
|  |     //创建线对象
 | ||||||
|  |     createLineEntity() { | ||||||
|  |         this.lineEntity = this.viewer.entities.add({ | ||||||
|  |             polyline: { | ||||||
|  |                 positions: new Cesium.CallbackProperty(e => { | ||||||
|  |                     return this.temPositions; | ||||||
|  |                 }, false), | ||||||
|  |                 width: 2, | ||||||
|  |                 material: Cesium.Color.YELLOW, | ||||||
|  |                 // depthFailMaterial: Cesium.Color.YELLOW,
 | ||||||
|  |                 clampToGround: true, | ||||||
|  |                 disableDepthTestDistance:99000000, | ||||||
|  |                 heightReference:Cesium.HeightReference.CLAMP_TO_GROUND | ||||||
|  |             } | ||||||
|  |         }) | ||||||
|  |     } | ||||||
|  |     //创建线节点
 | ||||||
|  |     createVertex() { | ||||||
|  |         let vertexEntity = new Cesium.Entity({ | ||||||
|  |             id: "MeasureDistanceVertex" + this.positions[this.positions.length - 1], | ||||||
|  |             position:  this.positions[this.positions.length - 1], | ||||||
|  |             point: { | ||||||
|  |                 color: Cesium.Color.FUCHSIA, | ||||||
|  |                 pixelSize: 6, | ||||||
|  |                 disableDepthTestDistance:99000000, | ||||||
|  |                 heightReference:Cesium.HeightReference.CLAMP_TO_GROUND, | ||||||
|  |             }, | ||||||
|  |             label:{ | ||||||
|  |                 text: this.spaceDistance(this.positions) + "km", | ||||||
|  |                 font: "2rem sans-serif", | ||||||
|  |                 fillColor: Cesium.Color.WHITE, | ||||||
|  |                 style: Cesium.LabelStyle.FILL, | ||||||
|  |                 pixelOffset: new Cesium.Cartesian2(20, -10), | ||||||
|  |                 eyeOffset: new Cesium.Cartesian3(0, 0, 0), | ||||||
|  |                 horizontalOrigin: Cesium.HorizontalOrigin.CENTER, | ||||||
|  |                 verticalOrigin: Cesium.VerticalOrigin.BOTTOM, | ||||||
|  |                 // distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 20000),
 | ||||||
|  |                 scale: 0.5, | ||||||
|  |                 showBackground: true, | ||||||
|  |                 backgroundColor: new Cesium.Color(0.165, 0.165, 0.165, 0.5), | ||||||
|  |                 backgroundPadding: new Cesium.Cartesian2(10, 10), | ||||||
|  |                 disableDepthTestDistance:99000000, | ||||||
|  |                 heightReference:Cesium.HeightReference.CLAMP_TO_GROUND | ||||||
|  |             }, | ||||||
|  |         }); | ||||||
|  |         this.vertexEntities.push(vertexEntity) | ||||||
|  |         this.viewer.entities.add(vertexEntity) | ||||||
|  |     } | ||||||
|  |     //创建起点
 | ||||||
|  |     createStartEntity() { | ||||||
|  |         let vertexEntity = this.viewer.entities.add({ | ||||||
|  |             position: this.positions[0], | ||||||
|  |             type: "MeasureDistanceVertex", | ||||||
|  |             point: { | ||||||
|  |                 show: true, | ||||||
|  |                 pixelSize: 10, | ||||||
|  |                 color: Cesium.Color.RED, | ||||||
|  |                 outlineColor: Cesium.Color.WHITE, | ||||||
|  |                 outlineWidth: 1, | ||||||
|  |                 disableDepthTestDistance:99000000, | ||||||
|  |                 heightReference:Cesium.HeightReference.CLAMP_TO_GROUND, | ||||||
|  |             }, | ||||||
|  |         }); | ||||||
|  |         this.vertexEntities.push(vertexEntity) | ||||||
|  |     } | ||||||
|  |     //创建终点节点
 | ||||||
|  |     createEndEntity() { | ||||||
|  |         let vertexEntity = this.viewer.entities.add({ | ||||||
|  |             position: this.positions[this.positions.length - 1], | ||||||
|  |             type: "MeasureDistanceVertex", | ||||||
|  |             label:{ | ||||||
|  |                 text: "总距离:" + this.totalDistance.toFixed(3) + "km", | ||||||
|  |                 font: "2.5rem sans-serif", | ||||||
|  |                 fillColor: Cesium.Color.WHITE, | ||||||
|  |                 style: Cesium.LabelStyle.FILL, | ||||||
|  |                 pixelOffset: new Cesium.Cartesian2(20, -60), | ||||||
|  |                 eyeOffset: new Cesium.Cartesian3(0, 0, 30), | ||||||
|  |                 horizontalOrigin: Cesium.HorizontalOrigin.CENTER, | ||||||
|  |                 verticalOrigin: Cesium.VerticalOrigin.BOTTOM, | ||||||
|  |                 // distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 20000),
 | ||||||
|  |                 scale: 0.5, | ||||||
|  |                 showBackground: true, | ||||||
|  |                 backgroundColor: new Cesium.Color(0.165, 0.165, 0.165, 0.99), | ||||||
|  |                 backgroundPadding: new Cesium.Cartesian2(10, 10), | ||||||
|  |                 disableDepthTestDistance:99000000, | ||||||
|  |                 heightReference:Cesium.HeightReference.CLAMP_TO_GROUND | ||||||
|  |             }, | ||||||
|  |             // billboard: {
 | ||||||
|  |             //     // image: "../../static/images/end.png",
 | ||||||
|  |             //     scaleByDistance: new Cesium.NearFarScalar(300, 1, 1200, 0.4), //设置随图缩放距离和比例
 | ||||||
|  |             //     distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 20000), //设置可见距离 10000米可见
 | ||||||
|  |             //     verticalOrigin: Cesium.VerticalOrigin.BOTTOM
 | ||||||
|  |             // },
 | ||||||
|  |             point: { | ||||||
|  |                 pixelSize: 10, | ||||||
|  |                 color: Cesium.Color.RED, | ||||||
|  |                 outlineColor: Cesium.Color.WHITE, | ||||||
|  |                 outlineWidth: 1, | ||||||
|  |                 heightReference:Cesium.HeightReference.CLAMP_TO_GROUND, | ||||||
|  |                 disableDepthTestDistance:99000000 | ||||||
|  |             }, | ||||||
|  |         }); | ||||||
|  |         this.vertexEntities.push(vertexEntity) | ||||||
|  |     } | ||||||
|  |     //注册鼠标事件
 | ||||||
|  |     registerEvents() { | ||||||
|  |         this.leftClickEvent(); | ||||||
|  |         this.rightClickEvent(); | ||||||
|  |         this.mouseMoveEvent(); | ||||||
|  |     } | ||||||
|  |     //左键点击事件
 | ||||||
|  |     leftClickEvent() { | ||||||
|  |         //单击鼠标左键画点点击事件
 | ||||||
|  |         this.handler.setInputAction(e => { | ||||||
|  |             let position = this.viewer.scene.pickPosition(e.position); | ||||||
|  |             if (!position) { | ||||||
|  |                 const ellipsoid = this.viewer.scene.globe.ellipsoid; | ||||||
|  |                 position = this.viewer.scene.camera.pickEllipsoid(e.position, ellipsoid); | ||||||
|  |             } | ||||||
|  |             if (!position) return; | ||||||
|  |             this.positions.push(position); | ||||||
|  |             if (this.positions.length === 1) {  //首次点击
 | ||||||
|  |                 this.createLineEntity(); | ||||||
|  |                 this.createStartEntity(); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             this.createVertex(); | ||||||
|  |         }, Cesium.ScreenSpaceEventType.LEFT_CLICK); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //鼠标移动事件
 | ||||||
|  |     mouseMoveEvent() { | ||||||
|  |         this.handler.setInputAction(e => { | ||||||
|  |             if (!this.isMeasure) return; | ||||||
|  |             let position = this.viewer.scene.pickPosition(e.endPosition); | ||||||
|  |             if (!position) { | ||||||
|  |                 position = this.viewer.scene.camera.pickEllipsoid(e.startPosition, this.viewer.scene.globe.ellipsoid); | ||||||
|  |             } | ||||||
|  |             if (!position) return; | ||||||
|  |             this.handleMoveEvent(position); | ||||||
|  |         }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //处理鼠标移动
 | ||||||
|  |     handleMoveEvent(position) { | ||||||
|  |         if (this.positions.length < 1) return; | ||||||
|  |         this.temPositions = this.positions.concat(position); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //右键事件
 | ||||||
|  |     rightClickEvent() { | ||||||
|  |         this.handler.setInputAction(e => { | ||||||
|  |             if (!this.isMeasure || this.positions.length < 1) { | ||||||
|  |                 this.deactivate(); | ||||||
|  |                 this.clear() | ||||||
|  |             } else { | ||||||
|  |                 this.createEndEntity(); | ||||||
|  |                 this.lineEntity.polyline = { | ||||||
|  |                     positions: this.positions, | ||||||
|  |                     width: 2, | ||||||
|  |                     material: Cesium.Color.YELLOW, | ||||||
|  |                     depthFailMaterial: Cesium.Color.YELLOW | ||||||
|  |                 }; | ||||||
|  |                 this.deactivate(); | ||||||
|  |             } | ||||||
|  |         }, Cesium.ScreenSpaceEventType.RIGHT_CLICK); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //解除鼠标事件
 | ||||||
|  |     unRegisterEvents() { | ||||||
|  |         this.handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK); | ||||||
|  |         this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK); | ||||||
|  |         this.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 计算距离 | ||||||
|  |      * @param positions 长度大于1的Cartesian3数组 | ||||||
|  |      */ | ||||||
|  |     spaceDistance(positions) { | ||||||
|  |         let l = positions.length | ||||||
|  |         let point1cartographic = Cesium.Cartographic.fromCartesian(positions[l-1]); | ||||||
|  |         let point2cartographic = Cesium.Cartographic.fromCartesian(positions[l-2]); | ||||||
|  |         /**根据经纬度计算出距离**/ | ||||||
|  |         let geodesic = new Cesium.EllipsoidGeodesic(); | ||||||
|  |         geodesic.setEndPoints(point1cartographic, point2cartographic); | ||||||
|  |         this.totalDistance += geodesic.surfaceDistance/1000 | ||||||
|  |         return (geodesic.surfaceDistance/1000).toFixed(3); | ||||||
|  |     } | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in New Issue