Cesium-Examples/examples/cesiumEx/ViewShed3D2index.js
2025-03-11 17:51:04 +08:00

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 };
}