Commit ef75edff by licheng

feat: 调整Cesium配置,并增加轨道数据采样功能进行优化

parent f1af583a
...@@ -7,3 +7,18 @@ pnpm-debug ...@@ -7,3 +7,18 @@ pnpm-debug
auto-*.d.ts auto-*.d.ts
.idea .idea
.history .history
public/xyz11.txt
public/xyz12.txt
public/xyz13.txt
public/xyz14.txt
public/xyz15.txt
public/xyz16.txt
public/xyz17.txt
public/xyz18.txt
public/xyz19.txt
public/xyz20.txt
public/xyz21.txt
public/xyz22.txt
public/xyz23.txt
public/xyz24.txt
public/xyz25.txt
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -24,7 +24,8 @@ const cesiumContainer = ref<HTMLDivElement | null>(null) ...@@ -24,7 +24,8 @@ const cesiumContainer = ref<HTMLDivElement | null>(null)
let viewer: Cesium.Viewer let viewer: Cesium.Viewer
const infoOffset = 2000000 // 信息框相对卫星的高度偏移(米) const infoOffset = 2000000 // 信息框相对卫星的高度偏移(米)
const imageUrl = '/src/assets/imgs/satellite.png' // 卫星图标路径 const imageUrl = '/src/assets/imgs/satellite.png' // 卫星图标路径
const satelliteNum = 1 // 添加卫星数量 const satelliteNum = 10 // 添加卫星数量
const isTrueOrbit = true // 是否使用真实轨道数据
const activeSatellite = ref(1) const activeSatellite = ref(1)
// ---------- 所有卫星实体集合(用于全局点击事件) ---------- // ---------- 所有卫星实体集合(用于全局点击事件) ----------
...@@ -43,8 +44,15 @@ const satellites: { ...@@ -43,8 +44,15 @@ const satellites: {
*/ */
async function addSatelliteEntityFromXYZ(name: string, filePath: string) { async function addSatelliteEntityFromXYZ(name: string, filePath: string) {
// 计算轨道数据 // 计算轨道数据
const { positionProperty, orbitPositions, startTime, stopTime } = await computeOrbitFromXYZ(filePath) // 从文件读取轨道 let computeOrbitRes
// const { positionProperty, orbitPositions, startTime, stopTime } = await computeRandomOrbit() // 随机生成轨道 if (isTrueOrbit) {
// 从文件读取轨道()
computeOrbitRes = await computeOrbitFromXYZ(filePath)
} else {
// 随机生成轨道
computeOrbitRes = await computeRandomOrbit()
}
const { positionProperty, orbitPositions, startTime, stopTime } = computeOrbitRes
// ---------- 卫星本体(图标) ---------- // ---------- 卫星本体(图标) ----------
const satelliteEntity = viewer.entities.add({ const satelliteEntity = viewer.entities.add({
...@@ -170,19 +178,26 @@ onMounted(() => { ...@@ -170,19 +178,26 @@ onMounted(() => {
}) })
// ---------- 设置全局时钟范围 ---------- // ---------- 设置全局时钟范围 ----------
const startTime = Cesium.JulianDate.now() const startTime = Cesium.JulianDate.fromDate(new Date('2025-08-01T10:00:00.000Z'))
// const startTime = Cesium.JulianDate.now()
// console.log(startTime);
viewer.clock.startTime = startTime.clone() viewer.clock.startTime = startTime.clone()
viewer.clock.currentTime = startTime.clone() viewer.clock.currentTime = startTime.clone()
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP
viewer.clock.multiplier = 60 // 时间加速倍率(1 秒模拟 60 秒) viewer.clock.multiplier = 1 // 时间加速倍率(1 秒模拟 60 秒)
viewer.clock.shouldAnimate = true viewer.clock.shouldAnimate = true
// ---------- 添加卫星 ---------- // ---------- 添加卫星 ----------
// for (let i = 0;i < satelliteNum; i++) { // 模拟轨道卫星 if (isTrueOrbit) {
// addSatelliteEntityFromXYZ(`satellite${i + 1}`, '') for (let i = 0; i < satelliteNum; i++) {
// } // 真实轨道卫星
for (let i = 0;i < satelliteNum; i++) { // 真实轨道卫星 addSatelliteEntityFromXYZ(`satellite${i + 1}`, `/xyz${i + 1}.txt`)
addSatelliteEntityFromXYZ(`satellite${i + 1}`, '/xyz.txt') }
} else {
for (let i = 0; i < satelliteNum; i++) {
// 模拟轨道卫星
addSatelliteEntityFromXYZ(`satellite${i + 1}`, '')
}
} }
// ---------- 全局点击事件 ---------- // ---------- 全局点击事件 ----------
......
...@@ -28,17 +28,22 @@ export async function computeOrbitFromXYZ(filePath: string): Promise<{ ...@@ -28,17 +28,22 @@ export async function computeOrbitFromXYZ(filePath: string): Promise<{
let startTime: Cesium.JulianDate | null = null let startTime: Cesium.JulianDate | null = null
let stopTime: Cesium.JulianDate | null = null let stopTime: Cesium.JulianDate | null = null
const sampleStep = 60 // 每隔多少秒采样一个点绘制轨道
let lineCount = 0
for (const line of lines) { for (const line of lines) {
lineCount++
if (!line.trim()) continue // 跳过空行 if (!line.trim()) continue // 跳过空行
// 根据时间间隔采样
if (lineCount % sampleStep !== 0) continue
// 找到第一个空格,前面是时间,后面是坐标 // 找到第一个空格,前面是时间,后面是坐标
const firstSpaceIndex = line.indexOf(' ') const firstSpaceIndex = line.indexOf(' ')
if (firstSpaceIndex === -1) continue if (firstSpaceIndex === -1) continue
const timeStr = line.substring(0, firstSpaceIndex).trim() const timeStr = line.substring(0, firstSpaceIndex).trim()
const coordsStr = line.substring(firstSpaceIndex + 1).trim() const coordsStr = line.substring(firstSpaceIndex + 1).trim()
console.log(coordsStr)
// 分割三个坐标 // 分割三个坐标
const coords = coordsStr.split(', ').map((v) => parseFloat(v.trim())) const coords = coordsStr.split(', ').map((v) => parseFloat(v.trim()))
...@@ -71,10 +76,12 @@ export async function computeOrbitFromXYZ(filePath: string): Promise<{ ...@@ -71,10 +76,12 @@ export async function computeOrbitFromXYZ(filePath: string): Promise<{
* 随机生成卫星轨道数据(不依赖 TLE) * 随机生成卫星轨道数据(不依赖 TLE)
* @param numPoints 采样点数量(轨道上取多少个点) * @param numPoints 采样点数量(轨道上取多少个点)
* @param timeStep 每两个采样点之间的时间间隔(秒) * @param timeStep 每两个采样点之间的时间间隔(秒)
* @param sampleStep 每隔多少秒采样一个点绘制轨道(用于 Polyline)
*/ */
export function computeRandomOrbit( export function computeRandomOrbit(
numPoints = 86400, // 与从xyz.txt读取的点数保持一致 numPoints = 86400, // 与从xyz.txt读取的点数保持一致
timeStep = 1 timeStep = 1,
sampleStep = 100 // 每隔 xx 秒采一个点绘制轨道
): { ): {
positionProperty: Cesium.SampledPositionProperty positionProperty: Cesium.SampledPositionProperty
orbitPositions: Cesium.Cartesian3[] orbitPositions: Cesium.Cartesian3[]
...@@ -101,6 +108,11 @@ export function computeRandomOrbit( ...@@ -101,6 +108,11 @@ export function computeRandomOrbit(
const raan = Math.random() * 360 // 升交点赤经 (0~360度) const raan = Math.random() * 360 // 升交点赤经 (0~360度)
for (let i = 0; i < numPoints; i++) { for (let i = 0; i < numPoints; i++) {
// 根据时间间隔采样
if ((i * timeStep) % sampleStep !== 0) {
continue
}
const currentTime = Cesium.JulianDate.addSeconds( const currentTime = Cesium.JulianDate.addSeconds(
startTime, startTime,
i * timeStep, i * timeStep,
...@@ -124,9 +136,10 @@ export function computeRandomOrbit( ...@@ -124,9 +136,10 @@ export function computeRandomOrbit(
pos = Cesium.Matrix3.multiplyByVector(rot, pos, new Cesium.Cartesian3()) pos = Cesium.Matrix3.multiplyByVector(rot, pos, new Cesium.Cartesian3())
// 保存轨道点 // 保存轨道点到 positionProperty
orbitPositions.push(pos)
positionProperty.addSample(currentTime, pos) positionProperty.addSample(currentTime, pos)
orbitPositions.push(pos)
} }
return { positionProperty, orbitPositions, startTime, stopTime } return { positionProperty, orbitPositions, startTime, stopTime }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment