174 lines
5.1 KiB
JavaScript
174 lines
5.1 KiB
JavaScript
|
import Measure from "../index"
|
||
|
|
||
|
/**@extends Measure*/
|
||
|
class MeasureTdArea extends Measure {
|
||
|
/**
|
||
|
* @constructor
|
||
|
* @param sdk
|
||
|
* @description 贴地面积测量
|
||
|
* */
|
||
|
constructor(sdk, options = {}) {
|
||
|
super(sdk, options);
|
||
|
this.options.lineColor = '#ffdf53'
|
||
|
this.polygon_id = ""
|
||
|
}
|
||
|
|
||
|
static create_polygon(that) {
|
||
|
let id = that.randomString()
|
||
|
|
||
|
let scaleByDistance = new Cesium.NearFarScalar(2000, 1, 100000, 0)
|
||
|
|
||
|
let e = that.viewer.entities.add(
|
||
|
new Cesium.Entity({
|
||
|
id: id,
|
||
|
label: {
|
||
|
text: new Cesium.CallbackProperty(() => {
|
||
|
return that.text
|
||
|
}, false),
|
||
|
//标注文字描述
|
||
|
font: '20px Microsoft YaHei',
|
||
|
fillColor: Cesium.Color.fromCssColorString('#ffffff'),
|
||
|
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
|
||
|
//标注的遮挡距离设置为100则视角与标注的距离大于100米时会有遮挡
|
||
|
// distanceDisplayCondition: this.distanceDisplayCondition,
|
||
|
|
||
|
disableDepthTestDistance: Number.POSITIVE_INFINITY,
|
||
|
|
||
|
// scaleByDistance,
|
||
|
scale: 1,
|
||
|
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
|
||
|
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
|
||
|
},
|
||
|
position: new Cesium.CallbackProperty(() => {
|
||
|
return that.center
|
||
|
}, false),
|
||
|
polygon: {
|
||
|
classificationType: Cesium.ClassificationType.BOTH,
|
||
|
hierarchy: new Cesium.CallbackProperty((e) => {
|
||
|
return new Cesium.PolygonHierarchy(that.positions)
|
||
|
}, false),
|
||
|
material: new Cesium.Color.fromCssColorString(that.options.color || that.defaultColor),
|
||
|
zIndex: 99999999
|
||
|
},
|
||
|
polyline: {
|
||
|
positions: new Cesium.CallbackProperty(() => {
|
||
|
if (that.positions.length)
|
||
|
return that.positions.concat(that.positions[0])
|
||
|
return that.positions
|
||
|
}, false),
|
||
|
width: 2,
|
||
|
material: new Cesium.PolylineDashMaterialProperty({
|
||
|
color: new Cesium.Color.fromCssColorString(that.options.lineColor || that.defaultColor),
|
||
|
dashLength: 20, //短划线长度
|
||
|
}),
|
||
|
clampToGround: true,
|
||
|
zIndex: 99999999
|
||
|
}
|
||
|
})
|
||
|
)
|
||
|
return id
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 开始测量
|
||
|
*/
|
||
|
start() {
|
||
|
if (!YJ.Measure.GetMeasureStatus()) {
|
||
|
super.start()
|
||
|
this.ids = []
|
||
|
this.positions = []
|
||
|
this.text = ""
|
||
|
this.center = new Cesium.Cartesian3()
|
||
|
this.cachePositions = []
|
||
|
let height = 0
|
||
|
let text
|
||
|
|
||
|
let leftEvent = (movement, car) => {
|
||
|
if (this.ids.length === 0) {
|
||
|
this.polygon_id = MeasureTdArea.create_polygon(this)
|
||
|
}
|
||
|
this.cachePositions.push({ ...car })
|
||
|
this.ids.push(this.create_point({ ...car }, false))
|
||
|
let po = this.cartesian3Towgs84({ ...car }, this.viewer)
|
||
|
if (po.alt > height) {
|
||
|
height = po.alt
|
||
|
}
|
||
|
|
||
|
this.positions = this.cachePositions.concat({ ...car })
|
||
|
this.tip.setPosition({ ...car }, movement.position.x, movement.position.y)
|
||
|
}
|
||
|
let rightEvent = (movement, car) => {
|
||
|
this.positions = this.cachePositions
|
||
|
if (this.positions.length > 2) {
|
||
|
let arr = []
|
||
|
this.positions.forEach(item => {
|
||
|
let p = this.cartesian3Towgs84(item, this.viewer)
|
||
|
arr.push({ lng: p.lng, lat: p.lat })
|
||
|
})
|
||
|
setTimeout(() => {
|
||
|
let center = this.computeCenter(arr)
|
||
|
let area = this.computeSignedArea(this.viewer, arr)
|
||
|
this.center = new Cesium.Cartesian3.fromDegrees(center.lng, center.lat, height)
|
||
|
this.text = "贴地面积:" + area + " ㎡"
|
||
|
}, 0);
|
||
|
}
|
||
|
else {
|
||
|
let error = '面积计算至少需要三个坐标!'
|
||
|
console.warn(error)
|
||
|
window.ELEMENT && window.ELEMENT.Message({
|
||
|
message: error,
|
||
|
type: 'warning',
|
||
|
duration: 1500
|
||
|
});
|
||
|
this.destroy()
|
||
|
}
|
||
|
this.end()
|
||
|
}
|
||
|
this.event.mouse_left(leftEvent)
|
||
|
this.event.mouse_move((movement, car) => {
|
||
|
this.tip.setPosition({ ...car }, movement.endPosition.x, movement.endPosition.y)
|
||
|
this.positions = this.cachePositions.concat({ ...car })
|
||
|
})
|
||
|
this.event.mouse_right(rightEvent)
|
||
|
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) {
|
||
|
// 长按取消
|
||
|
rightEvent(pos, cartesian)
|
||
|
}
|
||
|
else {
|
||
|
leftEvent(pos, cartesian)
|
||
|
}
|
||
|
})
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 清除测量
|
||
|
*/
|
||
|
destroy() {
|
||
|
[this.polygon_id, ...this.ids].forEach(id => {
|
||
|
this.remove_entity(id)
|
||
|
})
|
||
|
super.destroy()
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 结束测量
|
||
|
*/
|
||
|
end() {
|
||
|
super.end()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default MeasureTdArea
|