代码迁移

This commit is contained in:
zh
2025-07-03 13:54:01 +08:00
parent b04de8a084
commit 2a4da33e62
985 changed files with 358292 additions and 13 deletions

View File

@ -0,0 +1,209 @@
/**
* @name: index
* @author: Administrator
* @date: 2023-12-29 10:11
* @descriptionindex
* @update: 2023-12-29 10:11
*/
import Measure from "../index";
class MeasureAngle extends Measure {
constructor(sdk) {
super(sdk, { text: "左键开始,右键取消" });
this.cachePositions = []
this.positions = []
this.arcPositions = []
this.line_id = ""
this.label_id = ""
this.arc_id = ""
this.bearing = 0
}
createPolyline() {
let that = this
let id = that.randomString()
that.viewer.entities.add(new Cesium.Entity({
id,
polyline: {
positions: new Cesium.CallbackProperty(() => {
return that.positions
}, false),
clampToGround: true,
width: 5,
material: new Cesium.Color.fromCssColorString(that.options.color || that.defaultColor),
zIndex: 99999999
}
}))
return id
}
end() {
super.end();
}
destroy() {
super.destroy();
let arr = [this.line_id, this.label_id, this.arc_id]
arr.forEach(id => {
if (id)
this.remove_entity(id)
})
}
cancel() {
this.end()
this.destroy()
}
caculateAngle(points = []) {
let p1 = this.cartesian3Towgs84(points[0], this.viewer)
let p2 = this.cartesian3Towgs84(points[1], this.viewer)
let p3 = this.cartesian3Towgs84(points[2], this.viewer)
let point1 = turf.point([p1.lng, p1.lat]);
let point2 = turf.point([p2.lng, p2.lat]);
let point3 = turf.point([p3.lng, p3.lat]);
let options = { units: 'kilometers' };
let distance1 = turf.rhumbDistance(point1, point2, options);
let distance2 = turf.rhumbDistance(point3, point2, options);
let distance = distance1
if (distance1 > distance2) {
distance = distance2
}
let bearing1 = turf.rhumbBearing(point1, point2)
let bearing2 = turf.rhumbBearing(point3, point2)
let bearing = Math.abs(((bearing1 - bearing2) + 360) % 360)
if (bearing > 180) {
this.bearing = 360 - bearing
} else {
this.bearing = bearing
}
this.bearing = this.bearing.toFixed(2)
let b1 = (bearing1 - 180)
let b2 = (bearing2 - 180)
let arc = turf.lineArc(point2, (distance / 3), b2, b1);
if (bearing > 180) {
arc = turf.lineArc(point2, (distance / 3), b1, b2);
}
let arcPos = []
for (let i = 0; i < arc.geometry.coordinates.length; i++) {
arcPos.push(Cesium.Cartesian3.fromDegrees(arc.geometry.coordinates[i][0], arc.geometry.coordinates[i][1]))
}
this.arcPositions = arcPos
// if (bearing1 > 0 && bearing2 > 0) {
// this.bearing = Math.abs(bearing1 - bearing2).toFixed(1)
// } else if (bearing1 < 0 && bearing2 < 0) {
// this.bearing = Math.abs(bearing1 - bearing2).toFixed(1)
// } else if (bearing1 > 0 && bearing2 < 0) {
// this.bearing = Math.abs(360 - Math.abs(bearing2) - bearing1).toFixed(1)
// } else {
// this.bearing = Math.abs(360 - Math.abs(bearing1) - bearing2).toFixed(1)
// }
}
start() {
if (!YJ.Measure.GetMeasureStatus()) {
super.start();
let leftEvent = (movement, car) => {
if (this.ids.length === 0) {
//需要创建一个线
this.line_id = this.createPolyline()
}
this.ids.push(this.create_point(car))
this.tip.setPosition(car, movement.position.x, movement.position.y)
this.cachePositions.push(car)
if (this.cachePositions.length) {
this.positions = this.cachePositions.concat(car)
}
if (this.ids.length === 2) {
this.label_id = Cesium.createGuid()
this.arc_id = Cesium.createGuid()
let p = this.cartesian3Towgs84(car, this.viewer)
this.sampleHeightMostDetailed([p]).then((res) => {
let arc = this.viewer.entities.add({
id: this.arc_id,
polyline: {
positions: new Cesium.CallbackProperty(() => {
return this.arcPositions
}, false),
clampToGround: true,
width: 5,
material: new Cesium.Color.fromCssColorString(this.options.color || this.defaultColor),
zIndex: 99999999
}
})
let label = this.viewer.entities.add({
id: this.label_id,
position: Cesium.Cartesian3.fromDegrees(p.lng, p.lat, (res[0].height || 0) + 0.1),
label: {
text: new Cesium.CallbackProperty(() => {
return "夹角:" + this.bearing + "°"
}, false),
font: '20px Microsoft YaHei',
fillColor: Cesium.Color.fromCssColorString('#f1e605'),
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
//标注的遮挡距离设置为100则视角与标注的距离大于100米时会有遮挡
// distanceDisplayCondition: this.distanceDisplayCondition,
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
}
})
})
}
if (this.ids.length === 3) {
this.caculateAngle([this.positions[0], this.positions[1], this.positions[2]])
//需要停止绘制
this.end()
}
}
this.event.mouse_left(leftEvent)
this.event.mouse_move((movement, car) => {
this.tip.setPosition(car, movement.endPosition.x, movement.endPosition.y)
if (this.cachePositions.length) {
this.positions = this.cachePositions.concat(car)
}
if (this.positions.length > 2) {
//需要开始计算夹角
this.caculateAngle([this.positions[0], this.positions[1], this.positions[2]])
}
})
this.event.mouse_right((movement, car) => {
this.cancel()
})
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.cancel()
}
else {
leftEvent(pos, cartesian)
}
})
})
}
}
}
export default MeasureAngle

View File

@ -0,0 +1,206 @@
import Measure from "../index";
class MeasureAzimuth extends Measure {
/**
* @constructor
* @param sdk
* @description 方位角测量
* */
constructor(sdk) {
super(sdk, { text: "左键开始,右键取消" });
this.cachePositions = []
this.positions = []
this.arcPositions = []
this.line_id = ""
this.label_id = ""
this.arc_id = ""
this.bearing = 0
}
createPolyline() {
let that = this
let id = that.randomString()
that.viewer.entities.add(new Cesium.Entity({
id,
polyline: {
positions: new Cesium.CallbackProperty(() => {
return that.positions
}, false),
clampToGround: true,
width: 5,
material: new Cesium.Color.fromCssColorString(that.options.color || that.defaultColor),
zIndex: 99999999
}
}))
return id
}
end() {
super.end();
}
destroy() {
super.destroy();
let arr = [this.line_id, this.label_id, this.arc_id]
arr.forEach(id => {
if (id)
this.remove_entity(id)
})
}
cancel() {
this.end()
this.destroy()
}
caculateAngle(line1 = [], line2 = []) {
let c = this.cartesian3Towgs84(line2[1], this.viewer)
let p2 = this.cartesian3Towgs84(line2[0], this.viewer)
let center = turf.point([c.lng, c.lat])
let point2 = turf.point([p2.lng, p2.lat])
let bearing = this.rhumbBearing(p2, c)
this.bearing = (180 + bearing).toFixed(2)
let distance = turf.rhumbDistance(center, point2, { units: 'kilometers' });
let arc = turf.lineArc(center, (distance/3), 0, this.bearing);
let arcPos = []
for (let i = 0; i < arc.geometry.coordinates.length; i++) {
arcPos.push(Cesium.Cartesian3.fromDegrees(arc.geometry.coordinates[i][0], arc.geometry.coordinates[i][1]))
}
this.arcPositions = arcPos
}
start() {
if (!YJ.Measure.GetMeasureStatus()) {
super.start();
let leftEvent = async (movement, car) => {
if (this.ids.length === 0) {
//需要创建一个线
this.line_id = this.createPolyline()
}
this.tip.setPosition(car, movement.position.x, movement.position.y)
if (this.cachePositions.length) {
this.positions = this.cachePositions.concat(car)
let p = this.cartesian3Towgs84(car, this.viewer)
let pc = this.cartesian3Towgs84(this.positions[1], this.viewer)
let from = turf.point([pc.lng, pc.lat]);
let to = turf.point([p.lng, p.lat]);
let options = { units: 'kilometers' };
let distance = turf.rhumbDistance(from, to, options);
let bearing = 0;
let destination = turf.destination(from, distance, bearing, options);
this.positions[0] = Cesium.Cartesian3.fromDegrees(...destination.geometry.coordinates)
}
this.cachePositions.push(car)
this.cachePositions.push(car)
if (this.positions.length > 2) {
//需要开始计算夹角
this.caculateAngle(
[this.positions[0], this.positions[1]],
[this.positions[2], this.positions[1]])
}
if (this.ids.length >= 2) {
//需要停止绘制
this.end()
return
}
this.ids.push(this.create_point(car))
this.ids.push(this.create_point(car))
if (this.ids.length === 2) {
this.label_id = Cesium.createGuid()
this.arc_id = Cesium.createGuid()
let p = this.cartesian3Towgs84(car, this.viewer)
let res = await this.sampleHeightMostDetailed([p])
let arc = this.viewer.entities.add({
id: this.arc_id,
polyline: {
positions: new Cesium.CallbackProperty(() => {
return this.arcPositions
}, false),
clampToGround: true,
width: 5,
material: new Cesium.Color.fromCssColorString(this.options.color || this.defaultColor),
zIndex: 99999999
}
})
let label = this.viewer.entities.add({
id: this.label_id,
position: Cesium.Cartesian3.fromDegrees(p.lng, p.lat, (res[0].height || 0) + 0.1),
label: {
text: new Cesium.CallbackProperty(() => {
return "方位夹角:" + this.bearing + "°"
}, false),
font: '20px Microsoft YaHei',
fillColor: Cesium.Color.fromCssColorString('#f1e605'),
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
//标注的遮挡距离设置为100则视角与标注的距离大于100米时会有遮挡
// distanceDisplayCondition: this.distanceDisplayCondition,
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
}
})
//需要创建夹角的显示效果
}
}
this.event.mouse_left(leftEvent)
this.event.mouse_move((movement, car) => {
this.tip.setPosition(car, movement.endPosition.x, movement.endPosition.y)
if (this.cachePositions.length) {
this.positions = this.cachePositions.concat(car)
let p = this.cartesian3Towgs84(car, this.viewer)
let pc = this.cartesian3Towgs84(this.positions[1], this.viewer)
let from = turf.point([pc.lng, pc.lat]);
let to = turf.point([p.lng, p.lat]);
let options = { units: 'kilometers' };
let distance = turf.rhumbDistance(from, to, options);
let bearing = 0;
let destination = turf.destination(from, distance, bearing, options);
this.positions[0] = Cesium.Cartesian3.fromDegrees(...destination.geometry.coordinates)
}
if (this.positions.length > 2) {
//需要开始计算夹角
this.caculateAngle(
[this.positions[0], this.positions[1]],
[this.positions[2], this.positions[1]])
}
})
this.event.mouse_right((movement, car) => {
this.cancel()
})
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.cancel()
}
else {
leftEvent(pos, cartesian)
}
})
})
}
}
}
export default MeasureAzimuth

View File

@ -0,0 +1,18 @@
import Measure from '../index'
/**@extends Measure*/
class MeasureCircle extends Measure {
constructor(sdk, options = {}) {
super(sdk, options)
}
start() {
super.start();
}
end() {
super.end();
}
}
export default MeasureCircle

View File

@ -0,0 +1,326 @@
/**
* @name: index
* @author: Administrator
* @date: 2022-07-11 10:31
* @descriptionindex
* @update: 2022-07-11 10:31
*/
import Measure from "../index"
class MeasureDistance extends Measure {
/**
* @constructor
* @param sdk
* @description 距离测量
* */
constructor(sdk, options = {}) {
super(sdk, options)
this.options.color = this.options.color || "#00ffff"
this.start_id = ""
this.end_id = ""
this.polyline_id = ""
this.clampPositions = []
}
async clampToGroundMeasure(meters, cb) {
let positions = []
this.ids.forEach((id, index) => {
let p = this.viewer.entities.getById(id).position.getValue()
positions.push(this.cartesian3Towgs84(p, this.viewer))
})
let res = this.chunkLine(positions, meters)
let coordinates = []
res.forEach((Feature, index) => {
if (index === 0) {
coordinates = [...Feature.geometry.coordinates]
} else {
coordinates.push(Feature.geometry.coordinates[1])
}
})
let total = coordinates.length
for (const item of coordinates) {
const index = coordinates.indexOf(item);
let r = await this.getHeight({lng: item[0], lat: item[1], alt: 0}, index, total,)
cb(null, r)
}
}
async computeDisByTowPoint(p1, p2) {
let d = this.computeDistance([p1, p2])
let meters = 10
let createLabel = (distance) => {
if(this._isDestroy) {
return
}
let label = this.getLabel("贴地距离:" + Number(distance).toFixed(2) + "米")
label.pixelOffset = new Cesium.Cartesian2(
0, -(32)
)
this.ids.push(MeasureDistance.create_point(Cesium.Cartesian3.fromDegrees(p2.lng, p2.lat, p2.alt), {label: label}, this))
}
let start = async (meters) => {
let res = this.chunkLine([p1, p2], meters)
let coordinates = []
res.forEach((Feature, index) => {
if (index === 0) {
coordinates = [...Feature.geometry.coordinates]
} else {
coordinates.push(Feature.geometry.coordinates[1])
}
})
let arr = []
for (const item of coordinates) {
const index = coordinates.indexOf(item);
let r = await this.sampleHeight({lng: item[0], lat: item[1], alt: 0}, index)
arr.push(r)
}
let total_length = 0
let l = arr.length - 1
arr.forEach((item, index) => {
if (index !== l) {
let d1 = this.computeDistance([item.position, arr[index + 1].position])
let d2 = Math.abs(item.position.alt - arr[index + 1].position.alt)
let d3 = Math.sqrt(d1 * d1 + d2 * d2)
total_length += d3
}
})
createLabel(total_length)
}
//暂时固定取20个点
if (d > 20) {//大于20m时固定取20个点
meters = d / 20
await start(meters)
} else if (d < 1) {
//不计算
createLabel(d)
} else {//小于20m的时候
meters = 1
await start(meters)
}
}
async sampleHeight(p1, index) {
let p2 = await this.sampleHeightMostDetailed([p1])
p1.alt = p2[0].height
return {position: p1, index}
}
async getHeight(p1, index, total) {
let p2 = await this.sampleHeightMostDetailed([p1])
p1.alt = p2[0].height
this.clampPositions.push({position: p1, index})
if (total === this.clampPositions.length) {
let total_length = this.startCompute()
return {total, current: this.clampPositions.length, total_length}
}
return {total, current: this.clampPositions.length,}
}
startCompute() {
this.clampPositions.sort(function (a, b) {
return a.index < b.index
})
let total_length = 0
let l = this.clampPositions.length - 1
this.clampPositions.forEach((item, index) => {
if (index !== l) {
let d1 = this.computeDistance([item.position, this.clampPositions[index + 1].position])
let d2 = Math.abs(item.position.alt - this.clampPositions[index + 1].position.alt)
let d3 = Math.sqrt(d1 * d1 + d2 * d2)
total_length += d3
}
})
return Number(total_length.toFixed(2))
}
static createPolyline(that) {
let id = that.randomString()
that.viewer.entities.add(new Cesium.Entity({
id,
polyline: {
positions: new Cesium.CallbackProperty(() => {
return that.positions
}, false),
clampToGround: true,
width: 3,
material: new Cesium.PolylineDashMaterialProperty({
color: new Cesium.Color.fromCssColorString(that.options.color || that.defaultColor),
dashLength: 20, //短划线长度
}),
zIndex: 99999999
}
}))
return id
}
static create_point(cartesian, {
label, image = "point.png",
width,
height
}, that) {
let id = that.randomString()
let p = that.cartesian3Towgs84(cartesian, that.viewer)
if (label) {
label.pixelOffset = new Cesium.Cartesian2(
0, -(height || 32)
)
}
that.viewer.entities.add(
new Cesium.Entity({
id: id,
label,
position: Cesium.Cartesian3.fromDegrees(p.lng, p.lat, p.alt),
billboard: {
image: that.getSourceRootPath() + '/img/' + image,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
width,
height
}
})
)
return id
}
getLabel(text) {
return {
text: text || '',
//标注文字描述
font: '20px Microsoft YaHei',
fillColor: Cesium.Color.fromCssColorString('#f1e605'),
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
//标注的遮挡距离设置为100则视角与标注的距离大于100米时会有遮挡
// distanceDisplayCondition: this.distanceDisplayCondition,
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
// disableDepthTestDistance: this.disableDepthTestDistance,
}
}
/**
* 开始测量
*/
start() {
if (!YJ.Measure.GetMeasureStatus()) {
super.start()
this.positions = []
this.cachePositions = []
let leftEvent = async (movement, car) => {
if (this.ids.length === 0) {
this.polyline_id = (MeasureDistance.createPolyline(this))
this.start_id = MeasureDistance.create_point(car, {
image: "start1.png", width: 30, height: 38, label: this.getLabel("")
}, this)
//创建起点
}
this.tip.setPosition(car, movement.position.x, movement.position.y)
this.positions = this.cachePositions.concat(car)
if (this.ids.length !== 0) {
let cur_point = this.cartesian3Towgs84(car, this.viewer)
let pre_p = this.cartesian3Towgs84(this.cachePositions[this.cachePositions.length - 1], this.viewer)
this.cachePositions.push(car)
await this.computeDisByTowPoint(pre_p, cur_point)
} else {
this.cachePositions.push(car)
this.ids.push(MeasureDistance.create_point(car, {}, this))
let startPoint = this.viewer.entities.getById(this.ids[0])
if(startPoint) {
startPoint.billboard.show = false
}
}
}
let rightEvent = (movement, car) => {
if (this.cachePositions.length) {
this.positions = this.cachePositions
this.end_id = MeasureDistance.create_point(this.cachePositions[this.cachePositions.length - 1], {
image: "end1.png",
width: 30,
height: 38,
}, this)
let endPoint = this.viewer.entities.getById(this.ids[this.ids.length-1])
if(endPoint) {
endPoint.billboard.show = false
}
}
if (this.cachePositions.length < 2) {
this.destroy()
YJ.Measure.Measures.pop()//弹出测量实体
}
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)
// if (this.cachePositions.length) {
// let cur_point = this.cartesian3Towgs84(car, this.viewer)
// let pre_p = this.cartesian3Towgs84(this.cachePositions[this.cachePositions.length - 1], this.viewer)
// let cur_len = this.computeDistance([cur_point, pre_p])
// let text = "当前投影距离:" + cur_len + " 米"
// // this.tip.set_text(text)
// }
})
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.polyline_id, this.end_id, this.start_id, ...this.ids].forEach(id => {
this.remove_entity(id)
})
super.destroy()
}
/**
* 结束测量
*/
end() {
// YJ.Measure.SetMeasureStatus(false)
// this.tip.destroy()
// this.event.destroy()
super.end()
// this.setPickStatus(this.pickStatus.pick)
}
}
export default MeasureDistance

View File

@ -0,0 +1,327 @@
/**
* @name: index
* @author: Administrator
* @date: 2022-07-11 10:31
* @descriptionindex
* @update: 2022-07-11 10:31
*/
import Measure from "../index"
class MeasureDistance extends Measure {
/**
* @constructor
* @param sdk
* @description 距离测量
* */
constructor(sdk, options = {}) {
super(sdk, options)
this.start_id = ""
this.end_id = ""
this.polyline_id = ""
this.clampPositions = []
}
async clampToGroundMeasure(meters, cb) {
let positions = []
this.ids.forEach((id, index) => {
let p = this.viewer.entities.getById(id).position.getValue()
positions.push(this.cartesian3Towgs84(p, this.viewer))
})
let res = this.chunkLine(positions, meters)
let coordinates = []
res.forEach((Feature, index) => {
if (index === 0) {
coordinates = [...Feature.geometry.coordinates]
} else {
coordinates.push(Feature.geometry.coordinates[1])
}
})
let total = coordinates.length
for (const item of coordinates) {
const index = coordinates.indexOf(item);
let r = await this.getHeight({lng: item[0], lat: item[1], alt: 0}, index, total,)
cb(null, r)
}
}
async computeDisByTowPoint(p1, p2) {
let d = this.computeDistance([p1, p2])
let meters = 10
let createLabel = (distance) => {
let label = this.getLabel("贴地距离:" + distance.toFixed(2) + "米")
label.pixelOffset = new Cesium.Cartesian2(
0, -(84)
)
let id = this.randomString()
this.viewer.entities.add(
new Cesium.Entity({
id: id,
label,
position: Cesium.Cartesian3.fromDegrees(p2.lng, p2.lat, p2.alt),
})
)
this.ids.push(id)
}
let start = async (meters) => {
let res = this.chunkLine([p1, p2], meters)
let coordinates = []
res.forEach((Feature, index) => {
if (index === 0) {
coordinates = [...Feature.geometry.coordinates]
} else {
coordinates.push(Feature.geometry.coordinates[1])
}
})
let arr = []
for (const item of coordinates) {
const index = coordinates.indexOf(item);
let r = await this.sampleHeight({lng: item[0], lat: item[1], alt: 0}, index)
arr.push(r)
}
let total_length = 0
let l = arr.length - 1
arr.forEach((item, index) => {
if (index !== l) {
let d1 = this.computeDistance([item.position, arr[index + 1].position])
let d2 = Math.abs(item.position.alt - arr[index + 1].position.alt)
let d3 = Math.sqrt(d1 * d1 + d2 * d2)
total_length += d3
}
})
createLabel(total_length)
}
//暂时固定取20个点
if (d > 20) {//大于20m时固定取20个点
meters = d / 20
await start(meters)
} else if (d < 1) {
//不计算
createLabel(d)
} else {//小于20m的时候
meters = 1
await start(meters)
}
}
async sampleHeight(p1, index) {
let p2 = await this.sampleHeightMostDetailed([p1])
p1.alt = p2[0].height
return {position: p1, index}
}
async getHeight(p1, index, total) {
let p2 = await this.sampleHeightMostDetailed([p1])
p1.alt = p2[0].height
this.clampPositions.push({position: p1, index})
if (total === this.clampPositions.length) {
let total_length = this.startCompute()
return {total, current: this.clampPositions.length, total_length}
}
return {total, current: this.clampPositions.length,}
}
startCompute() {
this.clampPositions.sort(function (a, b) {
return a.index < b.index
})
let total_length = 0
let l = this.clampPositions.length - 1
this.clampPositions.forEach((item, index) => {
if (index !== l) {
let d1 = this.computeDistance([item.position, this.clampPositions[index + 1].position])
let d2 = Math.abs(item.position.alt - this.clampPositions[index + 1].position.alt)
let d3 = Math.sqrt(d1 * d1 + d2 * d2)
total_length += d3
}
})
return Number(total_length.toFixed(2))
}
static createPolyline(that) {
let id = that.randomString()
that.viewer.entities.add(new Cesium.Entity({
id,
polyline: {
positions: new Cesium.CallbackProperty(() => {
return that.positions
}, false),
clampToGround: true,
width: 5,
material: new Cesium.Color.fromCssColorString(that.options.color || that.defaultColor),
zIndex: 99999999
}
}))
return id
}
static create_point(cartesian, {
label, image = "point.png",
width,
height
}, that) {
let id = that.randomString()
let p = that.cartesian3Towgs84(cartesian, that.viewer)
if (label) {
label.pixelOffset = new Cesium.Cartesian2(
0, -(height || 32)
)
}
that.viewer.entities.add(
new Cesium.Entity({
id: id,
label,
position: Cesium.Cartesian3.fromDegrees(p.lng, p.lat, p.alt),
billboard: {
image: that.getSourceRootPath() + '/img/' + image,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
width,
height
}
})
)
return id
}
getLabel(text) {
return {
text: text || '',
//标注文字描述
font: '20px Microsoft YaHei',
fillColor: Cesium.Color.fromCssColorString('#f1e605'),
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
//标注的遮挡距离设置为100则视角与标注的距离大于100米时会有遮挡
// distanceDisplayCondition: this.distanceDisplayCondition,
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
// disableDepthTestDistance: this.disableDepthTestDistance,
}
}
/**
* 开始测量
*/
start() {
if (!YJ.Measure.GetMeasureStatus()) {
super.start()
this.positions = []
this.cachePositions = []
this.event.mouse_left(async (movement, car) => {
if (this.ids.length === 0) {
this.polyline_id = (MeasureDistance.createPolyline(this))
this.start_id = MeasureDistance.create_point(car, {
image: "start.png", width: 32, height: 32, label: this.getLabel("")
}, this)
//创建起点
}
if (this.ids.length !== 0) {
let cur_point = this.cartesian3Towgs84(car, this.viewer)
let pre_p = this.cartesian3Towgs84(this.cachePositions[this.cachePositions.length - 1], this.viewer)
let cur_len = this.computeDistance([cur_point, pre_p])
let text = "投影距离:" + cur_len + " 米"
this.ids.push(MeasureDistance.create_point(car, {label: this.getLabel(text)}, this))
this.cachePositions.push(car)
//计算坡度
this.computeAngle(pre_p, cur_point)
await this.computeDisByTowPoint(pre_p, cur_point)
} else {
this.cachePositions.push(car)
this.ids.push(MeasureDistance.create_point(car, {}, this))
}
})
this.event.mouse_move((movement, car) => {
this.tip.setPosition(car, movement.endPosition.x, movement.endPosition.y)
this.positions = this.cachePositions.concat(car)
if (this.cachePositions.length) {
let cur_point = this.cartesian3Towgs84(car, this.viewer)
let pre_p = this.cartesian3Towgs84(this.cachePositions[this.cachePositions.length - 1], this.viewer)
let cur_len = this.computeDistance([cur_point, pre_p])
let text = "当前投影距离:" + cur_len + " 米"
this.tip.set_text(text)
}
})
this.event.mouse_right((movement, car) => {
if (this.cachePositions.length) {
this.positions = this.cachePositions
this.end_id = MeasureDistance.create_point(this.cachePositions[this.cachePositions.length - 1], {
image: "end.png",
width: 32,
height: 32,
}, this)
}
if (this.cachePositions.length === 0) {
this.destroy()
YJ.Measure.Measures.pop()//弹出测量实体
}
this.end()
})
this.event.mouse_right_keyboard_ctrl((movement, car) => {
if (this.cachePositions.length) {
this.cachePositions.pop()
this.remove_entity(this.ids.pop())
}
})
}
}
computeAngle(start, end) {
let d1 = this.computeDistance([start, end])
let d2 = Math.abs(start.alt - end.alt)
let d3 = Math.sqrt(d1 * d1 + d2 * d2)
let cosAlpha = d1 / d3
let acos = Math.acos(cosAlpha)
let angle = this.radiansToDegrees(acos)
let label = this.getLabel("坡度:" + angle.toFixed(1) + "°")
label.pixelOffset = new Cesium.Cartesian2(
0, -(58)
)
let id = this.randomString()
this.viewer.entities.add(
new Cesium.Entity({
id: id,
label,
position: Cesium.Cartesian3.fromDegrees(end.lng, end.lat, end.alt),
})
)
this.ids.push(id)
}
/**
* 清除测量
*/
destroy() {
[this.polyline_id, this.end_id, this.start_id, ...this.ids].forEach(id => {
this.remove_entity(id)
})
}
/**
* 结束测量
*/
end() {
// YJ.Measure.SetMeasureStatus(false)
// this.tip.destroy()
// this.event.destroy()
super.end()
// this.setPickStatus(this.pickStatus.pick)
}
}
export default MeasureDistance

View File

@ -0,0 +1,197 @@
/**
* @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.computeDistance([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.computeDistance([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

View File

@ -0,0 +1,182 @@
/**
* @name: index
* @author: Administrator
* @date: 2022-07-22 16:13
* @descriptionindex
* @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

View File

@ -0,0 +1,276 @@
/**
* @name: index
* @author: Administrator
* @date: 2022-07-11 10:31
* @descriptionindex
* @update: 2022-07-11 10:31
*/
import Measure from "../index"
class MeasureProjectionDistance extends Measure {
/**
* @constructor
* @param sdk
* @description 投影距离测量
* */
constructor(sdk, options = {}) {
super(sdk, options)
this.options.color = this.options.color || "#00ffff"
this.start_id = ""
this.end_id = ""
this.polyline_id = ""
this.clampPositions = []
}
async clampToGroundMeasure(meters, cb) {
let positions = []
this.ids.forEach((id, index) => {
let p = this.viewer.entities.getById(id).position.getValue()
positions.push(this.cartesian3Towgs84(p, this.viewer))
})
let res = this.chunkLine(positions, meters)
let coordinates = []
res.forEach((Feature, index) => {
if (index === 0) {
coordinates = [...Feature.geometry.coordinates]
} else {
coordinates.push(Feature.geometry.coordinates[1])
}
})
let total = coordinates.length
for (const item of coordinates) {
const index = coordinates.indexOf(item);
let r = await this.getHeight({lng: item[0], lat: item[1], alt: 0}, index, total,)
cb(null, r)
}
}
async sampleHeight(p1, index) {
let p2 = await this.sampleHeightMostDetailed([p1])
p1.alt = p2[0].height
return {position: p1, index}
}
async getHeight(p1, index, total) {
let p2 = await this.sampleHeightMostDetailed([p1])
p1.alt = p2[0].height
this.clampPositions.push({position: p1, index})
if (total === this.clampPositions.length) {
let total_length = this.startCompute()
return {total, current: this.clampPositions.length, total_length}
}
return {total, current: this.clampPositions.length,}
}
startCompute() {
this.clampPositions.sort(function (a, b) {
return a.index < b.index
})
let total_length = 0
let l = this.clampPositions.length - 1
this.clampPositions.forEach((item, index) => {
if (index !== l) {
let d1 = this.computeDistance([item.position, this.clampPositions[index + 1].position])
let d2 = Math.abs(item.position.alt - this.clampPositions[index + 1].position.alt)
let d3 = Math.sqrt(d1 * d1 + d2 * d2)
total_length += d3
}
})
return Number(total_length.toFixed(2))
}
static createPolyline(that) {
let id = that.randomString()
that.viewer.entities.add(new Cesium.Entity({
id,
polyline: {
positions: new Cesium.CallbackProperty(() => {
return that.positions
}, false),
clampToGround: true,
width: 3,
material: new Cesium.PolylineDashMaterialProperty({
color: new Cesium.Color.fromCssColorString(that.options.color || that.defaultColor),
dashLength: 20, //短划线长度
}),
},
zIndex: 99999999
}))
return id
}
static create_point(cartesian, {
label, image = "point.png",
width,
height
}, that) {
let id = that.randomString()
let p = that.cartesian3Towgs84(cartesian, that.viewer)
if (label) {
label.pixelOffset = new Cesium.Cartesian2(
0, -(height || 32)
)
}
that.viewer.entities.add(
new Cesium.Entity({
id: id,
label,
position: Cesium.Cartesian3.fromDegrees(p.lng, p.lat, p.alt),
billboard: {
image: that.getSourceRootPath() + '/img/' + image,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
width,
height
}
})
)
return id
}
getLabel(text) {
return {
text: text || '',
//标注文字描述
font: '20px Microsoft YaHei',
fillColor: Cesium.Color.fromCssColorString('#f1e605'),
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
//标注的遮挡距离设置为100则视角与标注的距离大于100米时会有遮挡
// distanceDisplayCondition: this.distanceDisplayCondition,
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
// disableDepthTestDistance: this.disableDepthTestDistance,
}
}
/**
* 开始测量
*/
start() {
if (!YJ.Measure.GetMeasureStatus()) {
super.start()
this.positions = []
this.cachePositions = []
let leftEvent = async (movement, car) => {
if (this.ids.length === 0) {
this.polyline_id = (MeasureProjectionDistance.createPolyline(this))
this.start_id = MeasureProjectionDistance.create_point(car, {
image: "start1.png", width: 30, height: 38, label: this.getLabel("")
}, this)
//创建起点
}
this.positions = this.cachePositions.concat(car)
this.tip.setPosition(car, movement.position.x, movement.position.y)
if (this.ids.length !== 0) {
let cur_point = this.cartesian3Towgs84(car, this.viewer)
let pre_p = this.cartesian3Towgs84(this.cachePositions[this.cachePositions.length - 1], this.viewer)
let cur_len = this.computeDistance([cur_point, pre_p])
let text = "投影距离:" + cur_len + " 米"
this.ids.push(MeasureProjectionDistance.create_point(car, {label: this.getLabel(text)}, this))
this.cachePositions.push(car)
} else {
this.cachePositions.push(car)
this.ids.push(MeasureProjectionDistance.create_point(car, {show: false}, this))
let startPoint = this.viewer.entities.getById(this.ids[0])
if(startPoint) {
startPoint.billboard.show = false
}
}
}
let rightEvent = (movement, car) => {
if (this.cachePositions.length) {
this.positions = this.cachePositions
this.end_id = MeasureProjectionDistance.create_point(this.cachePositions[this.cachePositions.length - 1], {
image: "end1.png",
width: 30,
height: 38,
}, this)
let endPoint = this.viewer.entities.getById(this.ids[this.ids.length-1])
if(endPoint) {
endPoint.billboard.show = false
}
}
if (this.cachePositions.length < 2) {
this.destroy()
YJ.Measure.Measures.pop()//弹出测量实体
}
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)
if (this.cachePositions.length) {
let cur_point = this.cartesian3Towgs84(car, this.viewer)
let pre_p = this.cartesian3Towgs84(this.cachePositions[this.cachePositions.length - 1], this.viewer)
let cur_len = this.computeDistance([cur_point, pre_p])
let text = "当前投影距离:" + cur_len + " 米"
this.tip.set_text(text)
}
})
this.event.mouse_right(rightEvent)
this.event.mouse_right_keyboard_ctrl((movement, car) => {
if (this.cachePositions.length) {
this.cachePositions.pop()
this.remove_entity(this.ids.pop())
}
})
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.polyline_id, this.end_id, this.start_id, ...this.ids].forEach(id => {
this.remove_entity(id)
})
super.destroy()
}
/**
* 结束测量
*/
end() {
// YJ.Measure.SetMeasureStatus(false)
// this.tip.destroy()
// this.event.destroy()
super.end()
// this.setPickStatus(this.pickStatus.pick)
}
}
export default MeasureProjectionDistance

View File

@ -0,0 +1,316 @@
/**
* @name: index
* @author: Administrator
* @date: 2022-07-11 10:31
* @descriptionindex
* @update: 2022-07-11 10:31
*/
import Measure from "../index"
import MouseEvent from "../../Event";
class MeasureSlopeDistance extends Measure {
/**
* @constructor
* @param sdk
* @description 坡度测量
* */
constructor(sdk, options = {}) {
super(sdk, options)
this.options.color = this.options.color || "#00ffff"
this.start_id = ""
this.end_id = ""
this.polyline_id = ""
this.clampPositions = []
this.event = new MouseEvent(sdk)
}
async clampToGroundMeasure(meters, cb) {
let positions = []
this.ids.forEach((id, index) => {
let p = this.viewer.entities.getById(id).position.getValue()
positions.push(this.cartesian3Towgs84(p, this.viewer))
})
let res = this.chunkLine(positions, meters)
let coordinates = []
res.forEach((Feature, index) => {
if (index === 0) {
coordinates = [...Feature.geometry.coordinates]
} else {
coordinates.push(Feature.geometry.coordinates[1])
}
})
let total = coordinates.length
for (const item of coordinates) {
const index = coordinates.indexOf(item);
let r = await this.getHeight({ lng: item[0], lat: item[1], alt: 0 }, index, total,)
cb(null, r)
}
}
async sampleHeight(p1, index) {
let p2 = await this.sampleHeightMostDetailed([p1])
p1.alt = p2[0].height
return { position: p1, index }
}
async getHeight(p1, index, total) {
let p2 = await this.sampleHeightMostDetailed([p1])
p1.alt = p2[0].height
this.clampPositions.push({ position: p1, index })
if (total === this.clampPositions.length) {
let total_length = this.startCompute()
return { total, current: this.clampPositions.length, total_length }
}
return { total, current: this.clampPositions.length, }
}
startCompute() {
this.clampPositions.sort(function (a, b) {
return a.index < b.index
})
let total_length = 0
let l = this.clampPositions.length - 1
this.clampPositions.forEach((item, index) => {
if (index !== l) {
let d1 = this.computeDistance([item.position, this.clampPositions[index + 1].position])
let d2 = Math.abs(item.position.alt - this.clampPositions[index + 1].position.alt)
let d3 = Math.sqrt(d1 * d1 + d2 * d2)
total_length += d3
}
})
return Number(total_length.toFixed(2))
}
static createPolyline(that) {
let id = that.randomString()
that.viewer.entities.add(new Cesium.Entity({
id,
polyline: {
positions: new Cesium.CallbackProperty(() => {
return that.positions
}, false),
clampToGround: true,
width: 3,
material: new Cesium.PolylineDashMaterialProperty({
color: new Cesium.Color.fromCssColorString(that.options.color || that.defaultColor),
dashLength: 20, //短划线长度
}),
zIndex: 99999999
}
}))
return id
}
static create_point(cartesian, {
label, image = "point.png",
width,
height
}, that) {
let id = that.randomString()
let p = that.cartesian3Towgs84(cartesian, that.viewer)
if (label) {
label.pixelOffset = new Cesium.Cartesian2(
0, -(height || 32)
)
}
that.viewer.entities.add(
new Cesium.Entity({
id: id,
label,
position: Cesium.Cartesian3.fromDegrees(p.lng, p.lat, p.alt),
billboard: {
image: that.getSourceRootPath() + '/img/' + image,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
width,
height
}
})
)
return id
}
getLabel(text) {
return {
text: text || '',
//标注文字描述
font: '20px Microsoft YaHei',
fillColor: Cesium.Color.fromCssColorString('#f1e605'),
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
//标注的遮挡距离设置为100则视角与标注的距离大于100米时会有遮挡
// distanceDisplayCondition: this.distanceDisplayCondition,
scale: 1,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
// disableDepthTestDistance: this.disableDepthTestDistance,
}
}
/**
* 开始测量
*/
start() {
if (!YJ.Measure.GetMeasureStatus()) {
super.start()
this.positions = []
this.cachePositions = []
let leftEvent = (movement, car) => {
if (this.ids.length === 0) {
this.polyline_id = (MeasureSlopeDistance.createPolyline(this))
this.start_id = MeasureSlopeDistance.create_point(car, {
image: "start1.png", width: 30, height: 38, label: this.getLabel("")
}, this)
//创建起点
}
this.tip.setPosition(car, movement.position.x, movement.position.y)
this.positions = this.cachePositions.concat(car)
if (this.ids.length !== 0) {
let cur_point = this.cartesian3Towgs84(car, this.viewer)
let pre_p = this.cartesian3Towgs84(this.cachePositions[this.cachePositions.length - 1], this.viewer)
if (cur_point.lng !== pre_p.lng || cur_point.lat !== pre_p.lat || cur_point.alt !== pre_p.alt) {
this.cachePositions.push(car)
//计算坡度
this.computeAngle(pre_p, cur_point)
}
} else {
this.cachePositions.push(car)
this.ids.push(MeasureSlopeDistance.create_point(car, {}, this))
let startPoint = this.viewer.entities.getById(this.ids[0])
if(startPoint) {
startPoint.billboard.show = false
}
}
}
let rightEvent = (movement, car) => {
if (this.ids.length !== 0) {
// let cur_point = this.cartesian3Towgs84(car, this.viewer)
// let pre_p = this.cartesian3Towgs84(this.cachePositions[this.cachePositions.length - 1], this.viewer)
// if (cur_point.lng !== pre_p.lng || cur_point.lat !== pre_p.lat || cur_point.alt !== pre_p.alt) {
// this.cachePositions.push(car)
// //计算坡度
// this.computeAngle(pre_p, cur_point)
// }
} else {
// this.cachePositions.push(car)
this.ids.push(MeasureSlopeDistance.create_point(car, {}, this))
}
if (this.cachePositions.length) {
this.positions = this.cachePositions
this.end_id = MeasureSlopeDistance.create_point(this.cachePositions[this.cachePositions.length - 1], {
image: "end1.png",
width: 30,
height: 38,
}, this)
let endPoint = this.viewer.entities.getById(this.ids[this.ids.length-1])
if(endPoint) {
endPoint.billboard.show = false
}
}
if (this.cachePositions.length < 2) {
this.destroy()
YJ.Measure.Measures.pop()//弹出测量实体
}
this.end()
}
this.event.mouse_left(leftEvent)
this.event.mouse_move((movement, car) => {
movement.endPosition.y += 2
let position = movement.endPosition
let cartesian = this.viewer.scene.pickPosition(position)
if (!cartesian) {
const ray = this.viewer.camera.getPickRay(position); //相交的射线
cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
}
this.tip.setPosition(car, movement.endPosition.x, movement.endPosition.y)
this.positions = this.cachePositions.concat(cartesian)
if (this.cachePositions.length) {
let cur_point = this.cartesian3Towgs84(cartesian, this.viewer)
let pre_p = this.cartesian3Towgs84(this.cachePositions[this.cachePositions.length - 1], this.viewer)
let d1 = this.computeDistance([pre_p, cur_point])
let d2 = Math.abs(pre_p.alt - cur_point.alt)
let d3 = Math.sqrt(d1 * d1 + d2 * d2)
let cosAlpha = d1 / d3
let acos = Math.acos(cosAlpha)
let angle = this.radiansToDegrees(acos)
let label = "坡度:" + angle.toFixed(2) + "°"
this.tip.set_text(label)
}
})
this.event.mouse_right(rightEvent)
this.event.mouse_right_keyboard_ctrl((movement, car) => {
if (this.cachePositions.length) {
this.cachePositions.pop()
this.remove_entity(this.ids.pop())
}
})
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)
}
})
})
}
}
computeAngle(start, end) {
let d1 = this.computeDistance([start, end])
let d2 = Math.abs(start.alt - end.alt)
let d3 = Math.sqrt(d1 * d1 + d2 * d2)
let cosAlpha = d1 / d3
let acos = Math.acos(cosAlpha)
let angle = this.radiansToDegrees(acos)
let label = this.getLabel("坡度:" + angle.toFixed(2) + "°")
label.pixelOffset = new Cesium.Cartesian2(
0, -(32)
)
this.ids.push(MeasureSlopeDistance.create_point(Cesium.Cartesian3.fromDegrees(end.lng, end.lat, end.alt), {label: label}, this))
}
/**
* 清除测量
*/
destroy() {
[this.polyline_id, this.end_id, this.start_id, ...this.ids].forEach(id => {
this.remove_entity(id)
})
super.destroy()
}
/**
* 结束测量
*/
end() {
// YJ.Measure.SetMeasureStatus(false)
// this.tip.destroy()
// this.event.destroy()
super.end()
// this.setPickStatus(this.pickStatus.pick)
}
}
export default MeasureSlopeDistance

View File

@ -0,0 +1,173 @@
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

View File

@ -0,0 +1,290 @@
/**
* @name: index
* @author: Administrator
* @date: 2022-07-21 15:22
* @descriptionindex
* @update: 2022-07-21 15:22
*/
import Measure from "../index";
class MeasureTriangle extends Measure {
/**
* @constructor
* @param sdk
* @description 三角测量
* */
constructor(sdk) {
super(sdk);
}
cal_center(positions) {
let p1 = this.cartesian3Towgs84(positions[0], this.viewer)
let p2 = this.cartesian3Towgs84(positions[1], this.viewer)
let center = this.computeCenter([p1, p2]);
return Cesium.Cartesian3.fromDegrees(center.lng, center.lat, (p1.alt + p2.alt) / 2)
}
cal_distance(positions) {
let p1 = this.cartesian3Towgs84(positions[0], this.viewer)
let p2 = this.cartesian3Towgs84(positions[1], this.viewer)
let dis = this.computeDistance([p1, p2])
p1.alt = p1.alt.toFixed(2)
p2.alt = p2.alt.toFixed(2)
if (p1.alt === p2.alt) {//水平边
return dis
} else if (Number(dis) === 0.00) {//竖直边
return Math.abs(p1.alt - p2.alt).toFixed(2)
} else {//斜边
return Math.sqrt(dis * dis + Math.pow(Math.abs(p1.alt - p2.alt).toFixed(2), 2)).toFixed(2)
}
}
createPolyline(id) {
let obj = this.id_map.get(id)
this.viewer.entities.add(new Cesium.Entity({
id,
position: new Cesium.CallbackProperty(() => {
if (obj.positions.length === 2)
return this.cal_center(obj.positions)
else
return Cesium.Cartesian3()
}, false),
label: {
text: new Cesium.CallbackProperty(() => {
if (obj.positions.length === 2)
return this.cal_distance(obj.positions) + "米"
else
return "0米"
}, 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, -10),
disableDepthTestDistance: Number.POSITIVE_INFINITY,
},
polyline: {
positions: new Cesium.CallbackProperty(() => {
return obj.positions
}, false),
width: 2,
material: Cesium.Color.YELLOW,
zIndex: 99999999
}
}))
this.ids.push(id)
}
create_angle_label(positions1, positions2, id, type) {
let entity = new Cesium.Entity({
id,
position: new Cesium.CallbackProperty(() => {
if (positions1.length === 2)
return this.cal_point(positions1, positions2)
else
return Cesium.Cartesian3()
}),
label: {
text: new Cesium.CallbackProperty(() => {
if (positions1.length === 2)
return this.cal_angle(positions1, positions2, type) + "°"
else
return "0°"
}, 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(15, -10),
}
})
this.viewer.entities.add(entity)
}
cal_point(positions1, positions2) {
for (let i = 0; i < positions1.length; i++) {
for (let j = 0; j < positions2.length; j++) {
if (positions1[i].x === positions2[j].x &&
positions1[i].y === positions2[j].y &&
positions1[i].z === positions2[j].z
) {
return positions1[i]
}
}
}
}
cal_angle(id1, id2, type) {
if (type === 1) {//水平&竖直
return 90
} else if (type === 2 || type === 3) {//水平&斜边 竖直&斜边
let positions1 = this.id_map.get(id1).positions
let positions2 = this.id_map.get(id2).positions
let p1 = this.cartesian3Towgs84(positions1[0], this.viewer)
let p2 = this.cartesian3Towgs84(positions1[1], this.viewer)
let shuiping = this.computeDistance([p2, p1])
let p3 = this.cartesian3Towgs84(positions2[0], this.viewer)
let p4 = this.cartesian3Towgs84(positions2[1], this.viewer)
let d = this.computeDistance([p3, p4])
let h = Math.abs(p3.alt - p4.alt)
let x = Math.sqrt(Math.pow(h, 2) + Math.pow(d, 2))
if (shuiping == 0.00) {
shuiping = Math.abs(p2.alt - p1.alt)
}
return (Math.acos(shuiping / x) * 180 / Math.PI).toFixed(2)
}
}
/**
* 开始测量
*/
start() {
if (!YJ.Measure.GetMeasureStatus()) {
super.start()
this.positions = []
this.cachePositions = []
let shuiping_line_id = this.randomString();//水平线
let shuizhi_line_id = this.randomString();//竖直边
let xiebian_line_id = this.randomString();//斜边
let angle1 = this.randomString();//角度1
let angle2 = this.randomString();//角度2
let angle3 = this.randomString();//角度3
let xiebian_line_positions = [];//斜边
this.id_map = new Map()
let first_point = {}
this.id_map.set(xiebian_line_id, {positions: []})
this.id_map.set(shuiping_line_id, {positions: []})
this.id_map.set(shuizhi_line_id, {positions: []})
let leftEvent = (movement, car) => {
xiebian_line_positions.push(car)
if (this.ids.length === 0) {//创建三角形
first_point = this.cartesian3Towgs84(car, this.viewer)
this.createPolyline(shuiping_line_id,)
this.createPolyline(shuizhi_line_id,)
this.createPolyline(xiebian_line_id,)
// this.cal_angle(shuiping_line_id, shuizhi_line_id, 1)
// this.cal_angle(shuiping_line_id, xiebian_line_id, 2)
// this.cal_angle(shuizhi_line_id, xiebian_line_id, 3)
// this.ids.push(shuiping_line_id)
// this.ids.push(shuizhi_line_id)
// this.ids.push(xiebian_line_id)
}
this.ids.push(this.create_point(car))
this.tip.setPosition(car, movement.position.x, movement.position.y)
// // 隐藏斜边文字
// let xiebian = this.id_map.get(xiebian_line_id)
// let xbEntity = this.viewer.entities.getById(xiebian_line_id)
// if(xbEntity) {
// xbEntity.label.show = false
// }
if (xiebian_line_positions.length) {
// xiebian.positions = xiebian_line_positions.concat(car)
let p = this.cartesian3Towgs84(car, this.viewer)
let shuzhi = this.id_map.get(shuizhi_line_id)
let shuiping = this.id_map.get(shuiping_line_id)
if (p.alt < first_point.alt) {
shuzhi.positions[0] = car
shuzhi.positions[1] = Cesium.Cartesian3.fromDegrees(p.lng, p.lat, first_point.alt)
shuiping.positions[0] = Cesium.Cartesian3.fromDegrees(p.lng, p.lat, first_point.alt)
shuiping.positions[1] = Cesium.Cartesian3.fromDegrees(first_point.lng, first_point.lat, first_point.alt)
} else {
shuzhi.positions[0] = Cesium.Cartesian3.fromDegrees(first_point.lng, first_point.lat, p.alt)
shuzhi.positions[1] = car
shuiping.positions[0] = Cesium.Cartesian3.fromDegrees(first_point.lng, first_point.lat, p.alt)
shuiping.positions[1] = Cesium.Cartesian3.fromDegrees(first_point.lng, first_point.lat, first_point.alt)
}
// shuizhi.positions = shuizhi_positions
}
if (xiebian_line_positions.length === 2) {
this.end()
}
}
this.event.mouse_left(leftEvent)
this.event.mouse_move((movement, car) => {
this.tip.setPosition(car, movement.endPosition.x, movement.endPosition.y)
let xiebian = this.id_map.get(xiebian_line_id)
if (xiebian_line_positions.length) {
xiebian.positions = xiebian_line_positions.concat(car)
let p = this.cartesian3Towgs84(car, this.viewer)
let shuzhi = this.id_map.get(shuizhi_line_id)
let shuiping = this.id_map.get(shuiping_line_id)
if (p.alt < first_point.alt) {
shuzhi.positions[0] = car
shuzhi.positions[1] = Cesium.Cartesian3.fromDegrees(p.lng, p.lat, first_point.alt)
shuiping.positions[0] = Cesium.Cartesian3.fromDegrees(p.lng, p.lat, first_point.alt)
shuiping.positions[1] = Cesium.Cartesian3.fromDegrees(first_point.lng, first_point.lat, first_point.alt)
} else {
shuzhi.positions[0] = Cesium.Cartesian3.fromDegrees(first_point.lng, first_point.lat, p.alt)
shuzhi.positions[1] = car
shuiping.positions[0] = Cesium.Cartesian3.fromDegrees(first_point.lng, first_point.lat, p.alt)
shuiping.positions[1] = Cesium.Cartesian3.fromDegrees(first_point.lng, first_point.lat, first_point.alt)
}
// shuizhi.positions = shuizhi_positions
}
})
this.event.mouse_right((movement, car) => {
this.end()
})
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()
}
else {
leftEvent(pos, cartesian)
}
})
})
}
}
/**
* 结束测量
*/
end() {
super.end();
}
/**
* 清除测量
*/
destroy() {
super.destroy()
}
}
export default MeasureTriangle

View File

@ -0,0 +1,197 @@
/**
* @name: index
* @author: Administrator
* @date: 2022-07-11 17:28
* @descriptionindex
* @update: 2022-07-11 17:28
*/
import Measure from "../index"
/**@extends Measure*/
class MeasureTyArea 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 lastArea = 0
let lastcneter
let leftEvent = (movement, car) => {
if (this.ids.length === 0) {
this.polygon_id = MeasureTyArea.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)
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 })
})
let center = this.computeCenter(arr)
let area = this.computeArea(arr)
lastArea = area
this.center = new Cesium.Cartesian3.fromDegrees(center.lng, center.lat, height)
lastcneter = this.center
this.text = "投影面积:" + area + " ㎡"
}
}
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 })
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 })
})
let center = this.computeCenter(arr)
let area = this.computeArea(arr)
this.center = new Cesium.Cartesian3.fromDegrees(center.lng, center.lat, height)
this.text = "投影面积:" + area + " ㎡"
}
})
this.event.mouse_right((movement, car) => {
this.positions = this.cachePositions
this.center = lastcneter
if (this.positions.length < 3) {
this.text = ""
let error = '面积计算至少需要三个坐标!'
console.warn(error)
window.ELEMENT && window.ELEMENT.Message({
message: error,
type: 'warning',
duration: 1500
});
this.destroy()
}
else {
this.text = "投影面积:" + lastArea + " ㎡"
}
this.end()
})
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.positions = this.cachePositions
this.end()
}
else {
leftEvent(pos, cartesian)
}
})
})
}
}
/**
* 清除测量
*/
destroy() {
[this.polygon_id, ...this.ids].forEach(id => {
this.remove_entity(id)
})
super.destroy()
}
/**
* 结束测量
*/
end() {
super.end()
}
}
export default MeasureTyArea

16
src/Measure/clear.js Normal file
View File

@ -0,0 +1,16 @@
/**
* @name: clear
* @author: Administrator
* @date: 2022-07-11 15:28
* @descriptionclear
* @update: 2022-07-11 15:28
*/
function Clear() {
YJ.Measure.Measures.forEach(m => {
m.destroy()
})
YJ.Measure.Measures = []
}
export {Clear}

80
src/Measure/index.js Normal file
View File

@ -0,0 +1,80 @@
import MouseEvent from "../Event";
import MouseTip from "../MouseTip";
import Tools from "../Tools";
/**
* @name: measure
* @author: Administrator
* @date: 2022-07-11 10:52
* @descriptionmeasure
* @update: 2022-07-11 10:52
*/
class Measure extends Tools {
constructor(sdk, options = {text: "左键开始,右键结束;"}) {
super(sdk, options)
this.options = {...options}
this.event = new MouseEvent(sdk)
this.tip = new MouseTip(options.text, sdk)
this.viewer = sdk.viewer
this.defaultColor = 'rgba(246,49,49,0.55)'
this.ids = []
YJ.Measure.Measures.push(this)
this._isDestroy = false
// this.pickStatus = {pick: YJ.getEarth().interaction.picking.enabled}
}
start() {
this.setPickStatus(false)
YJ.Measure.SetMeasureStatus(true)
}
destroy() {
// YJ.Measure.Measures.pop()
this._isDestroy = true
this.end()
this.ids.forEach(id => {
this.remove_entity(id)
})
}
end() {
// this.ids.forEach(id => {
// this.remove_entity(id)
// })
//还原上一次的状态
// this.setPickStatus(this.pickStatus.pick)
YJ.Measure.SetMeasureStatus(false)
this.tip && this.tip.destroy()
this.event && this.event.destroy()
this.tip = null
this.event = null
}
create_point(cartesian,show = true) {
let id = this.randomString()
let p = this.cartesian3Towgs84(cartesian, this.viewer)
this.viewer.entities.add(
new Cesium.Entity({
id: id,
position: Cesium.Cartesian3.fromDegrees(p.lng, p.lat, p.alt),
billboard: {
show: show,
image: this.getSourceRootPath() + '/img/point.png',
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
color: Cesium.Color.WHITE.withAlpha(0.99)
}
})
)
return id
}
remove_entity(id) {
this.viewer.entities.removeById(id)
}
}
export default Measure