在业务场景中,往往是通过后端返回实时坐标数据进行无人机飞行,因此本文章是基于mock一个后端业务数据进行场景模拟,废话不多说,上代码
mock坐标及时间数据
export const time=[
{
"position": [120.272422, 37.568514],
"time": "2025-02-23T00:00:00.000Z"
},
{
"position": [120.250618, 37.558637],
"time": "2025-02-23T00:00:31.185Z"
},
{
"position": [120.234721, 37.572175],
"time": "2025-02-23T00:01:03.562Z"
},
{
"position": [120.25341, 37.584348],
"time": "2025-02-23T00:01:35.894Z"
},
{
"position": [120.234184, 37.60188],
"time": "2025-02-23T00:02:08.440Z"
},
{
"position": [120.253303, 37.622301],
"time": "2025-02-23T00:02:40.796Z"
},
{
"position": [120.293475, 37.622046],
"time": "2025-02-23T00:03:14.397Z"
},
{
"position": [120.288856, 37.610219],
"time": "2025-02-23T00:03:47.061Z"
},
{
"position": [120.270596, 37.596604],
"time": "2025-02-23T00:04:19.231Z"
},
{
"position": [120.290682, 37.58239],
"time": "2025-02-23T00:04:51.641Z"
},
{
"position": [120.300349, 37.594051],
"time": "2025-02-23T00:05:24.015Z"
},
{
"position": [120.310553, 37.587582],
"time": "2025-02-23T00:05:56.413Z"
}
]
具体业务飞行代码
getPosition(data) {
let positions = data.map((item, index) => {
return [...item["position"], 600 + index * 100 * Math.random()];
});
// positions = positions.flat(2);
return positions;
},
//加载无人机
initDrone() {
//初始化飞行时间
let startTime = time[0].time
let startJulianDate=Cesium.JulianDate.fromDate(new Date(startTime))
let stopTime = time[time.length - 1].time
let stopJulianDate=Cesium.JulianDate.fromDate(new Date(stopTime))
window.$viewer.clock.startTime = startJulianDate
window.$viewer.clock.stopTime = stopJulianDate
window.$viewer.clock.currentTime = startJulianDate;
window.$viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP,
// window.$viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER;
window.$viewer.clock.multiplier = 1;
//时间抽样
var property = new Cesium.SampledPositionProperty();
let positions = this.getPosition(time);
console.log(positions, 'positions')
positions.forEach((item, index) => {
// stopTime = startTime + 5000 * index
let timeStemp= time[index].time
console.log(item, 'item')
console.log(new Date(startJulianDate), 'startJulianDate')
property.addSample(Cesium.JulianDate.fromDate(new Date(timeStemp)), Cesium.Cartesian3.fromDegrees(item[0], item[1], item[2]))
})
//设置插入时算法
property.setInterpolationOptions({
interpolationAlgorithm: Cesium.LagrangePolynomialApproximation,
interpolationDegree: 0.0001,
})
console.log(property, 'property')
let drone = window.$viewer.entities.add({
name: "无人机",
position: property,
availability: new Cesium.TimeIntervalCollection([
new Cesium.TimeInterval({
start: Cesium.JulianDate.fromDate(new Date(startTime)),
stop: Cesium.JulianDate.fromDate(new Date(stopTime))
}),
]),
orientation: new Cesium.VelocityOrientationProperty(property),
polyline: {
positions: Cesium.Cartesian3.fromDegreesArrayHeights(positions.flat(2)),
width: 6,
material: new Cesium.PolylineGlowMaterialProperty({
glowPower: 0.5,
taperPower: 1.0,
color: Cesium.Color.YELLOW.withAlpha(0.5),
}),
},
path: {
material: new Cesium.PolylineGlowMaterialProperty({
color: Cesium.Color.YELLOW.withAlpha(0.5),
glowPower: 0.2,
}),
width: 10,
leadTime: 0,
resolution: 1,
trailTime: 0.1,
},
model: {
uri: "/model/GLB/CesiumDrone.glb",
minimumPixelSize: 64,
maximumScale: 20000,
},
});
window.$viewer.trackedEntity = drone;
},