乐于分享
好东西不私藏

Vue3+Cesium雷达遮罩扫描核心源码分享(第52篇)

Vue3+Cesium雷达遮罩扫描核心源码分享(第52篇)

欢迎关注webgis学习,一起探索Cesium高级应用,持续更新中……
雷达扫描效果广泛应用于军事防空预警、气象监测预报、航空交通管制、海事船舶导航、地质灾害监测及智能安防监控等领域,通过360度旋转扫描实现目标探测、轨迹追踪与态势感知,为决策提供实时空间数据支撑。本文详细介绍了如何使用Cesium库在三维环境中创建一个动态旋转的半球体,达到实现雷达遮罩扫描效果的目的。先看效果:
实现过程
1、新建RadarMaskScan类。生成基本的图形wall:扇形的垂直面

ellipsoid:半球形扫描范围。通过addEventListener设置扫描动画。

calcPoints:计算扇形顶点;
getCircleFlight:生成扇形路径。

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, 090);    }    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());    }}
2、前端页面只需生成一个RadarMaskScan类对象,设置好扫描位置即半径即可。
const addRadarMaskScan = () => {    const radarMaskScan new RadarMaskScan(        viewer!,        {            id"radarMaskScan",            radius100000.0,            position: [116.43937.473],        });    viewer?.camera.setView({        destination: Cartesian3.fromDegrees(116.43937.473700000.0)    });}
3、实现效果如下
4、本系列教程代码采用Vue3+Cesium+Typescript封装编写,后续持续更新,基本会涵盖 Cesium 从基础配置到高阶实战的全链路技术体系,敬请期待。读者朋友如需源码的话,欢迎在公众号输入栏私信咨询作者。
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Vue3+Cesium雷达遮罩扫描核心源码分享(第52篇)

评论 抢沙发

4 + 9 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮