jspredict-dc
Version:
javascript port of predict open-source satellite tracking library
199 lines (146 loc) • 10.1 kB
Markdown
[English](README.md) | 中文
# JSpredict-DC
一个流行的 `predict` 卫星跟踪库的 JavaScript
重构和增强版本,最初基于 [nsat/jspredict](https://github.com/nsat/jspredict)。
本分支旨在提供一个更现代化、更易于维护的代码库,具有更好的模块兼容性和 TypeScript 支持。
### 主要改进:
* **代码重构:** 清理并现代化了内部代码库。
* **模块兼容性:** 使用 Rollup 构建,支持包括 ESM、CJS、UMD 和 AMD 在内的多种模块格式。
* **TypeScript 支持:** 包含 TypeScript 声明文件(`.d.ts`),为 TypeScript 项目提供更好的开发体验。
* **单元测试:** 添加了使用 Jest 的单元测试,确保核心功能准确稳定。
* **功能扩展:** 增加了更多的SDK。
### 依赖:
* [Satellite.js](https://github.com/shashwatak/satellite-js)
* [Moment.js](https://github.com/moment/moment)
## 安装
通过 npm 安装库:
```bash
npm install jspredict-dc
```
## API
| 方法 | 说明 |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------|
| `jspredict_dc.getPositionByTime(tle: string, observerLocation?: ObserverLocation, time?: number \| Date): ObserveResult \| null` | 计算卫星在特定时间的位置和其他观测数据,可选择观测者位置。 |
| `jspredict_dc.getEphemeris(tle: string, observerLocation: ObserverLocation, start: number \| Date, end: number \| Date, interval?: any): ObserveResult[]` | 在指定的时间范围内,以指定的时间间隔计算一系列卫星观测数据。 |
| `jspredict_dc.transits(tle: string, observerLocation: ObserverLocation, start: number \| Date, end: number \| Date, minElevation?: number, maxTransits?: number): Transit[]` | 在给定的观测者位置和时间窗口内,查找卫星可见过境(transits),可按最小仰角和最大过境数过滤。[不支持地球同步轨道卫星] |
| `jspredict_dc.transitSegment(tle: string, observerLocation: ObserverLocation, start: number \| Date, end: number \| Date): Transit \| null` | 计算特定时间段的过境信息。 |
| `jspredict_dc.getVisibilityWindows(tle: string, observerLocation: ObserverLocation, start: number \| Date, end: number \| Date): number[][]` | 返回卫星在给定观测者位置和时间范围内的可见窗口时间戳数组(每个元素为[start, end]对)。 |
| `getOrbitalPeriodByTle(tle: string): number` | 根据tle 获取轨道周期(秒)。 |
| `getOrbitalPeriodByCartesian3(cartesian3: [number,number,number]=[0,0,0]): number;` | 根据笛卡尔坐标获取轨道周期(秒)。 |
详细类型定义请参考 TypeScript 声明文件(`dist/jspredict-dc.d.ts`)。
**输入类型:**
* `tle`: 3 行字符串,使用 "\\n" 作为换行符。
* `observerLocation`: 3 元素数组 `[纬度 (度), 经度 (度), 海拔 (千米)]`。
* `time`, `start`, `end`: Unix 时间戳 (毫秒) 或 Date 对象 (`new Date()`)。
* `interval`:步长间隔(毫秒)。
## 数据结构
以下是库方法使用和返回的主要数据结构:
### ObserverLocation
表示地面观测站位置的数组:`[纬度 (度), 经度 (度), 海拔 (千米)]`。
### Transit
表示卫星从地面观测站可见过境的信息。
* `start` (number): 过境开始时间 (毫秒 Unix 时间戳)。
* `end` (number): 过境结束时间 (毫秒 Unix 时间戳)。
* `maxElevation` (number): 过境期间的最大仰角 (度)。
* `apexAzimuth` (number): 达到最大仰角时的方位角 (度)。
* `maxAzimuth` (number): 过境期间的最大方位角 (度)。
* `minAzimuth` (number): 过境期间的最小方位角 (度)。
* `duration` (number): 过境持续时间 (毫秒)。
### Eci
表示地心惯性坐标系(位置和速度)。
* `position` (object): 卫星在 ECI 坐标系中的位置 (千米)。
* `x` (number)
* `y` (number)
* `z` (number)
* `velocity` (object): 卫星在 ECI 坐标系中的速度 (千米/秒)。
* `x` (number)
* `y` (number)
* `z` (number)
### ObserveResult
表示特定时间的卫星观测数据。包含基本的轨道数据,如果提供了 observerLocation,则可选地包含地面观测者数据。
* `eci` (Eci): 卫星在 ECI 坐标系中的位置和速度。
* `gmst` (number): 格林威治平均恒星时 (弧度)。
* `latitude` (number): 卫星在地心大地坐标系中的纬度 (度)。
* `longitude` (number): 卫星在地心大地坐标系中的经度 (度)。
* `altitude` (number): 卫星在地心大地坐标系中的海拔高度 (千米)。
* `footprint` (number): 卫星对地面可见的区域直径 (千米)。
* `sunlit` (boolean): 卫星是否被太阳照亮(是否处于日照区)。
* `eclipseDepth` (number): 卫星处于地球阴影中的深度 (弧度)。
* `azimuth` (number | undefined): 从地面观测点到卫星的方位角 (度)。**仅在提供 observerLocation 时计算。**
* `elevation` (number | undefined): 从地面观测点到卫星的仰角 (度)。**仅在提供 observerLocation 时计算。**
* `rangeSat` (number | undefined): 从地面观测点到卫星的直线距离 (千米)。**仅在提供 observerLocation 时计算。**
* `doppler` (number | undefined): 从地面观测点观察到的卫星的多普勒因子。**仅在提供 observerLocation 时计算。**
## 使用示例
使用 ESM (例如,现代构建工具):
```javascript
import jspredict_dc, {ObserverLocation} from 'jspredict-dc'; // ObserverLocation 类型也已导出
const tle = `STARLINK-1008\n1 44714C 19074B 25148.13868056 .00017318 00000+0 11598-2 0 1489\n2 44714 53.0556 28.5051 0001501 80.1165 230.1605 15.06396864 11`;
const observerLocation: ObserverLocation = [39.9042, 116.4074, 0.05]; // 北京,海拔50米
// 获取特定时间的位置
const observationTime = new Date('2024-05-28T12:00:00Z');
const position = jspredict_dc.getPositionByTime(tle, observerLocation, observationTime);
console.log('位置:', position);
// 获取时间范围内的星历
const startTime = new Date('2024-05-28T12:00:00Z');
const endTime = new Date('2024-05-28T12:10:00Z');
const interval = {minutes: 2};
const ephemeris = jspredict_dc.getEphemeris(tle, observerLocation, startTime, endTime, interval);
console.log('星历:', ephemeris);
// 查找可见过境
const transitStartTime = new Date('2024-05-28T00:00:00Z');
const transitEndTime = new Date('2024-05-29T00:00:00Z');
const minElevation = 5; // 度
const maxTransits = 2;
const transits = jspredict_dc.transits(tle, observerLocation, transitStartTime, transitEndTime, minElevation, maxTransits);
console.log('过境:', transits);
// 获取轨道周期 提供了两种方法
const res = jspredict.getOrbitalPeriodByTle(tle);
const pos = jspredict.getPositionByTime(tle, observerLocation, new Date())
const res2 = jspredict.getOrbitalPeriodByCartesian3([pos.eci.position.x, pos.eci.position.y, pos.eci.position.z])
console.log(res, res2)
```
使用 CommonJS (例如,在 Node.js 中):
```javascript
const jspredict_dc = require('jspredict-dc');
const tle = `STARLINK-1008\n1 44714C 19074B 25148.13868056 .00017318 00000+0 11598-2 0 1489\n2 44714 53.0556 28.5051 0001501 80.1165 230.1605 15.06396864 11`;
const observerLocation = [39.9042, 116.4074, 0.05]; // 北京,海拔50米
// 获取特定时间的位置
const observationTime = new Date('2024-05-28T12:00:00Z');
const position = jspredict_dc.getPositionByTime(tle, observerLocation, observationTime);
console.log('位置:', position);
// 获取时间范围内的星历
const startTime = new Date('2024-05-28T12:00:00Z');
const endTime = new Date('2024-05-28T12:10:00Z');
const interval = {minutes: 2};
const ephemeris = jspredict_dc.getEphemeris(tle, observerLocation, startTime, endTime, interval);
console.log('星历:', ephemeris);
// 查找可见过境
const transitStartTime = new Date('2024-05-28T00:00:00Z');
const transitEndTime = new Date('2024-05-29T00:00:00Z');
const minElevation = 5; // 度
const maxTransits = 2;
const transits = jspredict_dc.transits(tle, observerLocation, transitStartTime, transitEndTime, minElevation, maxTransits);
console.log('过境:', transits);
```
使用 script 标签 (UMD 格式):
```html
<script src="path/to/your/dist/jspredict-dc.umd.js"></script>
<script>
const tle = `STARLINK-1008\n1 44714C 19074B 25148.13868056 .00017318 00000+0 11598-2 0 1489\n2 44714 53.0556 28.5051 0001501 80.1165 230.1605 15.06396864 11`;
const observerLocation = [39.9042, 116.4074, 0.05]; // 北京,海拔50米
const observationTime = new Date('2024-05-28T12:00:00Z');
// 库通过全局变量 jspredict_dc 可用
const position = jspredict_dc.getPositionByTime(tle, observerLocation, observationTime);
console.log('位置:', position);
</script>
```
## 构建
构建库并生成 `dist` 文件:
```bash
npm run build
```
## 测试
运行单元测试:
```bash
npm test
```