Files
sdk4.0/src/Measure/MeasureHeight/index.js
2025-07-15 10:37:23 +08:00

198 lines
6.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @name: index
* @author: Administrator
* @date: 2022-07-22 17:15
* @descriptionindex
* @update: 2022-07-22 17:15
*/
import Measure from "../index";
class MeasureHeight extends Measure {
/**
* @constructor
* @param sdk
* @description 高度测量
* */
constructor(sdk) {
super(sdk, {text: "左键开始,右键取消"});
}
static create_polygon(that) {
let id = that.randomString()
let a = that.viewer.entities.add(new Cesium.Entity({
id,
billboard: {
image: that.getSourceRootPath() + '/img/point.png',
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
color: Cesium.Color.WHITE.withAlpha(0.99)
},
position: new Cesium.CallbackProperty(() => {
return that.position
}, false),
label: {
text: new Cesium.CallbackProperty(() => {
return that.text
}, false),
scale: 1,
// fillColor: Cesium.Color.RED,
font: 'normal 20px MicroSoft YaHei',
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
pixelOffset: new Cesium.Cartesian2(0, -15),
disableDepthTestDistance: Number.POSITIVE_INFINITY,
},
polyline: {
positions: new Cesium.CallbackProperty(e => {
return that.positions;
}, false),
width: 2,
material: Cesium.Color.YELLOW,
zIndex: 99999999
},
ellipse: {
height: new Cesium.CallbackProperty(() => {
return that.height + that.firstpoint.alt;
}, false),
semiMinorAxis: new Cesium.CallbackProperty(e => {
return that.circleRadius;
}, false),
semiMajorAxis: new Cesium.CallbackProperty(e => {
return that.circleRadius;
}, false),
material: new Cesium.Color.fromCssColorString(that.defaultColor)
},
}))
return id
}
static create_point(that, cartesian, option = {}) {
let id = that.randomString()
let p = that.cartesian3Towgs84(cartesian, that.viewer)
let params = {
id: id,
position: Cesium.Cartesian3.fromDegrees(p.lng, p.lat, p.alt),
billboard: {
image: that.getSourceRootPath() + '/img/point.png',
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
color: Cesium.Color.WHITE.withAlpha(0.99)
}
}
if (option.label) {
params.label = {
text: option.label.text,
scale: 1,
// fillColor: Cesium.Color.fromCssColorString("#06eee5"),
font: 'normal 20px MicroSoft YaHei',
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
pixelOffset: new Cesium.Cartesian2(0, -15),
}
}
that.viewer.entities.add(
new Cesium.Entity(params)
)
return id
}
/**
* 开始测量
*/
start() {
if (!YJ.Measure.GetMeasureStatus()) {
super.start()
this.positions = []
this.position = new Cesium.Cartesian3()
this.height = 0
this.text = ""
this.circleRadius = 0
let count = 0;
this.firstpoint = null
let leftEvent = (movement, cartesian) => {
if (this.firstpoint === null) {
this.positions.push(cartesian)
this.firstpoint = this.cartesian3Towgs84(cartesian, this.viewer)
this.ids.push(MeasureHeight.create_polygon(this))
this.ids.push(MeasureHeight.create_point(this, cartesian))
}
count++
this.tip.setPosition(cartesian, movement.position.x, movement.position.y)
if (count === 2) {
if (this.firstpoint) {
let cur_point = this.cartesian3Towgs84(cartesian, this.viewer)
this.positions[1] = Cesium.Cartesian3.fromDegrees(this.firstpoint.lng, this.firstpoint.lat, cur_point.alt)
this.positions[2] = cartesian
this.position = this.positions[1]
this.circleRadius = this.computeDistance2([this.firstpoint, cur_point])
this.height = Number((cur_point.alt - this.firstpoint.alt).toFixed(2))
this.text = "相对高度:" + this.height + " 米"
this.tip.set_text("左键完成,右键取消;半径:" + this.circleRadius + " 米")
}
this.ids.push(MeasureHeight.create_point(this, cartesian, {label: {text: "半径:" + this.circleRadius + " 米"}}))
this.end()
}
}
this.event.mouse_left(leftEvent)
this.event.mouse_move((movement, cartesian) => {
this.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y)
if (this.firstpoint) {
let cur_point = this.cartesian3Towgs84(cartesian, this.viewer)
this.positions[1] = Cesium.Cartesian3.fromDegrees(this.firstpoint.lng, this.firstpoint.lat, cur_point.alt)
this.positions[2] = cartesian
this.position = this.positions[1]
this.circleRadius = this.computeDistance2([this.firstpoint, cur_point])
this.height = Number((cur_point.alt - this.firstpoint.alt).toFixed(2))
this.text = "相对高度:" + this.height + " 米"
this.tip.set_text("左键完成,右键取消;半径:" + this.circleRadius + " 米")
}
})
this.event.mouse_right((movement, cartesian) => {
this.end()
this.destroy()
})
this.event.gesture_pinck_start((movement, cartesian) => {
let startTime = new Date()
let pos = {
position: {
x: (movement.position1.x + movement.position2.x) / 2,
y: (movement.position1.y + movement.position2.y) / 2
}
}
this.event.gesture_pinck_end(() => {
let endTime = new Date()
if (endTime - startTime >= 500) {
// 长按取消
this.end()
this.destroy()
}
else {
leftEvent(pos, cartesian)
}
})
})
}
}
/**
* 结束测量
*/
end() {
super.end()
}
/**
* 清除测量
*/
destroy() {
super.destroy()
}
}
export default MeasureHeight