183 lines
5.6 KiB
JavaScript
183 lines
5.6 KiB
JavaScript
|
/**
|
|||
|
* @name: index
|
|||
|
* @author: Administrator
|
|||
|
* @date: 2022-07-22 16:13
|
|||
|
* @description:index
|
|||
|
* @update: 2022-07-22 16:13
|
|||
|
*/
|
|||
|
import Measure from "../index";
|
|||
|
import { Proj } from "../../Tools/proj";
|
|||
|
import { getCoordinateSystem } from "../../Global/global";
|
|||
|
|
|||
|
class MeasureLocation extends Measure {
|
|||
|
/**
|
|||
|
* @constructor
|
|||
|
* @param sdk
|
|||
|
* @description 坐标测量
|
|||
|
* */
|
|||
|
constructor(sdk) {
|
|||
|
super(sdk, {text: ""});
|
|||
|
this.defaultColor = "#f11515"
|
|||
|
this.locationID = this.randomString()
|
|||
|
this.position = new Cesium.Cartesian3()
|
|||
|
this.text = ""
|
|||
|
}
|
|||
|
|
|||
|
static createLocation(that) {
|
|||
|
that.viewer.entities.add(new Cesium.Entity({
|
|||
|
id: that.locationID,
|
|||
|
show: false,
|
|||
|
position: new Cesium.CallbackProperty(() => {
|
|||
|
return that.position
|
|||
|
}, false),
|
|||
|
label: {
|
|||
|
text: new Cesium.CallbackProperty(() => {
|
|||
|
return that.text
|
|||
|
}, false),
|
|||
|
//标注文字描述
|
|||
|
font: '22px Microsoft YaHei',
|
|||
|
|
|||
|
fillColor: new Cesium.Color.fromCssColorString(that.defaultColor),
|
|||
|
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
|
|||
|
//标注的遮挡距离设置为100则视角与标注的距离大于100米时会有遮挡
|
|||
|
// distanceDisplayCondition: this.distanceDisplayCondition,
|
|||
|
// scale: this.options.label.scale,
|
|||
|
horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
|
|||
|
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
|
|||
|
disableDepthTestDistance: Number.POSITIVE_INFINITY,
|
|||
|
|
|||
|
pixelOffset: new Cesium.Cartesian2(
|
|||
|
-100,
|
|||
|
-50
|
|||
|
),
|
|||
|
// disableDepthTestDistance: this.disableDepthTestDistance,
|
|||
|
},
|
|||
|
billboard: {
|
|||
|
image: that.getSourceRootPath() + "/img/location.png",
|
|||
|
color: Cesium.Color.fromCssColorString(`rgba(255,255,255,0.99)`),
|
|||
|
disableDepthTestDistance: Number.POSITIVE_INFINITY,
|
|||
|
// scaleByDistance: new Cesium.NearFarScalar(
|
|||
|
// 2000,
|
|||
|
// 1,
|
|||
|
// 1000000,
|
|||
|
// 0
|
|||
|
// ),
|
|||
|
scale: 1,
|
|||
|
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
|
|||
|
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
|
|||
|
width: 48,
|
|||
|
height: 48
|
|||
|
}
|
|||
|
}))
|
|||
|
}
|
|||
|
|
|||
|
static create_point(that) {
|
|||
|
let id = that.randomString()
|
|||
|
that.viewer.entities.add(
|
|||
|
new Cesium.Entity({
|
|||
|
id: id,
|
|||
|
position: new Cesium.CallbackProperty(() => {
|
|||
|
return that.position
|
|||
|
}, false),
|
|||
|
billboard: {
|
|||
|
image: that.getSourceRootPath() + '/img/point.png',
|
|||
|
color: Cesium.Color.fromCssColorString(`rgba(255,255,255,0.99)`),
|
|||
|
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
|
|||
|
disableDepthTestDistance: Number.POSITIVE_INFINITY,
|
|||
|
color: Cesium.Color.WHITE.withAlpha(0.99)
|
|||
|
}
|
|||
|
})
|
|||
|
)
|
|||
|
return id
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 开始测量
|
|||
|
*/
|
|||
|
start() {
|
|||
|
if (!YJ.Measure.GetMeasureStatus()) {
|
|||
|
super.start()
|
|||
|
this.cache_id = MeasureLocation.create_point(this)
|
|||
|
MeasureLocation.createLocation(this)
|
|||
|
|
|||
|
let leftEvent = (movement, cartesian) => {
|
|||
|
this.position = cartesian
|
|||
|
let entity = this.viewer.entities.getById(this.locationID)
|
|||
|
if(entity) {
|
|||
|
entity.show = true
|
|||
|
}
|
|||
|
let p = this.cartesian3Towgs84(cartesian, this.viewer)
|
|||
|
let coordinateSystem = getCoordinateSystem()
|
|||
|
if(coordinateSystem==='EPSG:4326') {
|
|||
|
this.text = `经度:${Number(p.lng.toFixed(8))}\n纬度:${Number(p.lat.toFixed(8))}\n海拔:${Number(p.alt.toFixed(2))}`
|
|||
|
}
|
|||
|
else {
|
|||
|
let result = this.convert([{x: p.lng, y: p.lat, z: p.alt}], 'EPSG:4326', coordinateSystem)
|
|||
|
this.text = `x:${Number(result.points[0].x.toFixed(8))}\ny:${Number(result.points[0].y.toFixed(8))}\nz:${Number(result.points[0].z.toFixed(2))}`
|
|||
|
}
|
|||
|
this.end()
|
|||
|
}
|
|||
|
this.event.mouse_left(leftEvent)
|
|||
|
this.event.mouse_right((movement, cartesian) => {
|
|||
|
this.destroy()
|
|||
|
this.end()
|
|||
|
})
|
|||
|
this.event.mouse_move((movement, cartesian) => {
|
|||
|
this.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y)
|
|||
|
let entity = this.viewer.entities.getById(this.locationID)
|
|||
|
if(entity) {
|
|||
|
entity.show = true
|
|||
|
}
|
|||
|
this.position = cartesian
|
|||
|
let p = this.cartesian3Towgs84(cartesian, this.viewer)
|
|||
|
let coordinateSystem = getCoordinateSystem()
|
|||
|
if(coordinateSystem==='EPSG:4326') {
|
|||
|
this.text = `经度:${Number(p.lng.toFixed(8))}\n纬度:${Number(p.lat.toFixed(8))}\n海拔:${Number(p.alt.toFixed(2))}`
|
|||
|
}
|
|||
|
else {
|
|||
|
let result = this.convert([{x: p.lng, y: p.lat, z: p.alt}], 'EPSG:4326', coordinateSystem)
|
|||
|
this.text = `x:${Number(result.points[0].x.toFixed(8))}\ny:${Number(result.points[0].y.toFixed(8))}\nz:${Number(result.points[0].z.toFixed(2))}`
|
|||
|
}
|
|||
|
})
|
|||
|
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.destroy()
|
|||
|
this.end()
|
|||
|
}
|
|||
|
else {
|
|||
|
leftEvent(pos, cartesian)
|
|||
|
}
|
|||
|
})
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 清除测量
|
|||
|
*/
|
|||
|
destroy() {
|
|||
|
this.remove_entity(this.locationID)
|
|||
|
this.remove_entity(this.cache_id)
|
|||
|
super.destroy()
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 结束测量
|
|||
|
*/
|
|||
|
end() {
|
|||
|
super.end()
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
export default MeasureLocation
|