2025-09-01 16:17:11 +08:00
|
|
|
|
/*
|
|
|
|
|
*通视分析
|
|
|
|
|
* @Author: Wang jianLei
|
|
|
|
|
* @Date: 2022-04-17 22:04:52
|
|
|
|
|
* @Last Modified by: Wang JianLei
|
|
|
|
|
* @Last Modified time: 2022-04-17 22:05:13
|
|
|
|
|
*/
|
|
|
|
|
import Tools from "../../../Tools";
|
|
|
|
|
import Event from "../../../Event";
|
|
|
|
|
import MouseTip from "../../../MouseTip";
|
|
|
|
|
import EventBinding from '../../Element/Dialog/eventBinding';
|
|
|
|
|
import Dialog from '../../../BaseDialog';
|
|
|
|
|
import { html } from "./_element";
|
|
|
|
|
class VisibilityAnalysis extends Tools {
|
|
|
|
|
constructor(sdk, options = {}, _Dialog = {}) {
|
|
|
|
|
super(sdk, options)
|
|
|
|
|
this.viewer = sdk.viewer;
|
|
|
|
|
this.resultObject = {
|
|
|
|
|
viewPoint: undefined, //通视分析起点
|
|
|
|
|
targetPoints: [], //通视分析目标点集合
|
|
|
|
|
targetPoint: undefined, //当前目标点
|
|
|
|
|
objectExclude: [], //射线排除集合
|
|
|
|
|
entities: [], //创建的Entity对象
|
|
|
|
|
};
|
|
|
|
|
this.options = {}
|
|
|
|
|
this._elms = {};
|
|
|
|
|
this.viewPointHeight = options.viewPointHeight
|
|
|
|
|
this.Dialog = _Dialog
|
|
|
|
|
this._EventBinding = new EventBinding()
|
|
|
|
|
YJ.Analysis.AnalysesResults.push(this)
|
2025-09-01 16:26:25 +08:00
|
|
|
|
// VisibilityAnalysis.edit(this)
|
|
|
|
|
VisibilityAnalysis.create(this)
|
2025-09-01 16:17:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get viewPointHeight() {
|
|
|
|
|
return this.options.viewPointHeight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set viewPointHeight(v) {
|
|
|
|
|
let viewPointHeight = Math.floor(Number(v) * 10) / 10
|
|
|
|
|
if (isNaN(viewPointHeight)) {
|
|
|
|
|
viewPointHeight = 1.8
|
|
|
|
|
}
|
|
|
|
|
if (viewPointHeight < 0) {
|
|
|
|
|
viewPointHeight = 0
|
|
|
|
|
}
|
|
|
|
|
this.options.viewPointHeight = viewPointHeight
|
|
|
|
|
this._elms.viewPointHeight && this._elms.viewPointHeight.forEach((item) => {
|
|
|
|
|
item.value = viewPointHeight
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static create(that) {
|
|
|
|
|
if (!YJ.Measure.GetMeasureStatus()) {
|
|
|
|
|
if (that._DialogObject && that._DialogObject.close) {
|
|
|
|
|
that._DialogObject.close()
|
|
|
|
|
that._DialogObject = null
|
|
|
|
|
}
|
|
|
|
|
that.event = new Event(that.sdk)
|
|
|
|
|
that.tip = new MouseTip('左键点击创建视角起点', that.sdk)
|
|
|
|
|
YJ.Measure.SetMeasureStatus(true)
|
|
|
|
|
let count = 0;
|
|
|
|
|
that.event.mouse_left(async (movement, cartesian) => {
|
|
|
|
|
that.tip.set_text("左键创建视角终点,右键结束通视分析")
|
|
|
|
|
if (!that.resultObject.viewPoint) {
|
|
|
|
|
let pos84 = that.cartesian3Towgs84(cartesian, that.viewer)
|
|
|
|
|
let positions
|
2025-09-01 16:26:25 +08:00
|
|
|
|
if (that.sdk.viewer.terrainProvider.availability) {
|
2025-09-01 16:17:11 +08:00
|
|
|
|
positions = await Cesium.sampleTerrainMostDetailed(
|
|
|
|
|
that.sdk.viewer.terrainProvider,
|
|
|
|
|
[Cesium.Cartographic.fromDegrees(pos84.lng, pos84.lat)]
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
if (positions && positions[0].height > pos84.alt) {
|
|
|
|
|
pos84.alt = positions[0].height
|
|
|
|
|
}
|
|
|
|
|
pos84.alt = pos84.alt + that.viewPointHeight
|
|
|
|
|
let pos = Cesium.Cartesian3.fromDegrees(pos84.lng, pos84.lat, pos84.alt)
|
|
|
|
|
that.resultObject.viewPoint = pos;
|
|
|
|
|
let pointEntity = that.viewer.entities.add({
|
|
|
|
|
position: pos,
|
|
|
|
|
point: {
|
|
|
|
|
color: Cesium.Color.YELLOW,
|
|
|
|
|
pixelSize: 5,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
that.resultObject.objectExclude.push(pointEntity);
|
|
|
|
|
that.resultObject.entities.push(pointEntity);
|
|
|
|
|
} else {
|
|
|
|
|
that.resultObject.targetPoint = cartesian;
|
|
|
|
|
let pointEntity = that.viewer.entities.add({
|
|
|
|
|
position: cartesian,
|
|
|
|
|
point: {
|
|
|
|
|
color: Cesium.Color.YELLOW,
|
|
|
|
|
pixelSize: 5,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
that.resultObject.objectExclude.push(pointEntity);
|
|
|
|
|
that.resultObject.entities.push(pointEntity);
|
|
|
|
|
let direction = Cesium.Cartesian3.normalize(
|
|
|
|
|
Cesium.Cartesian3.subtract(
|
|
|
|
|
that.resultObject.targetPoint,
|
|
|
|
|
that.resultObject.viewPoint,
|
|
|
|
|
new Cesium.Cartesian3()
|
|
|
|
|
),
|
|
|
|
|
new Cesium.Cartesian3()
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
let ray = new Cesium.Ray(that.resultObject.viewPoint, direction);
|
|
|
|
|
let pickedObjects = that.viewer.scene.drillPickFromRay(ray);
|
|
|
|
|
let result = {}
|
|
|
|
|
for (let i = 0; i < pickedObjects.length; i++) {
|
|
|
|
|
if (pickedObjects[i].position) {
|
|
|
|
|
result = pickedObjects[i]
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// let result = that.viewer.scene.pickFromRay(
|
|
|
|
|
// ray,
|
|
|
|
|
// that.resultObject.objectExclude
|
|
|
|
|
// ); // 计算交互点,返回第一个
|
|
|
|
|
if (result) {
|
|
|
|
|
let dis0 = VisibilityAnalysis.distance(
|
|
|
|
|
that.resultObject.viewPoint,
|
|
|
|
|
that.resultObject.targetPoint
|
|
|
|
|
);
|
|
|
|
|
let dis1 = VisibilityAnalysis.distance(
|
|
|
|
|
that.resultObject.viewPoint,
|
|
|
|
|
result.position || cartesian
|
|
|
|
|
);
|
|
|
|
|
let dis2 = VisibilityAnalysis.distance(
|
|
|
|
|
result.position || cartesian,
|
|
|
|
|
that.resultObject.targetPoint
|
|
|
|
|
);
|
|
|
|
|
if (dis0 > dis1) {
|
|
|
|
|
let _poly0 = that.viewer.entities.add({
|
|
|
|
|
polyline: {
|
|
|
|
|
positions: [that.resultObject.viewPoint, result.position],
|
|
|
|
|
material: Cesium.Color.GREEN,
|
|
|
|
|
width: 3,
|
|
|
|
|
zIndex: 99999999
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
that.resultObject.entities.push(_poly0);
|
|
|
|
|
let _poly1 = that.viewer.entities.add({
|
|
|
|
|
polyline: {
|
|
|
|
|
positions: [result.position, that.resultObject.targetPoint],
|
|
|
|
|
material: Cesium.Color.RED,
|
|
|
|
|
width: 3,
|
|
|
|
|
zIndex: 99999999
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
that.resultObject.entities.push(_poly1);
|
|
|
|
|
that.resultObject.targetPoints.push({
|
|
|
|
|
targetPoint: cartesian,
|
|
|
|
|
visual: false, //如果dis2足够小,其实他是可视的
|
|
|
|
|
distance: [dis0, dis1, dis2], //[初始点和终点,初始点和交点,交点和终点]
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
let _poly2 = that.viewer.entities.add({
|
|
|
|
|
polyline: {
|
|
|
|
|
positions: [
|
|
|
|
|
that.resultObject.viewPoint,
|
|
|
|
|
that.resultObject.targetPoint,
|
|
|
|
|
],
|
|
|
|
|
material: Cesium.Color.GREEN,
|
|
|
|
|
width: 3,
|
|
|
|
|
zIndex: 99999999
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
that.resultObject.entities.push(_poly2);
|
|
|
|
|
that.resultObject.targetPoints.push({
|
|
|
|
|
targetPoint: cartesian,
|
|
|
|
|
visual: true, //如果dis2足够小,其实他是可视的
|
|
|
|
|
distance: [dis0, dis1, dis2], //[初始点和终点,初始点和交点,交点和终点]
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
that.event.mouse_move((movement, cartesian) => {
|
|
|
|
|
that.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y)
|
|
|
|
|
})
|
|
|
|
|
that.event.mouse_right((movement, cartesian) => {
|
|
|
|
|
end()
|
|
|
|
|
})
|
|
|
|
|
that.event.gesture_pinck_start((movement, cartesian) => {
|
|
|
|
|
let startTime = new Date()
|
|
|
|
|
that.event.gesture_pinck_end(() => {
|
|
|
|
|
let endTime = new Date()
|
|
|
|
|
if (endTime - startTime >= 500) {
|
|
|
|
|
end()
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
console.log('上一次测量未结束')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function end() {
|
|
|
|
|
YJ.Measure.SetMeasureStatus(false)
|
|
|
|
|
that.tip.destroy()
|
|
|
|
|
that.event.destroy()
|
|
|
|
|
that.tip = null
|
|
|
|
|
that.event = null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// static update(that) {
|
|
|
|
|
// if (!that.resultObject.viewPoint) {
|
|
|
|
|
// return
|
|
|
|
|
// }
|
|
|
|
|
// for (let i = that.resultObject.entities.length - 1; i >= 0; i--) {
|
|
|
|
|
// if (that.resultObject.entities[i].point) {
|
|
|
|
|
// that.viewer.entities.remove(that.resultObject.entities[i]);
|
|
|
|
|
// that.resultObject.entities.splice(i, 1)
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// setTimeout(() => {
|
|
|
|
|
// for (let i = 0; i < that.resultObject.targetPoints.length; i++) {
|
|
|
|
|
// that.resultObject.targetPoint = that.resultObject.targetPoints[i].targetPoint;
|
|
|
|
|
// let direction = Cesium.Cartesian3.normalize(
|
|
|
|
|
// Cesium.Cartesian3.subtract(
|
|
|
|
|
// that.resultObject.targetPoint,
|
|
|
|
|
// that.resultObject.viewPoint,
|
|
|
|
|
// new Cesium.Cartesian3()
|
|
|
|
|
// ),
|
|
|
|
|
// new Cesium.Cartesian3()
|
|
|
|
|
// );
|
|
|
|
|
// let ray = new Cesium.Ray(that.resultObject.viewPoint, direction);
|
|
|
|
|
// let pickedObjects = that.viewer.scene.drillPickFromRay(ray);
|
|
|
|
|
// let result = {}
|
|
|
|
|
// for (let i = 0; i < pickedObjects.length; i++) {
|
|
|
|
|
// if (pickedObjects[i].position) {
|
|
|
|
|
// result = pickedObjects[i]
|
|
|
|
|
// break
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// // let result = that.viewer.scene.pickFromRay(
|
|
|
|
|
// // ray,
|
|
|
|
|
// // that.resultObject.objectExclude
|
|
|
|
|
// // ); // 计算交互点,返回第一个
|
|
|
|
|
// if (result) {
|
|
|
|
|
// let dis0 = VisibilityAnalysis.distance(
|
|
|
|
|
// that.resultObject.viewPoint,
|
|
|
|
|
// that.resultObject.targetPoint
|
|
|
|
|
// );
|
|
|
|
|
// let dis1 = VisibilityAnalysis.distance(
|
|
|
|
|
// that.resultObject.viewPoint,
|
|
|
|
|
// result.position || cartesian
|
|
|
|
|
// );
|
|
|
|
|
// let dis2 = VisibilityAnalysis.distance(
|
|
|
|
|
// result.position || cartesian,
|
|
|
|
|
// that.resultObject.targetPoint
|
|
|
|
|
// );
|
|
|
|
|
// if (dis0 > dis1) {
|
|
|
|
|
// let _poly0 = that.viewer.entities.add({
|
|
|
|
|
// polyline: {
|
|
|
|
|
// positions: [that.resultObject.viewPoint, result.position],
|
|
|
|
|
// material: Cesium.Color.GREEN,
|
|
|
|
|
// width: 3,
|
|
|
|
|
// zIndex: 99999999
|
|
|
|
|
// },
|
|
|
|
|
// });
|
|
|
|
|
// that.resultObject.entities.push(_poly0);
|
|
|
|
|
// let _poly1 = that.viewer.entities.add({
|
|
|
|
|
// polyline: {
|
|
|
|
|
// positions: [result.position, that.resultObject.targetPoint],
|
|
|
|
|
// material: Cesium.Color.RED,
|
|
|
|
|
// width: 3,
|
|
|
|
|
// zIndex: 99999999
|
|
|
|
|
// },
|
|
|
|
|
// });
|
|
|
|
|
// that.resultObject.entities.push(_poly1);
|
|
|
|
|
// } else {
|
|
|
|
|
// let _poly2 = that.viewer.entities.add({
|
|
|
|
|
// polyline: {
|
|
|
|
|
// positions: [
|
|
|
|
|
// that.resultObject.viewPoint,
|
|
|
|
|
// that.resultObject.targetPoint,
|
|
|
|
|
// ],
|
|
|
|
|
// material: Cesium.Color.GREEN,
|
|
|
|
|
// width: 3,
|
|
|
|
|
// zIndex: 99999999
|
|
|
|
|
// },
|
|
|
|
|
// });
|
|
|
|
|
// that.resultObject.entities.push(_poly2);
|
|
|
|
|
// }
|
|
|
|
|
// }
|
2025-09-01 16:26:25 +08:00
|
|
|
|
// }
|
2025-09-01 16:17:11 +08:00
|
|
|
|
// }, 1000);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
static async edit(that) {
|
|
|
|
|
if (that._DialogObject && that._DialogObject.close) {
|
|
|
|
|
that._DialogObject.close()
|
|
|
|
|
that._DialogObject = null
|
|
|
|
|
}
|
|
|
|
|
that._DialogObject = await new Dialog(that.sdk.viewer._container, {
|
|
|
|
|
title: '多点视线分析', left: '180px', top: '100px',
|
|
|
|
|
closeCallBack: () => {
|
|
|
|
|
that.Dialog.closeCallBack && that.Dialog.closeCallBack()
|
|
|
|
|
YJ.Measure.SetMeasureStatus(false)
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
await that._DialogObject.init()
|
|
|
|
|
that._DialogObject._element.body.className = that._DialogObject._element.body.className + ' visibility'
|
|
|
|
|
let contentElm = document.createElement('div');
|
|
|
|
|
contentElm.innerHTML = html()
|
|
|
|
|
that._DialogObject.contentAppChild(contentElm)
|
|
|
|
|
|
|
|
|
|
let drawElm = document.createElement('button')
|
|
|
|
|
drawElm.innerHTML = '绘制'
|
|
|
|
|
drawElm.addEventListener('click', () => {
|
|
|
|
|
VisibilityAnalysis.create(that)
|
|
|
|
|
})
|
|
|
|
|
that._DialogObject.footAppChild(drawElm)
|
|
|
|
|
|
|
|
|
|
let all_elm = contentElm.getElementsByTagName("*")
|
|
|
|
|
that._EventBinding.on(that, all_elm)
|
|
|
|
|
that._elms = that._EventBinding.element
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//空间两点间距离
|
|
|
|
|
static distance(point1, point2) {
|
|
|
|
|
let point1cartographic = Cesium.Cartographic.fromCartesian(point1);
|
|
|
|
|
let point2cartographic = Cesium.Cartographic.fromCartesian(point2);
|
|
|
|
|
/**根据经纬度计算出距离**/
|
|
|
|
|
let geodesic = new Cesium.EllipsoidGeodesic();
|
|
|
|
|
geodesic.setEndPoints(point1cartographic, point2cartographic);
|
|
|
|
|
let s = geodesic.surfaceDistance;
|
|
|
|
|
//返回两点之间的距离
|
|
|
|
|
s = Math.sqrt(
|
|
|
|
|
Math.pow(s, 2) +
|
|
|
|
|
Math.pow(point2cartographic.height - point1cartographic.height, 2)
|
|
|
|
|
);
|
|
|
|
|
return s;
|
|
|
|
|
}
|
|
|
|
|
destroy() {
|
|
|
|
|
this.resultObject.entities.forEach((element) => {
|
|
|
|
|
this.viewer.entities.remove(element);
|
|
|
|
|
});
|
|
|
|
|
this.resultObject = {
|
|
|
|
|
viewPoint: undefined, //通视分析起点
|
|
|
|
|
targetPoints: [], //通视分析目标点集合
|
|
|
|
|
targetPoint: undefined, //当前目标点
|
|
|
|
|
objectExclude: [], //射线排除集合
|
|
|
|
|
entities: [], //创建的Entity对象
|
|
|
|
|
};
|
|
|
|
|
this.tip && this.tip.destroy()
|
|
|
|
|
this.event && this.event.destroy()
|
|
|
|
|
this.tip = null
|
|
|
|
|
this.event = null
|
|
|
|
|
YJ.Measure.SetMeasureStatus(false)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-01 16:26:25 +08:00
|
|
|
|
export default VisibilityAnalysis;
|