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