kbe3d-satellite 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/README.md +37 -0
- package/dist/dts/index.d.ts +567 -0
- package/dist/kbe3d-satellite.js +1 -0
- package/dist/stats.html +4950 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# KBSatellite
|
|
2
|
+
|
|
3
|
+
`KBSatellite` 是一个专为三维地球场景设计的卫星态势感知工具库。它深度整合了业界知名的 `satellite.js` 与 `tle.js`,将复杂的轨道力学计算与友好的开发体验完美融合,为开发者提供了一站式的卫星数据解决方案。
|
|
4
|
+
|
|
5
|
+
## ✨ 核心特性
|
|
6
|
+
|
|
7
|
+
- 极致便捷的 API:
|
|
8
|
+
告别繁琐的底层调用。我们封装了从 TLE/OMM 解析、轨道传播到坐标转换的全流程,让你只需几行代码,即可快速获取卫星的位置、轨迹与可视性信息。
|
|
9
|
+
|
|
10
|
+
- 双核驱动,能力倍增:
|
|
11
|
+
底层融合 satellite.js 精准的 SGP4/SDP4 算法与 tle.js 简洁的数据处理能力。这不仅确保了轨道计算的准确性,更大幅提升了在实时应用中的开发效率。
|
|
12
|
+
|
|
13
|
+
- 专为三维场景优化:
|
|
14
|
+
KBSatellite 在设计之初就考虑与三维地球引擎(如 CesiumJS)的协同工作。其输出数据格式与坐标系统完美适配三维渲染需求,让你能更专注于构建震撼的卫星可视化效果。
|
package/dist/README.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# KBSatellite
|
|
2
|
+
|
|
3
|
+
`KBSatellite` 是一个专为三维地球场景设计的卫星态势感知工具库。它深度整合了业界知名的 `satellite.js` 与 `tle.js`,将复杂的轨道力学计算与友好的开发体验完美融合,为开发者提供了一站式的卫星数据解决方案。
|
|
4
|
+
|
|
5
|
+
## ✨ 核心特性
|
|
6
|
+
|
|
7
|
+
- 极致便捷的 API:
|
|
8
|
+
告别繁琐的底层调用。我们封装了从 TLE/OMM 解析、轨道传播到坐标转换的全流程,让你只需几行代码,即可快速获取卫星的位置、轨迹与可视性信息。
|
|
9
|
+
|
|
10
|
+
- 双核驱动,能力倍增:
|
|
11
|
+
底层融合 satellite.js 精准的 SGP4/SDP4 算法与 tle.js 简洁的数据处理能力。这不仅确保了轨道计算的准确性,更大幅提升了在实时应用中的开发效率。
|
|
12
|
+
|
|
13
|
+
- 专为三维场景优化:
|
|
14
|
+
KBSatellite 在设计之初就考虑与三维地球引擎(如 CesiumJS)的协同工作。其输出数据格式与坐标系统完美适配三维渲染需求,让你能更专注于构建震撼的卫星可视化效果。
|
|
15
|
+
|
|
16
|
+
# 变更日志
|
|
17
|
+
|
|
18
|
+
## 2026年3月18日
|
|
19
|
+
|
|
20
|
+
### Features 新增
|
|
21
|
+
|
|
22
|
+
- 无
|
|
23
|
+
|
|
24
|
+
### Breaking Changes 破坏性变更
|
|
25
|
+
|
|
26
|
+
- 无
|
|
27
|
+
|
|
28
|
+
### Optimize 改进优化
|
|
29
|
+
|
|
30
|
+
- 无
|
|
31
|
+
|
|
32
|
+
### Bug Fix 错误修复
|
|
33
|
+
|
|
34
|
+
- 无
|
|
35
|
+
|
|
36
|
+
# 最终构建时间
|
|
37
|
+
2026/3/22 17:11:02
|
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
import * as _satellitejs from 'satellite.js';
|
|
2
|
+
import * as _tlejs from 'tle.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 获取完整的OMM(Orbital Mean Elements Message)对象,验证必要字段并补充默认值
|
|
6
|
+
*
|
|
7
|
+
* @param input 包含轨道要素信息的内部OMM输入对象
|
|
8
|
+
* @returns 返回包含所有必需和可选字段的完整OMM对象
|
|
9
|
+
*/
|
|
10
|
+
export declare function getFullOmm(input: OMMInput): _satellitejs.OMMJsonObject;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 通过半长轴计算平均运动,即一天转多少圈
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* 基于开普勒第三定律,从轨道半长轴推导平均运动。
|
|
17
|
+
* 平均运动描述了卫星绕地球飞行的角速度。
|
|
18
|
+
*
|
|
19
|
+
* @param semimajor - 轨道半长轴(单位:米)
|
|
20
|
+
* @returns 包含弧度/秒和圈/天两种单位的平均运动结果
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const result = getMeanMotion(7.0e6);
|
|
25
|
+
* console.log(result.revPerDay); // 14.12 圈/天
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function getMeanMotion(semimajor: number): MeanMotionResult;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 计算给定时间与指定历元之间相差的分钟数
|
|
32
|
+
* @param currentTimestamp 当前时间戳
|
|
33
|
+
* @param epochTimestamp 历元时间戳
|
|
34
|
+
* @returns 返回当前时间与历元时间之间相差的分钟数
|
|
35
|
+
*/
|
|
36
|
+
export declare function getMinutesSinceEpoch(currentTimestamp: number, epochTimestamp: number): number;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 根据半长轴计算运行周期(卫星绕地球一圈所需的时间)
|
|
40
|
+
* @param semimajor - 半长轴(单位:米)
|
|
41
|
+
* @returns 卫星绕地球一圈所需的时间(单位:秒)
|
|
42
|
+
*/
|
|
43
|
+
export declare function getPeriod(semimajor: number): number;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 通过平均运动(一天转多少圈)来计算半长轴
|
|
47
|
+
*
|
|
48
|
+
* @remarks
|
|
49
|
+
* 开普勒第三定律的逆运算,从平均运动推导轨道半长轴。
|
|
50
|
+
* 平均运动需以圈/天为单位。
|
|
51
|
+
*
|
|
52
|
+
* @param MEAN_MOTION_nRevPerDay - 平均运动MEAN_MOTION(单位:圈/天)
|
|
53
|
+
* @returns 轨道半长轴(单位:米)
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const a = getSemiMajorAxis(14.12);
|
|
58
|
+
* console.log(a / 1000); // 7000 km
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare function getSemiMajorAxis(MEAN_MOTION_nRevPerDay: number): number;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* 开普勒根数(六根数) + 历元时刻普通字符串格式
|
|
65
|
+
*/
|
|
66
|
+
export declare interface KeplerElements {
|
|
67
|
+
/**
|
|
68
|
+
* 历元时间
|
|
69
|
+
* @remarks UTC0的时间字符串`YYYY-MM-DD HH:mm:ss.SSS`
|
|
70
|
+
* @example "2026-03-18 05:19:34.116"
|
|
71
|
+
*/
|
|
72
|
+
epoch: string;
|
|
73
|
+
/**
|
|
74
|
+
* 近地点幅角
|
|
75
|
+
* @remarks 从升交点沿运动方向量到近地点的角度
|
|
76
|
+
* @unit 度
|
|
77
|
+
* @range 0° ~ 360°
|
|
78
|
+
*/
|
|
79
|
+
argPerigee: number;
|
|
80
|
+
/**
|
|
81
|
+
* 偏心率
|
|
82
|
+
* @remarks 轨道形状,0表示正圆,0-1之间为椭圆
|
|
83
|
+
* @range 0 ≤ e < 1
|
|
84
|
+
*/
|
|
85
|
+
eccentricity: number;
|
|
86
|
+
/**
|
|
87
|
+
* 轨道倾角
|
|
88
|
+
* @remarks 轨道平面与地球赤道平面的夹角
|
|
89
|
+
* @unit 度
|
|
90
|
+
* @range 0° ~ 180°(0°=赤道轨道,90°=极轨,>90°=逆行轨道)
|
|
91
|
+
*/
|
|
92
|
+
inclination: number;
|
|
93
|
+
/**
|
|
94
|
+
* 平近点角
|
|
95
|
+
* @remarks 假想的匀速运动角度,用于描述卫星在轨道上的位置
|
|
96
|
+
* @unit 度
|
|
97
|
+
* @range 0° ~ 360°
|
|
98
|
+
*/
|
|
99
|
+
meanAnomaly: number;
|
|
100
|
+
/**
|
|
101
|
+
* 升交点赤经
|
|
102
|
+
* @remarks 从春分点向东量到升交点的角度,决定轨道面在空间中的指向
|
|
103
|
+
* @unit 度
|
|
104
|
+
* @range 0° ~ 360°
|
|
105
|
+
*/
|
|
106
|
+
raan: number;
|
|
107
|
+
/**
|
|
108
|
+
* 半长轴
|
|
109
|
+
* @remarks 轨道椭圆长轴的一半,决定轨道大小和周期
|
|
110
|
+
* @unit 米(m)
|
|
111
|
+
*/
|
|
112
|
+
semimajorAxis: number;
|
|
113
|
+
/**
|
|
114
|
+
* 其他强制重写参数
|
|
115
|
+
*/
|
|
116
|
+
OMMInputForce?: OMMInput;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 平均运动计算结果
|
|
121
|
+
*/
|
|
122
|
+
export declare interface MeanMotionResult {
|
|
123
|
+
/** 平均运动(弧度/秒) */
|
|
124
|
+
radPerSec: number;
|
|
125
|
+
/** 平均运动(圈/天) */
|
|
126
|
+
revPerDay: number;
|
|
127
|
+
/** 平均运动(圈/天)- 保留两位小数的格式化值 */
|
|
128
|
+
revPerDayFormatted: number;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* OMM 输入参数 - ^[satellite.js标准]
|
|
133
|
+
*/
|
|
134
|
+
export declare interface OMMInput {
|
|
135
|
+
/**
|
|
136
|
+
* 历元时间(ISO8601格式,必须是UTC0的时间)
|
|
137
|
+
* @remarks 必须提供,格式示例:'2025-03-26T05:19:34.116Z'
|
|
138
|
+
*/
|
|
139
|
+
EPOCH: string;
|
|
140
|
+
/**
|
|
141
|
+
* 平均运动
|
|
142
|
+
* @remarks 单位:圈/天
|
|
143
|
+
*/
|
|
144
|
+
MEAN_MOTION: number;
|
|
145
|
+
/**
|
|
146
|
+
* 离心率
|
|
147
|
+
* @remarks 取值范围:0 ≤ e < 1
|
|
148
|
+
*/
|
|
149
|
+
ECCENTRICITY: number;
|
|
150
|
+
/**
|
|
151
|
+
* 轨道倾角
|
|
152
|
+
* @remarks 单位:度,取值范围:0° ~ 180°
|
|
153
|
+
*/
|
|
154
|
+
INCLINATION: number;
|
|
155
|
+
/**
|
|
156
|
+
* 升交点赤经
|
|
157
|
+
* @remarks 单位:度,取值范围:0° ~ 360°
|
|
158
|
+
*/
|
|
159
|
+
RA_OF_ASC_NODE: number;
|
|
160
|
+
/**
|
|
161
|
+
* 近地点幅角
|
|
162
|
+
* @remarks 单位:度,取值范围:0° ~ 360°
|
|
163
|
+
*/
|
|
164
|
+
ARG_OF_PERICENTER: number;
|
|
165
|
+
/**
|
|
166
|
+
* 平近点角
|
|
167
|
+
* @remarks 单位:度,取值范围:0° ~ 360°
|
|
168
|
+
*/
|
|
169
|
+
MEAN_ANOMALY: number;
|
|
170
|
+
/**
|
|
171
|
+
* 星历类型
|
|
172
|
+
* @defaultValue 0
|
|
173
|
+
* @remarks 0 = SGP4/SDP4 模型
|
|
174
|
+
*/
|
|
175
|
+
EPHEMERIS_TYPE?: number;
|
|
176
|
+
/**
|
|
177
|
+
* 弹道系数 B*
|
|
178
|
+
* @defaultValue 0.00048021
|
|
179
|
+
* @remarks 大气阻力参数,单位:1/地球半径
|
|
180
|
+
*/
|
|
181
|
+
BSTAR?: number;
|
|
182
|
+
/**
|
|
183
|
+
* 平均运动一阶导数
|
|
184
|
+
* @defaultValue 0.00005995
|
|
185
|
+
* @remarks 单位:圈/天²
|
|
186
|
+
*/
|
|
187
|
+
MEAN_MOTION_DOT?: number;
|
|
188
|
+
/**
|
|
189
|
+
* 平均运动二阶导数
|
|
190
|
+
* @defaultValue 0
|
|
191
|
+
* @remarks 单位:圈/天³
|
|
192
|
+
*/
|
|
193
|
+
MEAN_MOTION_DDOT?: number;
|
|
194
|
+
/**
|
|
195
|
+
* 分类类型
|
|
196
|
+
* @defaultValue "U"
|
|
197
|
+
* @remarks U = Unclassified(非机密)
|
|
198
|
+
*/
|
|
199
|
+
CLASSIFICATION_TYPE?: string;
|
|
200
|
+
/**
|
|
201
|
+
* NORAD卫星编号
|
|
202
|
+
* @defaultValue 99999
|
|
203
|
+
*/
|
|
204
|
+
NORAD_CAT_ID?: number;
|
|
205
|
+
/**
|
|
206
|
+
* 根数集编号
|
|
207
|
+
* @defaultValue 999
|
|
208
|
+
*/
|
|
209
|
+
ELEMENT_SET_NO?: number;
|
|
210
|
+
/**
|
|
211
|
+
* 历元时刻累计圈数
|
|
212
|
+
* @defaultValue 999
|
|
213
|
+
*/
|
|
214
|
+
REV_AT_EPOCH?: number;
|
|
215
|
+
/**
|
|
216
|
+
* 卫星名称
|
|
217
|
+
* @defaultValue "999"
|
|
218
|
+
*/
|
|
219
|
+
OBJECT_NAME?: string;
|
|
220
|
+
/**
|
|
221
|
+
* 国际标识符
|
|
222
|
+
* @defaultValue "999"
|
|
223
|
+
* @remarks 格式:YYYY-NNN-P,如 "2004-049A"
|
|
224
|
+
*/
|
|
225
|
+
OBJECT_ID?: string;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* 轨道外推配置选项
|
|
230
|
+
*
|
|
231
|
+
* @remarks
|
|
232
|
+
* 用于控制轨道传播计算的行为和性能选项
|
|
233
|
+
*/
|
|
234
|
+
export declare interface OrbitPropagatorConfig {
|
|
235
|
+
/**
|
|
236
|
+
* 是否获取详细信息
|
|
237
|
+
*
|
|
238
|
+
* @remarks
|
|
239
|
+
* 设置为 true 时,将返回包含中间计算结果、精度指标等详细数据.
|
|
240
|
+
* 设置为 false 时,仅返回time和基础的地惯系位置positionEci.
|
|
241
|
+
* 开启此选项会增加计算开销和返回数据量.
|
|
242
|
+
*
|
|
243
|
+
* @defaultValue false
|
|
244
|
+
*/
|
|
245
|
+
isGetDetails?: boolean;
|
|
246
|
+
/**
|
|
247
|
+
* 是否启用GPU加速
|
|
248
|
+
*
|
|
249
|
+
* @remarks
|
|
250
|
+
* 设置为 true 时,将使用GPU进行计算;
|
|
251
|
+
*
|
|
252
|
+
* @defaultValue false
|
|
253
|
+
*/
|
|
254
|
+
isUseGPU?: boolean;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* 单颗卫星的输入数据
|
|
259
|
+
*/
|
|
260
|
+
export declare interface OrbitPropagatorLiveParams {
|
|
261
|
+
/** 卫星唯一标识 */
|
|
262
|
+
id: string;
|
|
263
|
+
/** 轨道数据:TLE数组 或 开普勒六根数 */
|
|
264
|
+
kepler: string[] | KeplerElements;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* 卫星实时位置结果
|
|
269
|
+
*/
|
|
270
|
+
export declare type OrbitPropagatorLiveResult = Map<any, OrbitPropagatorResult>;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* 卫星轨道传播配置
|
|
274
|
+
*/
|
|
275
|
+
export declare interface OrbitPropagatorParams {
|
|
276
|
+
/**
|
|
277
|
+
* 开始时间
|
|
278
|
+
* @remarks 轨道传播的起始时刻
|
|
279
|
+
* @unit UTC0的时间字符串`YYYY-MM-DD HH:mm:ss.SSS`
|
|
280
|
+
* @example "2026-03-18 05:19:34.116"
|
|
281
|
+
*/
|
|
282
|
+
startTime: string;
|
|
283
|
+
/**
|
|
284
|
+
* 结束时间
|
|
285
|
+
* @remarks 轨道传播的结束时刻
|
|
286
|
+
* @unit UTC0的时间字符串`YYYY-MM-DD HH:mm:ss.SSS`
|
|
287
|
+
* @example "2026-03-18 05:19:34.116"
|
|
288
|
+
*/
|
|
289
|
+
stopTime: string;
|
|
290
|
+
/**
|
|
291
|
+
* 传播步长
|
|
292
|
+
* @remarks 轨道计算的时间间隔
|
|
293
|
+
* @defaultValue 60
|
|
294
|
+
* @unit 秒
|
|
295
|
+
*/
|
|
296
|
+
step: number;
|
|
297
|
+
/**
|
|
298
|
+
* 开普勒轨道根数或两行根数
|
|
299
|
+
* @remarks 卫星轨道的六根数配置或两行根数
|
|
300
|
+
*/
|
|
301
|
+
kepler: string[] | KeplerElements;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* 轨道传播计算结果
|
|
306
|
+
*
|
|
307
|
+
* @remarks
|
|
308
|
+
* 包含卫星在指定时刻的多种坐标系下的位置、速度信息,
|
|
309
|
+
* 以及转换后的大地坐标(经纬度、高度)。
|
|
310
|
+
* 所有位置和速度数据均为同一时刻的计算结果。
|
|
311
|
+
*/
|
|
312
|
+
export declare interface OrbitPropagatorResult {
|
|
313
|
+
/**
|
|
314
|
+
* 计算结果对应的UTC时间
|
|
315
|
+
*
|
|
316
|
+
* @remarks
|
|
317
|
+
* ISO 8601 格式的UTC时间字符串,精确到毫秒
|
|
318
|
+
*
|
|
319
|
+
* @example "2025-03-26T05:19:34.116Z"
|
|
320
|
+
*/
|
|
321
|
+
time: string;
|
|
322
|
+
/**
|
|
323
|
+
* 地心惯性坐标系下的位置
|
|
324
|
+
*
|
|
325
|
+
* @remarks
|
|
326
|
+
* ECI坐标系,不随地球自转,是SGP4/SDP4模型的原始输出
|
|
327
|
+
*
|
|
328
|
+
* @unit 公里 (km)
|
|
329
|
+
*/
|
|
330
|
+
positionEci: _satellitejs.EciVec3<number>;
|
|
331
|
+
/**
|
|
332
|
+
* 地心地固坐标系下的位置 - ^[当方法传入`isGetDetails`参数为`true`时返回]
|
|
333
|
+
*
|
|
334
|
+
* @remarks
|
|
335
|
+
* ECF坐标系,随地球自转,适用于地面观测、多普勒计算等
|
|
336
|
+
*
|
|
337
|
+
* @unit 公里 (km)
|
|
338
|
+
*/
|
|
339
|
+
positionEcf?: _satellitejs.EciVec3<number>;
|
|
340
|
+
/**
|
|
341
|
+
* 地心惯性坐标系下的速度 - ^[当方法传入`isGetDetails`参数为`true`时返回]
|
|
342
|
+
*
|
|
343
|
+
* @remarks
|
|
344
|
+
* ECI坐标系下的速度矢量,为SGP4/SDP4模型的原始输出
|
|
345
|
+
*
|
|
346
|
+
* @unit 公里/秒 (km/s)
|
|
347
|
+
*/
|
|
348
|
+
velocityEci?: _satellitejs.EciVec3<number>;
|
|
349
|
+
/**
|
|
350
|
+
* 地心地固坐标系下的速度 - ^[当方法传入`isGetDetails`参数为`true`时返回]
|
|
351
|
+
*
|
|
352
|
+
* @remarks
|
|
353
|
+
* ECF坐标系下的速度矢量,由ECI速度转换得到,
|
|
354
|
+
* 包含了地球自转的影响,常用于多普勒频移计算
|
|
355
|
+
*
|
|
356
|
+
* @unit 公里/秒 (km/s)
|
|
357
|
+
*/
|
|
358
|
+
velocityEcf?: _satellitejs.EciVec3<number>;
|
|
359
|
+
/**
|
|
360
|
+
* 大地坐标(经纬度、高度) - ^[当方法传入`isGetDetails`参数为`true`时返回]
|
|
361
|
+
*
|
|
362
|
+
* @remarks
|
|
363
|
+
* 由ECI位置转换得到的地面投影坐标
|
|
364
|
+
*/
|
|
365
|
+
position?: {
|
|
366
|
+
/**
|
|
367
|
+
* 纬度
|
|
368
|
+
*
|
|
369
|
+
* @remarks
|
|
370
|
+
* 北纬为正,南纬为负
|
|
371
|
+
*
|
|
372
|
+
* @unit 度 (°)
|
|
373
|
+
* @range -90° ~ 90°
|
|
374
|
+
*/
|
|
375
|
+
lat: number;
|
|
376
|
+
/**
|
|
377
|
+
* 经度
|
|
378
|
+
*
|
|
379
|
+
* @remarks
|
|
380
|
+
* 东经为正,西经为负
|
|
381
|
+
*
|
|
382
|
+
* @unit 度 (°)
|
|
383
|
+
* @range -180° ~ 180°
|
|
384
|
+
*/
|
|
385
|
+
lng: number;
|
|
386
|
+
/**
|
|
387
|
+
* 高度
|
|
388
|
+
*
|
|
389
|
+
* @remarks
|
|
390
|
+
* 相对于WGS84椭球面的高度
|
|
391
|
+
*
|
|
392
|
+
* @unit 米 (m)
|
|
393
|
+
*/
|
|
394
|
+
alt: number;
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* GPU 实时轨道外推控制器接口
|
|
400
|
+
*
|
|
401
|
+
* @remarks
|
|
402
|
+
* 用于管理多颗卫星的 GPU 批量计算,提供更新位置、获取位置、资源清理等功能。
|
|
403
|
+
* 由外部调用 update 方法触发计算,不与 Cesium 时钟绑定,适合与任意定时器或动画循环配合使用。
|
|
404
|
+
*/
|
|
405
|
+
export declare interface PropagatorLiveController {
|
|
406
|
+
/**
|
|
407
|
+
* 清理所有 GPU 资源
|
|
408
|
+
*
|
|
409
|
+
* @remarks
|
|
410
|
+
* 调用后会释放 GPU 显存中注册的卫星常量集,并清空内部缓存。
|
|
411
|
+
* 调用后控制器将不可再使用,需要重新创建实例。
|
|
412
|
+
*
|
|
413
|
+
* @returns Promise,在资源释放完成后 resolve
|
|
414
|
+
*
|
|
415
|
+
* @example
|
|
416
|
+
* ```typescript
|
|
417
|
+
* await controller.dispose();
|
|
418
|
+
* ```
|
|
419
|
+
*/
|
|
420
|
+
dispose: () => Promise<void>;
|
|
421
|
+
/**
|
|
422
|
+
* 检查当前是否有计算任务正在进行
|
|
423
|
+
*
|
|
424
|
+
* @remarks
|
|
425
|
+
* 用于避免在上一帧计算未完成时发起新的更新请求。
|
|
426
|
+
*
|
|
427
|
+
* @returns 正在计算中返回 true,否则返回 false
|
|
428
|
+
*/
|
|
429
|
+
isProcessing: () => boolean;
|
|
430
|
+
/**
|
|
431
|
+
* 检查是否已成功初始化 GPU 资源
|
|
432
|
+
*
|
|
433
|
+
* @returns 已初始化返回 true,否则返回 false
|
|
434
|
+
*/
|
|
435
|
+
isInitialized: () => boolean;
|
|
436
|
+
/**
|
|
437
|
+
* 获取当前所有卫星的位置缓存
|
|
438
|
+
*
|
|
439
|
+
* @remarks
|
|
440
|
+
* 返回的是最新一次 update 成功后的位置数据。
|
|
441
|
+
* 返回的 Map 键为卫星 id,值为对应的轨道传播结果。
|
|
442
|
+
*
|
|
443
|
+
* @returns 卫星位置 Map,键为 id,值为 OrbitPropagatorResult
|
|
444
|
+
*
|
|
445
|
+
* @example
|
|
446
|
+
* ```typescript
|
|
447
|
+
* const positions = controller.getCurrentPositions();
|
|
448
|
+
* for (const [id, pos] of positions) {
|
|
449
|
+
* console.log(`卫星 ${id}:`, pos.positionEci);
|
|
450
|
+
* }
|
|
451
|
+
* ```
|
|
452
|
+
*/
|
|
453
|
+
getCurrentPositions: () => Map<any, OrbitPropagatorResult>;
|
|
454
|
+
/**
|
|
455
|
+
* 获取指定卫星的最新位置
|
|
456
|
+
*
|
|
457
|
+
* @param id - 卫星唯一标识
|
|
458
|
+
* @returns 卫星位置结果,如果未找到或尚未计算则返回 undefined
|
|
459
|
+
*/
|
|
460
|
+
getPosition: (id: any) => OrbitPropagatorResult | undefined;
|
|
461
|
+
/**
|
|
462
|
+
* 更新所有卫星的位置
|
|
463
|
+
*
|
|
464
|
+
* @remarks
|
|
465
|
+
* 基于当前时间戳,批量计算所有卫星的实时位置。
|
|
466
|
+
* 计算在 GPU 上并行执行,结果会更新到内部缓存中。
|
|
467
|
+
*
|
|
468
|
+
* @param currentTimestamp - 当前时间戳(毫秒,UTC)
|
|
469
|
+
* @returns Promise,返回更新后的位置 Map,如果更新失败则返回 undefined
|
|
470
|
+
*
|
|
471
|
+
* @example
|
|
472
|
+
* ```typescript
|
|
473
|
+
* // 在 Cesium 的 preRender 事件中调用
|
|
474
|
+
* viewer.scene.preRender.addEventListener(() => {
|
|
475
|
+
* const now = Date.now();
|
|
476
|
+
* controller.update(now).then(positions => {
|
|
477
|
+
* if (positions) {
|
|
478
|
+
* // 更新 Cesium 中的点
|
|
479
|
+
* }
|
|
480
|
+
* });
|
|
481
|
+
* });
|
|
482
|
+
* ```
|
|
483
|
+
*/
|
|
484
|
+
update: (currentTimestamp: number) => Promise<Map<any, OrbitPropagatorResult> | undefined>;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
export { _satellitejs }
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* SGP4轨道外推函数,用于计算卫星在指定时间段内的位置和速度
|
|
491
|
+
* 根据输入的轨道参数(TLE或开普勒元素),计算卫星在不同时刻的位置和速度信息
|
|
492
|
+
*
|
|
493
|
+
* @param params 轨道外推参数对象,包含以下属性:
|
|
494
|
+
* - kepler: 开普勒轨道要素或两行轨道要素(TLE),用于定义卫星轨道
|
|
495
|
+
* - startTime: 计算开始时间(UTC时间字符串)
|
|
496
|
+
* - stopTime: 计算结束时间(UTC时间字符串)
|
|
497
|
+
* - step: 时间步长(以秒为单位),决定计算密度
|
|
498
|
+
*
|
|
499
|
+
* @param config 其他配置参数,包含以下属性:
|
|
500
|
+
* - isGetDetails: 是否获取更多详细信息,默认为false
|
|
501
|
+
* - isUseGPU: 是否使用GPU计算,默认为false
|
|
502
|
+
*
|
|
503
|
+
* @returns 返回一个对象,包含:
|
|
504
|
+
* - satrec: 解析后的卫星记录对象,包含轨道参数
|
|
505
|
+
* - result: 包含时间、ECF坐标、ECI坐标、速度和地理坐标的数组
|
|
506
|
+
* 每个结果项包含:
|
|
507
|
+
* - time: 对应时刻的ISO格式时间戳
|
|
508
|
+
* - positionEcf: 地固坐标系中的位置向量
|
|
509
|
+
* - positionEci: 惯性坐标系中的位置向量
|
|
510
|
+
* - velocityEci: 惯性坐标系中的速度向量
|
|
511
|
+
* - position: 地理坐标(纬度、经度、高度)
|
|
512
|
+
*/
|
|
513
|
+
export declare function sgp4Orbit(params: OrbitPropagatorParams, config?: OrbitPropagatorConfig): Promise<OrbitPropagatorResult[] | undefined>;
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* SGP4轨道预测实时处理器 - 使用GPU加速批量计算多个卫星的位置
|
|
517
|
+
*
|
|
518
|
+
* @param params - 轨道外推实时参数数组,包含卫星ID和开普勒要素或TLE数据
|
|
519
|
+
* @param config - 轨道外推配置选项,默认为{isGetDetails: false}
|
|
520
|
+
* - isGetDetails: 是否获取详细信息(包括速度、地心固定坐标等)
|
|
521
|
+
* - isUseGPU: 是否使用GPU计算,默认为false
|
|
522
|
+
* @returns 返回一个对象,包含以下方法:
|
|
523
|
+
* - dispose: 清理所有资源
|
|
524
|
+
* - isProcessing: 检查是否有计算任务进行中
|
|
525
|
+
* - isInitialized: 检查是否已初始化
|
|
526
|
+
* - getCurrentPositions: 获取当前所有卫星位置
|
|
527
|
+
* - getPosition: 获取指定卫星位置
|
|
528
|
+
* - update: 更新所有卫星位置
|
|
529
|
+
*/
|
|
530
|
+
export declare function sgp4OrbitLive(params: OrbitPropagatorLiveParams[], config?: OrbitPropagatorConfig): Promise<PropagatorLiveController | undefined>;
|
|
531
|
+
|
|
532
|
+
export { _tlejs }
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* 从 KeplerElements 生成 TLE 行
|
|
536
|
+
*/
|
|
537
|
+
export declare function transKeplerToTle(kepler: KeplerElements): {
|
|
538
|
+
line1: string;
|
|
539
|
+
line2: string;
|
|
540
|
+
checksum1: number;
|
|
541
|
+
checksum2: number;
|
|
542
|
+
omm: _satellitejs.OMMJsonObjectV3;
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* 将OMM格式对象转换为TLE格式
|
|
547
|
+
* @param input - OMM输入对象
|
|
548
|
+
* @returns TLE两行字符串及校验和
|
|
549
|
+
*/
|
|
550
|
+
export declare function transOmmToTle(input: OMMInput): {
|
|
551
|
+
line1: string;
|
|
552
|
+
line2: string;
|
|
553
|
+
checksum1: number;
|
|
554
|
+
checksum2: number;
|
|
555
|
+
omm: _satellitejs.OMMJsonObjectV3;
|
|
556
|
+
};
|
|
557
|
+
|
|
558
|
+
/**
|
|
559
|
+
* 将TLE(Two-Line Element)格式数据转换为OMM(Orbital Mean Elements Message)格式对象
|
|
560
|
+
*
|
|
561
|
+
* @param tle 包含两行TLE数据的字符串数组,第一行为TLE第一行,第二行为TLE第二行
|
|
562
|
+
* @param options 额外的选项配置对象,将合并到输出的OMM对象中
|
|
563
|
+
* @returns 返回一个符合OMMInput接口要求的对象,包含了轨道要素信息
|
|
564
|
+
*/
|
|
565
|
+
export declare function transTleToOmm(tle: string[], options?: Record<string, any>): Required<OMMInput>;
|
|
566
|
+
|
|
567
|
+
export { }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import*as e from"satellite.js";import*as t from"tle.js";import n,{GpuPropagator as i,WasmElements as r,WasmConstants as o,WasmGpuConsts as s}from"sgp4.gl";import a from"sgp4.gl/wasm?url";function c(e){return e&&Array.isArray(e)}function l(e,t,n){const i=["[KBSatellite warn]: “"+(c(t)?t[0]:t)+"”.",...c(t)?t.slice(1):[],n?.message];if(console.warn(...i),"THROW"===e&&n)throw n}function E(e){const t=["[KBSatellite Info]: “"+(c(e)?e[0]:e)+"”.",...c(e)?e.slice(1):[]];console.log(...t)}const T=0,_=48021e-8,g=5995e-8,O=0,u="U",N=99999,A=9999,p=99999,f="99999",m="99999";function I(e){const t=Math.sqrt(3986004418e5/e**3),n=86400/(2*Math.PI)*t;return{radPerSec:t,revPerDay:n,revPerDayFormatted:Math.round(100*n)/100}}function h(e){const t=2*e*Math.PI/86400;return Number(((3986004418e5/t**2)**(1/3)).toFixed(4))}function d(e){const t=e/1e3;return Math.sqrt(t**3*4*Math.PI**2/398600.4418)}function C(e){const t=["EPOCH","MEAN_MOTION","ECCENTRICITY","INCLINATION","RA_OF_ASC_NODE","ARG_OF_PERICENTER","MEAN_ANOMALY"].filter(t=>void 0===e[t]);t.length>0&&l("THROW","缺少必要字段: "+t.join(", "),new Error("缺少必要字段: "+t.join(", ")));return{EPOCH:e.EPOCH,MEAN_MOTION:e.MEAN_MOTION,ECCENTRICITY:e.ECCENTRICITY,INCLINATION:e.INCLINATION,RA_OF_ASC_NODE:e.RA_OF_ASC_NODE,ARG_OF_PERICENTER:e.ARG_OF_PERICENTER,MEAN_ANOMALY:e.MEAN_ANOMALY,EPHEMERIS_TYPE:e.EPHEMERIS_TYPE??T,BSTAR:e.BSTAR??_,MEAN_MOTION_DOT:e.MEAN_MOTION_DOT??g,MEAN_MOTION_DDOT:e.MEAN_MOTION_DDOT??O,CLASSIFICATION_TYPE:e.CLASSIFICATION_TYPE??u,NORAD_CAT_ID:e.NORAD_CAT_ID??N,ELEMENT_SET_NO:e.ELEMENT_SET_NO??A,REV_AT_EPOCH:e.REV_AT_EPOCH??p,OBJECT_NAME:e.OBJECT_NAME??f,OBJECT_ID:e.OBJECT_ID??m}}function M(e,t){return(e-t)/60/1e3}function w(e,n={}){const[i,r]=e;if(69!=i.length||69!=r.length)throw new Error("TLE 格式不正确,长度必须等于69");let o;try{o=t.parseTLE([i,r])}catch(I){l("THROW",["TLE 解析失败:\n",i+"\n",r+"\n"],I)}const s=t.getCatalogNumber(o,!0),a=t.getClassification(o,!0)||"U",c=t.getEpochTimestamp(o),E=new Date(c).toISOString(),T=t.getFirstTimeDerivative(o,!0),_=t.getSecondTimeDerivative(o,!0),g=10*t.getBstarDrag(o,!0),O=Number.parseInt(i.substring(62,63).trim()||"0"),u=t.getTleSetNumber(o,!0),N=t.getInclination(o,!0),A=t.getRightAscension(o,!0),p=t.getEccentricity(o,!0),f=t.getPerigee(o,!0),m=t.getMeanAnomaly(o,!0);return{EPOCH:E,MEAN_MOTION:t.getMeanMotion(o,!0),ECCENTRICITY:p,INCLINATION:N,RA_OF_ASC_NODE:A,ARG_OF_PERICENTER:f,MEAN_ANOMALY:m,NORAD_CAT_ID:s,EPHEMERIS_TYPE:O,BSTAR:g,MEAN_MOTION_DOT:T,MEAN_MOTION_DDOT:_,CLASSIFICATION_TYPE:a,ELEMENT_SET_NO:u,REV_AT_EPOCH:t.getRevNumberAtEpoch(o,!0),OBJECT_NAME:n?.OBJECT_NAME??"99999",OBJECT_ID:n?.OBJECT_ID??"99999",...n}}function S(e){const t=C(e),n=new Date(t.EPOCH),i=n.getUTCFullYear().toString().slice(-2).padStart(2,"0"),r=new Date(Date.UTC(n.getUTCFullYear(),0,1)),o=((n.getTime()-r.getTime())/864e5+1).toFixed(8).padStart(12,"0");let s="1 "+t.NORAD_CAT_ID.toString().padStart(5," ");s+=t.CLASSIFICATION_TYPE,s+=" "+(t.OBJECT_ID?.padEnd(8," ")||"00000AAA "),s+=" "+i+o;const a=t.MEAN_MOTION_DOT;s+=" "+Number(a).toFixed(8).padStart(9,"0");const c=t.MEAN_MOTION_DDOT;s+=" "+y(Number(c),5);s+=" "+y(Number(t.BSTAR),5),s+=" "+t.EPHEMERIS_TYPE,s+=" "+t.ELEMENT_SET_NO.toString().padStart(4," ");const l=P(s);s+=l;let E="2 "+t.NORAD_CAT_ID.toString().padStart(5," ");E+=" "+Number(t.INCLINATION).toFixed(4).padStart(8," "),E+=" "+Number(t.RA_OF_ASC_NODE).toFixed(4).padStart(8," ");E+=" "+Math.abs(Number(t.ECCENTRICITY)).toFixed(7).slice(2).padStart(7,"0"),E+=" "+Number(t.ARG_OF_PERICENTER).toFixed(4).padStart(8," "),E+=" "+Number(t.MEAN_ANOMALY).toFixed(4).padStart(8," ");E+=" "+Number(t.MEAN_MOTION).toFixed(8).padStart(11,"0");E+=Number(t.REV_AT_EPOCH).toString().padStart(5," ");const T=P(E);return E+=T,{line1:s,line2:E,checksum1:l,checksum2:T,omm:t}}function D(e){const t=I(e.semimajorAxis);let n=e.epoch.replaceAll(" ","T");n=n.endsWith("Z")?n:n+"Z";return S({EPOCH:n,MEAN_MOTION:t.revPerDay,ECCENTRICITY:e.eccentricity,INCLINATION:e.inclination,RA_OF_ASC_NODE:e.raan,ARG_OF_PERICENTER:e.argPerigee,MEAN_ANOMALY:e.meanAnomaly,...e.OMMInputForce})}function y(e,t){if(0===e)return" 00000-0";const n=e.toExponential(t).match(/^(-?)(\d+\.\d+)e([+-]\d+)$/i);if(!n)return" 00000-0";const[,i,r,o]=n,s=r.replace(".","").substring(0,t),a=Number.parseInt(o);return("-"===i?"-":" ")+s+(a>=0?"+":"-")+Math.abs(a).toString().padStart(1,"0")}function P(e){let t=0;for(let n=0;n<e.length;n++){const i=e[n];"-"===i?t+=1:!Number.isNaN(Number.parseInt(i))&&(t+=Number.parseInt(i))}return t%10}async function R(t,c={isGetDetails:!1,isUseGPU:!1}){try{const T=Date.now();let _;return _=c?.isUseGPU?await async function(t,c={isGetDetails:!1,isUseGPU:!0}){const T=Date.now();await n({module_or_path:a}),E(["wasm首次加载:",(Date.now()-T)/1e3,"秒"]);const _=Array.isArray(t.kepler);let g,O;if(_){O=t.kepler;g=C(w(O))}else{const e=D(t.kepler);O=[e.line1,e.line2],g=e.omm}const u=g.EPOCH.replaceAll(" ","T"),N=t.startTime.replaceAll(" ","T"),A=t.stopTime.replaceAll(" ","T"),p=new Date(u.endsWith("Z")?u:u+"Z").getTime(),f=new Date(N.endsWith("Z")?N:N+"Z").getTime()-p,m=new Date(A.endsWith("Z")?A:A+"Z").getTime()-p,I=t.step,h=f/1e3,d=m/1e3,M=Math.floor((d-h)/I)+1,S=new Float64Array(M);for(let e=0;e<M;e++){const t=h+e*I;S[e]=t/60}let y;try{y=await i.new_for_web()}catch{try{y=await i.new_for_web_gl()}catch(b){l("THROW","❌ WebGPU 不可用",b)}}const P=g.OBJECT_NAME||"Unknown";let R;try{R=r.from_tle((new TextEncoder).encode(P),(new TextEncoder).encode(O[0]),(new TextEncoder).encode(O[1]))}catch(H){l("THROW",["TLE 解析失败:\n",O[0]+"\n",O[1]+"\n"],H)}const L=o.from_elements(R),G=new Float32Array(6*M),F=5e4;for(let e=0;e<M;e+=F){const t=Math.min(e+F,M),n=t-e,i=Array.from({length:n}).map(()=>s.from_constants(L)),r=S.slice(e,t),o=await y.propagate_batch_f32(i,r);G.set(o,6*e)}const U=Array.from({length:M});for(let n=0;n<M;n++){const t=6*n,i={x:G[t],y:G[t+1],z:G[t+2]},r=new Date(p+1e3*(h+n*I));if(c.isGetDetails){const o=e.gstime(r),s={x:G[t+3],y:G[t+4],z:G[t+5]},a=e.eciToEcf(i,o),c=e.eciToEcf(s,o),l=e.eciToGeodetic(i,o),E={lat:e.degreesLat(l.latitude),lng:e.degreesLong(l.longitude),alt:1e3*l.height};U[n]={time:r.toISOString(),positionEci:i,positionEcf:a,velocityEci:s,velocityEcf:c,position:E}}else U[n]={time:r.toISOString(),positionEci:i}}return U}(t,c):await async function(t,n={isGetDetails:!1,isUseGPU:!1}){const i=Array.isArray(t.kepler);let r,o;if(i){r=e.twoline2satrec(t.kepler[0],t.kepler[1]);o=C(w(t.kepler)),h(o.MEAN_MOTION)}else{o=D(t.kepler).omm,r=e.json2satrec(o)}const s=o.EPOCH.replaceAll(" ","T"),a=t.startTime.replaceAll(" ","T"),c=t.stopTime.replaceAll(" ","T"),l=new Date(s.endsWith("Z")?s:s+"Z").getTime(),E=new Date(a.endsWith("Z")?a:a+"Z").getTime()-l,T=new Date(c.endsWith("Z")?c:c+"Z").getTime()-l,_=t.step,g=[],O=T/1e3;let u,N;for(let A=E/1e3;A<=O;A+=_){const t=e.sgp4(r,Number((A/60).toFixed(3)));if(t){u=new Date(l+1e3*A),N=e.gstime(u);const i=t.position;if(n.isGetDetails){const n=e.eciToEcf(i,N),r=e.eciToGeodetic(i,N),o=t.velocity,s=e.eciToEcf(o,N),a={lat:e.degreesLat(r.latitude),lng:e.degreesLong(r.longitude),alt:1e3*r.height};g.push({time:u.toISOString(),positionEci:i,positionEcf:n,velocityEci:o,velocityEcf:s,position:a})}else g.push({time:u.toISOString(),positionEci:i})}}return g}(t,c),E(["sgp4耗时:",(Date.now()-T)/1e3,"秒"]),_}catch(T){l("THROW","sgp4Orbit函数运行异常",T)}}async function L(c,T={isGetDetails:!1,isUseGPU:!0}){try{const _=Date.now();let g;return g=T?.isUseGPU?await async function(c,T={isGetDetails:!1,isUseGPU:!0}){let _=!1,g=null,O=null,u=!1;const N=/* @__PURE__ */new Map,A=[],p=[];let f=/* @__PURE__ */new Map,m=[],I=[],h=[];async function d(){if(_)return!0;try{await n({module_or_path:a});try{g=await i.new_for_web()}catch{g=await i.new_for_web_gl()}if(!g)return l("THROW","❌ GPU 传播器创建失败"),!1;const T=[];h=[];for(let n=0;n<c.length;n++){const i=c[n],{kepler:s,id:a}=i;let E,_;if(Array.isArray(s))[E,_]=s;else{const e=D(s);E=e.line1,_=e.line2}try{const e=t.parseTLE([E,_]),s=t.getEpochTimestamp(e);h.push(s);const l=r.from_tle((new TextEncoder).encode(String(i.id)),(new TextEncoder).encode(E),(new TextEncoder).encode(_)),g=o.from_elements(l);T.push(g),N.set(a,{epochTimestamp:s}),A.push(a),p.push(c[n])}catch(e){l("NOT_THROW",["TLE 解析失败:\n",E+"\n",_+"\n"],e);continue}}return I=T.map(e=>s.from_constants(e)),O=g.register_const_set(I),f=/* @__PURE__ */new Map,m=Array.from({length:p.length}),_=!0,E(["GPU 批处理初始化完成,卫星数量: "+p.length]),!0}catch(T){return l("THROW","GPU 初始化失败",T),!1}}async function C(t){if(_&&g&&null!==O&&!u){u=!0;try{const n=new Float64Array(p.length);for(let e=0;e<p.length;e++){const i=N.get(A[e]);if(i){const r=M(t,i.epochTimestamp);n[e]=r}else n[e]=0}const i=await g.propagate_registered_f32(O,n),r=Array.from({length:p.length});for(let s=0;s<p.length;s++){const n=6*s,o={x:i[n],y:i[n+1],z:i[n+2]},a=new Date(t);if(T.isGetDetails){const t=e.gstime(a),c={x:i[n+3],y:i[n+4],z:i[n+5]},l=e.eciToEcf(o,t),E=e.eciToEcf(c,t),T=e.eciToGeodetic(o,t);r[s]={time:a.toISOString(),positionEci:o,positionEcf:l,velocityEci:c,velocityEcf:E,position:{lat:e.degreesLat(T.latitude),lng:e.degreesLong(T.longitude),alt:1e3*T.height}}}else r[s]={time:a.toISOString(),positionEci:o}}m=r;const o=/* @__PURE__ */new Map;for(let e=0;e<p.length;e++)o.set(A[e],m[e]);return f=o,f}catch(n){return void console.error("GPU 更新错误:",n)}finally{u=!1}}}function w(){return f}function S(e){return f.get(e)}function y(){return _}function P(){return u}async function R(){if(_){if(_=!1,g&&null!==O){try{g.unregister_const_set(O)}catch(e){l("NOT_THROW","释放 GPU 常量集失败",e)}g=null,O=null}f.clear(),m=[],N.clear(),E(["GPU 批处理内存占用已清理"])}}return await d(),{dispose:R,isProcessing:P,isInitialized:y,getCurrentPositions:w,getPosition:S,update:C}}(c,T):await async function(n,i={isGetDetails:!1,isUseGPU:!1}){let r=!1,o=!1;const s=/* @__PURE__ */new Map,a=[],c=[];let T=/* @__PURE__ */new Map,_=[];async function g(){if(r)return!0;try{for(let i=0;i<n.length;i++){const r=n[i],{kepler:o,id:E}=r;let T,_;if(Array.isArray(o)){const[n,i]=o;T=e.twoline2satrec(n,i);const r=t.parseTLE([n,i]);_=t.getEpochTimestamp(r)}else{const t=D(o).omm;T=e.json2satrec(t);const n=t.EPOCH.replaceAll(" ","T");_=new Date(n.endsWith("Z")?n:n+"Z").getTime()}T&&!T.error?(s.set(E,{epochTimestamp:_,satrec:T}),a.push(E),c.push(r)):l("NOT_THROW","卫星 "+E+" TLE 解析失败: "+T?.error,new Error("SatRec error: "+T?.error))}return 0===c.length?(l("THROW","没有可用的卫星数据"),!1):(T=/* @__PURE__ */new Map,_=Array.from({length:c.length}),r=!0,E(["CPU 批处理初始化完成,卫星数量: "+c.length]),!0)}catch(i){return l("THROW","CPU 批处理初始化失败",i),!1}}async function O(t){if(r&&!o){o=!0;try{const n=Array.from({length:c.length});for(let o=0;o<c.length;o++){const r=a[o],c=s.get(r);if(!c)continue;const l=(t-c.epochTimestamp)/6e4,E=e.sgp4(c.satrec,l);if(!E)continue;const T=E.position,_=new Date(t);if(i.isGetDetails){const t=e.gstime(_),i=E.velocity,r=e.eciToEcf(T,t),s=e.eciToEcf(i,t),a=e.eciToGeodetic(T,t);n[o]={time:_.toISOString(),positionEci:T,positionEcf:r,velocityEci:i,velocityEcf:s,position:{lat:e.degreesLat(a.latitude),lng:e.degreesLong(a.longitude),alt:1e3*a.height}}}else n[o]={time:_.toISOString(),positionEci:T}}_=n;const r=/* @__PURE__ */new Map;for(let e=0;e<c.length;e++)_[e]&&r.set(a[e],_[e]);return T=r,T}catch(n){return void console.error("CPU 更新错误:",n)}finally{o=!1}}}function u(){return T}function N(e){return T.get(e)}function A(){return r}function p(){return o}async function f(){r&&(r=!1,T.clear(),_=[],s.clear(),E(["CPU 批处理内存占用已清理"]))}return await g(),{dispose:f,isProcessing:p,isInitialized:A,getCurrentPositions:u,getPosition:N,update:O}}(c,T),E(["sgp4耗时:",(Date.now()-_)/1e3,"秒"]),g}catch(_){l("THROW","sgp4OrbitLive函数运行异常",_)}}export{e as _satellitejs,t as _tlejs,C as getFullOmm,I as getMeanMotion,M as getMinutesSinceEpoch,d as getPeriod,h as getSemiMajorAxis,R as sgp4Orbit,L as sgp4OrbitLive,D as transKeplerToTle,S as transOmmToTle,w as transTleToOmm};
|