Vue3+Cesium雷达遮罩扫描核心源码分享(第52篇)
export default class RadarMaskScan {private viewer: Viewer;private id: string | number;private radius: number;private longitude: number;private latitude: number;private position: Cartesian3;private heading: number;private positionArr: number[];constructor(viewer: Viewer, options: RadarMaskScanOptions) {this.viewer = viewer;this.id = options.id;this.radius = options.radius;this.longitude = options.position[0];this.latitude = options.position[1];this.position = Cartesian3.fromDegrees(options.position[0],options.position[1]);this.heading = 0;this.positionArr = this.calcPoints(options.position[0],options.position[1],options.radius,0);this.addEntities();}private addEntities(): void {const entity = this.viewer.entities.add({id: this.id.toString(),position: this.position,wall: {positions: new CallbackProperty(() => {return Cartesian3.fromDegreesArrayHeights(this.positionArr);}, false),material: Color.fromCssColorString("#ff330082"),},ellipsoid: {radii: new Cartesian3(this.radius,this.radius,this.radius),maximumCone: CesiumMath.toRadians(90),material: Color.fromCssColorString("#51ff0082"),outline: true,outlineColor: Color.fromCssColorString("#f1efe8e5"),outlineWidth: 1,},});this.viewer.clock.onTick.addEventListener(() => {this.heading -= 1.0; // 可调节转动速度this.positionArr = this.calcPoints(this.longitude,this.latitude,this.radius,this.heading);});}private calcPoints(x1: number,y1: number,radius: number,heading: number): number[] {const m = Transforms.eastNorthUpToFixedFrame(Cartesian3.fromDegrees(x1, y1));const rx = radius * Math.cos((heading * Math.PI) / 180.0);const ry = radius * Math.sin((heading * Math.PI) / 180.0);const translation = Cartesian3.fromElements(rx, ry, 0);const d = Matrix4.multiplyByPoint(m,translation,new Cartesian3());const c = Cartographic.fromCartesian(d);const x2 = CesiumMath.toDegrees(c.longitude);const y2 = CesiumMath.toDegrees(c.latitude);return this.getCircleFlight(x1, y1, x2, y2, 0, 90);}private getCircleFlight(x1: number,y1: number,x2: number,y2: number,fx: number,angle: number): number[] {const positionArr: number[] = [];positionArr.push(x1);positionArr.push(y1);positionArr.push(0);const radius = Cartesian3.distance(Cartesian3.fromDegrees(x1, y1),Cartesian3.fromDegrees(x2, y2));for (let i = fx; i <= fx + angle; i++) {const h = radius * Math.sin((i * Math.PI) / 180.0);const r = Math.cos((i * Math.PI) / 180.0);const x = (x2 - x1) * r + x1;const y = (y2 - y1) * r + y1;positionArr.push(x);positionArr.push(y);positionArr.push(h);}return positionArr;}// 公共方法:销毁/清理资源public destroy(): void {this.viewer.entities.removeById(this.id.toString());}}
const addRadarMaskScan = () => {const radarMaskScan = new RadarMaskScan(viewer!,{id: "radarMaskScan",radius: 100000.0,position: [116.439, 37.473],});viewer?.camera.setView({destination: Cartesian3.fromDegrees(116.439, 37.473, 700000.0)});}

夜雨聆风
