mirror of
https://github.com/jiawanlong/Cesium-Examples.git
synced 2025-07-04 15:17:36 +00:00
63 lines
2.2 KiB
JavaScript
63 lines
2.2 KiB
JavaScript
import * as MapUtil from '../../utils/commonviewshed';
|
|
import ViewShed3D2 from './ViewShed3D2';
|
|
|
|
export function ViewShedAnalysis(viewer) {
|
|
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
|
|
const pnts = [];
|
|
let viewShed = null;
|
|
const clear = () => {
|
|
if (handler) {
|
|
handler.destroy();
|
|
handler = null;
|
|
}
|
|
if (viewShed) {
|
|
viewShed.clear();
|
|
}
|
|
};
|
|
handler.setInputAction((evt) => {
|
|
if (pnts.length == 0) {
|
|
const cartesian = MapUtil.getCatesian3FromPX(evt.position, viewer);
|
|
let ps1 = Cesium.Cartographic.fromCartesian(cartesian)
|
|
ps1.height += 10
|
|
let cartesian2 = Cesium.Cartographic.toCartesian(ps1)
|
|
pnts.push(cartesian2);
|
|
}
|
|
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
|
handler.setInputAction((evt) => {
|
|
if (pnts.length == 1) {
|
|
const cartesian = MapUtil.getCatesian3FromPX(evt.position, viewer);
|
|
let ps1 = Cesium.Cartographic.fromCartesian(cartesian)
|
|
let cartesian2 = Cesium.Cartographic.toCartesian(ps1)
|
|
pnts.push(cartesian2);
|
|
handler.destroy();
|
|
handler = null;
|
|
}
|
|
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
|
|
handler.setInputAction((evt) => {
|
|
const cartesian = MapUtil.getCatesian3FromPX(evt.endPosition, viewer);
|
|
if (pnts.length < 1 || pnts.length >= 2) {
|
|
return;
|
|
}
|
|
// 将鼠标当前点坐标转化成经纬度
|
|
const ptn1 = MapUtil.getLonLat(viewer, pnts[0]);
|
|
const ptn2 = MapUtil.getLonLat(viewer, cartesian);
|
|
const direction = MapUtil.getAngle(ptn1, ptn2);
|
|
const distance = Cesium.Cartesian3.distance(pnts[0], cartesian);
|
|
let pitch = Math.asin((Cesium.Cartographic.fromCartesian(pnts[0]).height - Cesium.Cartographic.fromCartesian(cartesian).height) / distance) / Math.PI * 180
|
|
if (!viewShed) {
|
|
viewShed = new ViewShed3D2({
|
|
viewer,
|
|
viewPosition: pnts[0],
|
|
direction,
|
|
pitch: pitch,
|
|
startPosition:pnts[0],
|
|
endPosition:cartesian
|
|
});
|
|
} else {
|
|
// TODO: setDirectionDistancePitch改成_setDirectionDistancePitch
|
|
viewShed.setDirectionDistancePitch(direction, distance, pitch);
|
|
}
|
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
|
return { clear };
|
|
}
|