feat: 接入 VizieR 星表检索与 LAMOST/Gaia/SDSS/DESI 跨源光谱下载

新增天文观测数据获取能力,覆盖星表查询与一维光谱下载两大场景:

星表检索(CDS VizieR)
- VizieR TAP 客户端(JSON 优先 + VOTable 降级),共享 IVOA VOTable 解析层
- 业务层支持自由 ADQL、锥形检索、交叉证认、星表发现与 CSV 导出
- ADQL 注入防护(标识符清洗 + 字符串字面量转义),TTL 缓存(7 天)

跨望远镜光谱下载(统一入口)
- 接入 LAMOST(ConeSearch + FITS.gz)、Gaia(TAP + DataLink ZIP)、
  SDSS(Data Lab TAP + SAS)、DESI(HEALPix coadd)四源
- 双模式:坐标模式(cone 检索 → 选源 → 下载)/ 标识符模式(直按 ID 下载)
- 光谱文件永久缓存(不可变),按 source+source_id 去重

Agent 与 API
- +4 工具:query_vizier / cone_search / find_spectrum / catalog_operation(22 → 26)
- +6 路由:/catalog/vizier、/cone、/crossmatch、/spectrum/{download,list}
- 前端新增 VizierResultCard / FindSpectrumCard 可视化卡片

工程重构
- services/target.rs (832 行) 拆分为 services/cds/{target,vizier}.rs + clients/cds/sesame.rs,
  贯彻 client(通信)/ service(缓存+编排)分层
- ADS 返回字段新增 data(关联数据表 URL),与星表功能联动
This commit is contained in:
fmq
2026-07-06 00:07:25 +08:00
parent 0ba85d7749
commit a156252bc3
48 changed files with 8837 additions and 388 deletions
+236
View File
@@ -0,0 +1,236 @@
# VizieR 星表查询指南
## 表名结构
VizieR 表名三段式:`分类/编号/子集`
```
I/355/gaiadr3
│ │ │
│ │ └─ 子集:具体数据子集或版本
│ └───── 编号:CDS 分配的顺序号(纯索引)
└──────── 分类:数据类型
```
### 分类前缀
| 前缀 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `I/` | 天体测量 | 位置、自行、视差 | `I/355/gaiadr3`Gaia DR3 |
| `II/` | 测光 | 多波段测光数据 | `II/246/out`2MASS |
| `III/` | 光谱 | 已发布光谱 flux 数据 | `III/272`LAMOST DR6 |
| `IV/` | 交叉证认 | 不同星表匹配结果 | `IV/14/trp2mass` |
| `V/` | 综合 | 大型巡天综合目录 | `V/162/dr11l`LAMOST)、`V/154/sdss16`SDSS |
| `B/` | 文献(旧) | 早期文献伴生数据 | `B/cb/cbdata` |
| `J/` | 期刊表 | 论文伴生数据表 | `J/ApJ/836/5/table1` |
### 为什么 LAMOST 和 SDSS 是 `V/` 不是 `III/`
`III/` 要求表中直接包含光谱 flux 数组(波长-流量对)。LAMOST 和 SDSS 的 VizieR 表只存了测光/元数据/参数,原始光谱 FITS 文件在各自数据中心,所以归入 `V/`(综合巡天目录)。
### `J/` 期刊表命名
```
J/ApJ/836/5/table1
│ │ │ │ │
│ │ │ │ └─ 论文中表编号
│ │ │ └───── 卷号
│ │ └───────── 文章编号
│ └────────────── 期刊缩写
└───────────────── 固定前缀 J/
```
常用期刊:`ApJ`(天体物理学报)、`A&A`(天文与天体物理)、`MNRAS`(皇家天文学会月刊)、`AJ`(天文期刊)、`ApJS`(天体物理学报增刊)
---
## Gaia DR3
### 主表 `I/355/gaiadr3`18 亿源,225 列)
**天体测量(核心):**
| 列名 | 类型 | 单位 | 说明 |
|------|------|------|------|
| `DR3Name` | CHAR(28) | — | 唯一标识(如 `Gaia DR3 162109245908224` |
| `Source` | BIGINT | — | 源 ID |
| `RA_ICRS` | DOUBLE | deg | 赤经(J2016.0 |
| `DE_ICRS` | DOUBLE | deg | 赤纬(J2016.0 |
| `e_RA_ICRS` | REAL | mas | 赤经误差 |
| `e_DE_ICRS` | REAL | mas | 赤纬误差 |
| `Plx` | DOUBLE | mas | 视差 |
| `e_Plx` | REAL | mas | 视差误差 |
| `pmRA` | DOUBLE | mas/yr | 赤经方向自行 |
| `pmDE` | DOUBLE | mas/yr | 赤纬方向自行 |
| `e_pmRA` | REAL | mas/yr | 自行误差 |
| `e_pmDE` | DOUBLE | mas/yr | 自行误差 |
**测光(G/BP/RP 三波段):**
| 列名 | 类型 | 单位 | 说明 |
|------|------|------|------|
| `Gmag` | DOUBLE | mag | G 波段平均星等 |
| `e_Gmag` | DOUBLE | mag | G 星等误差 |
| `BPmag` | DOUBLE | mag | BP 波段星等 |
| `RPmag` | DOUBLE | mag | RP 波段星等 |
| `BP-RP` | DOUBLE | mag | BP-RP 色指数 |
| `BP-G` | DOUBLE | mag | BP-G 色指数 |
| `E(BP/RP)` | DOUBLE | mag | BP/RP 过量因子(消光指示) |
**其他重要列:** 径向速度 (`RV`)、光谱类型、银河系参数、变星标记等,完整 225 列。
### 光谱相关表
| 表名 | 行数 | 内容 | 含 flux |
|------|------|------|----------|
| `I/355/rvsmean` | 24 亿 | RVS 均采样光谱 | 是(RVS 波段) |
| `I/355/xpsummary` | 2.2 亿 | BP/RP 光谱摘要参数 | 否(参数) |
| `I/355/spectra` | 3400 万 | 光谱视图 | 否(链接到 FITS) |
---
## LAMOST
### 主表 `V/162/dr11l`DR11 LRS 低分辨率,1200 万条光谱)
**观测标识:**
| 列名 | 类型 | 说明 |
|------|------|------|
| `ObsID` | INT | 光谱观测 ID(下载 FITS 的关键字) |
| `Target` | CHAR(19) | 目标名称(JHHMMSS.ss+DDMMSS.s |
| `PlanID` | VARCHAR | 观测计划名 |
| `spID` | SMALLINT | 光谱仪编号(1-16 |
| `FiberID` | SMALLINT | 光纤编号(1-250 |
| `FiberType` | CHAR(5) | 光纤类型(Obj/Sky/Filler |
**坐标与时间:**
| 列名 | 类型 | 单位 | 说明 |
|------|------|------|------|
| `RAJ2000` | DOUBLE | deg | 纤维指向赤经 |
| `DEJ2000` | DOUBLE | deg | 纤维指向赤纬 |
| `Obs_Date` | DOUBLE | — | 儒略日 |
| `LMJD` / `MJD` | INT | d | 修正儒略日 |
**信噪比(5 波段):**
| 列名 | 说明 |
|------|------|
| `snru` / `snrg` / `snrr` / `snri` / `snrz` | u/g/r/i/z 波段信噪比 |
**光谱分类与红移:**
| 列名 | 说明 |
|------|------|
| `Class` | 大类(STAR / GALAXY / QSO |
| `subClass` | 光谱子型(如 K4、G8、A0) |
| `z` | 光谱红移 |
| `e_z` | 红移误差 |
**测光(PanSTARRS + Gaia):**
| 列名 | 说明 |
|------|------|
| `gmag` / `rmag` / `imag` / `zmag` / `ymag` | PanSTARRS 五波段星等 |
| `Gmag` | Gaia G 波段星等 |
| `GaiaDR3` | Gaia DR3 源 ID |
| `PanSTARRS` | PanSTARRS objID |
**光纤信息:** `offsets`(偏移标记)、`FiberMask`(光纤问题)、`fNFlux`(是否有归一化流量)、`nMRS`(中分辨率光谱数)
### 参数表(需单独查)
| 表名 | 行数 | 包含参数 |
|------|------|---------|
| `J/ApJ/836/5/table1` | 45 万 | Teff、logg、[Fe/H]、[α/M] |
| `J/ApJS/266/40/catalog` | 140 万 | MRS 恒星参数+化学丰度 |
| `J/ApJS/271/60/table1` | 306 万 | G 型星光谱参数 |
---
## SDSS
### 主表 `V/154/sdss16`DR16 测光,12.3 亿源,50 列)
**标识与分类:**
| 列名 | 类型 | 说明 |
|------|------|------|
| `objID` | BIGINT | SDSS 唯一标识 |
| `RA_ICRS` | DOUBLE | 赤经(ICRS |
| `DE_ICRS` | DOUBLE | 赤纬(ICRS |
| `class` | SMALLINT | 天体类型(3=星系、6=恒星) |
| `mode` | SMALLINT | 照相模式(1=主探测) |
| `clean` | SMALLINT | 测光质量标记 |
**PSF 星等(5 波段):**
| 列名 | 单位 | 说明 |
|------|------|------|
| `upmag` / `gpmag` / `rpmag` / `ipmag` / `zpmag` | mag | u/g/r/i/z PSF 星等 |
| `e_upmag` ... `e_zpmag` | mag | 对应误差 |
**Petrosian 星等与半径:**
| 列名 | 说明 |
|------|------|
| `uPmag` ... `zPmag` | Petrosian 星等(5 波段) |
| `uPrad` ... `zPrad` | Petrosian 半径(角秒) |
**形态拟合(De Vaucouleurs):**
| 列名 | 说明 |
|------|------|
| `udVrad` ... `zdVrad` | 拟合半径 |
| `udVell` ... `zdVell` | 轴比 (b/a) |
---
## 三巡天对比
| | Gaia DR3 | LAMOST DR11 | SDSS DR16 |
|---|---|---|---|
| **VizieR 表** | `I/355/gaiadr3` | `V/162/dr11l` | `V/154/sdss16` |
| **分类** | `I/` 天体测量 | `V/` 综合巡天 | `V/` 综合巡天 |
| **数据量** | 18 亿源 | 1200 万光谱 | 12.3 亿源 |
| **核心数据** | 位置+自行+视差+测光 | S/N+光谱型+红移 | 五波段测光+形态 |
| **恒星参数** | 无 | 无(另查 `J/` 表) | 无(另查 `J/` 表) |
| **原始光谱** | RVS 有 fluxBP/RP 需下载 FITS | 需用 ObsID 下载 FITS | 需从 SkyServer 下载 |
---
## 光谱数据获取方式
| 巡天 | 参数表(TAP 可查) | 原始光谱(需下载) |
|------|-------------------|-------------------|
| Gaia DR3 | `I/355/xpsummary`BP/RP 摘要) | `I/355/spectra` → 链接到 FITS |
| Gaia DR3 RVS | — | `I/355/rvsmean`(含 flux |
| LAMOST | `J/ApJ/836/5/table1` 等 | 用 `ObsID` 从 lamost.org 下载 |
| SDSS | `J/ApJ/901/93/table1` 等 | 从 SkyServer spectra 下载 |
---
## 查询示例
```sql
-- Gaia DR3:视差 > 10mas 的亮星
SELECT TOP 100 DR3Name, RA_ICRS, DE_ICRS, Plx, Gmag, BP-RP
FROM "I/355/gaiadr3"
WHERE Plx > 10
-- LAMOSTS/N_r > 50 的 K 型星
SELECT TOP 100 ObsID, RAJ2000, DEJ2000, subClass, z, snrr
FROM "V/162/dr11l"
WHERE snrr > 50 AND Class = 'STAR' AND subClass LIKE 'K%'
-- LAMOST 恒星参数
SELECT TOP 100 RA, DEC, Teff, logg, FEH, ALPHA
FROM "J/ApJ/836/5/table1"
WHERE Teff BETWEEN 5000 AND 6000
-- SDSSr 波段 < 18 等的恒星
SELECT TOP 100 objID, RA_ICRS, DE_ICRS, rpmag, class
FROM "V/154/sdss16"
WHERE rpmag < 18 AND class = 6
```