js:
const Cesium = require('cesium/Cesium')
/*
* @Description: 立体雷达扫描效果(参考开源代码)
* @Version: 1.0
* @Author: Julian
* @Date: 2022-03-05 10:22:01
* @LastEditors: Julian
* @LastEditTime: 2022-03-05 15:04:44
*/
class TrackMatte {
constructor(options) {
this._viewer = options.viewer;
// 半径
this._radius = options.radius;
// 扫描扇形颜色
this._color = options.color;
// 扫描速度
this._speed = options.speed;
// 中心点坐标经纬度
this._cenLon = options.position[0],
this._cenLat = options.position[1],
this.heading = 0;
this.positionArr = this.calculatePane(
options.position[0],
options.position[1],
options.radius,
0
) //储存脏数据
this.radarSolidScan();
}
radarSolidScan() {
// 先建立椭球体
this._viewer.entities.add({
position: new Cesium.Cartesian3.fromDegrees(this._cenLon, this._cenLat),
name: "立体雷达扫描",
ellipsoid: {
radii: new Cesium.Cartesian3(this._radius, this._radius, this._radius),
material: this._color,
outline: true,
outlineColor: new Cesium.Color(1.0, 1.0, 0.0, 1.0),
outlineWidth: 1,
// 保证是半个球体
maximumCone:Cesium.Math.PI/2
}
})
// 创建1/4圆形立体墙
this._viewer.entities.add({
wall: {
positions: new Cesium.CallbackProperty(() => {
return Cesium.Cartesian3.fromDegreesArrayHeights(this.positionArr);
}, false),
material: this._color,
}
})
this.addPostRender()
}
addPostRender() {
this._viewer.clock.onTick.addEventListener(() => {
this.heading += 10.0;//可调节转动速度
this.positionArr = this.calculatePane(
this._cenLon,
this._cenLat,
this._radius,
this.heading
);
});
}
// 计算平面扫描范围
calculatePane(x1, y1, radius, heading) {
var m = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(x1, y1));
var rx = radius * Math.cos(heading * Math.PI / 180.0);
var ry = radius * Math.sin(heading * Math.PI / 180.0);
var translation = Cesium.Cartesian3.fromElements(rx, ry, 0);
var d = Cesium.Matrix4.multiplyByPoint(m, translation, new Cesium.Cartesian3());
var c = Cesium.Cartographic.fromCartesian(d);
var x2 = Cesium.Math.toDegrees(c.longitude);
var y2 = Cesium.Math.toDegrees(c.latitude);
return this.calculateSector(x1, y1, x2, y2);
}
// 计算竖直扇形
calculateSector(x1, y1, x2, y2) {
let positionArr = [];
positionArr.push(x1);
positionArr.push(y1);
positionArr.push(0);
var radius = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(x1, y1), Cesium.Cartesian3.fromDegrees(x2, y2));
// 扇形是1/4圆,因此角度设置为0-90
for (let i = 0; i <= 90; i++) {
let h = radius * Math.sin(i * Math.PI / 180.0);
let r = Math.cos(i * Math.PI / 180.0);
let x = (x2 - x1) * r + x1;
let y = (y2 - y1) * r + y1;
positionArr.push(x);
positionArr.push(y);
positionArr.push(h);
}
return positionArr;
}
}
export default TrackMatte
vue:
//1.把上面的js文件引入
import TrackMatte from "../../utils/circle/stereoRadarScan";
//2.调用工具类
// 立体雷达扫描方法
trackMatte() {
new TrackMatte({
viewer: viewer,
position: [113.9236839, 22.528061],
radius: 1000.0,
color: new Cesium.Color(1.0, 1.0, 0.0, 0.3),
speed: 5.0
});
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(113.929, 22.506,1000)
});
}
//3.在要调用的时候调用上面的方法
this.trackMatte();