# koishi-plugin-xxcx-1 中文文档

规范地址：https://npmcn.com/package/koishi-plugin-xxcx-1/

版本：0\.0\.10
npm 元数据更新时间：2026-11-03T22:44:25.575Z
中文译文更新时间：2026-11-04T00:39:08.834Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/koishi-plugin-xxcx-1
原文对照：https://npmcn.com/package/koishi-plugin-xxcx-1/?lang=original

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：27.7 MB，9589 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- 运行依赖：0 个
- peer 依赖：koishi ^4\.18\.7
- 首次发布：2026-09-21T03:49:22.821Z
- 最新版本发布：2026-11-03T22:44:25.426Z
- 已发布版本数：9（近 12 个月 9 个）

## 中文简介

TC历史查询插件 · cx 按时刻查询活动系统，xrq/最佳 绘制单系统路径图，对照 出逐年 ACE 对比统计表（xrqa 数据 + NaTyphoon 存档）

## 安装

```sh
npm install koishi-plugin-xxcx-1
```

也可以使用：`pnpm add koishi-plugin-xxcx-1`、`yarn add koishi-plugin-xxcx-1`、`bun add koishi-plugin-xxcx-1`

## README

# koishi-plugin-xxcx-1

[![npm](https://img.shields.io/npm/v/koishi-plugin-xxcx-1?style=flat-square)](https://www.npmjs.com/package/koishi-plugin-xxcx-1)

\[自用\]TC查询器

台风历史查询插件：**`cx 年.月.日.时`** 查出该时刻（世界时）正在活动的所有系统，输出**编号、风速、性质、定位**。

数据来源为 `data/` 目录下的 xrqa 自评 b-deck（ATCF 格式），覆盖 **1949—2026** 共 78 年、2424 个系统 （`bwp` 2324、`bsh` 60、`bcp` 28、`bep` 10、`bio` 2；2026 年为部分年份）。 查询年份超出本地数据范围时（1851—1948、2027 起），`cx` 会**自动从 NaTyphoon 存档下载该年份补齐** （`archiveUrl` 可配置；当前年份数据仍在更新，缓存 6 小时后自动刷新，历史年份长期缓存）。

另有 `data-ibtracs/`：IBTrACS 收录、但最佳路径存档没有的系统，从 1842 年起共 7125 个 （有编号 2265 个 + 无编号 4860 个），完整定位序列 308403 条。有编号的这批会一起进 `对照` （与 `data/` 按编号配对），无编号的只作查阅。其中另有 14 个南大西洋人工补录 （IBTrACS 与存档都没有，见「数据维护 · IBTrACS 补录」）。

## 效果

```
cx 2013.11.07.18
2013.11.07.18Z 共 2 个系统

1331W  185kt  超强台风(ST)  10.6°N 126.9°E
1330W  35kt  热带风暴(TS)  12.0°N 101.0°E
```

查询时刻不是 6 小时正点（如 `15` 时）时，取最接近的一次定位并标注实际定位时间：

```
cx 2024.09.15.15
2024.09.15.15Z 共 3 个系统

2414W  85kt  台风(TY)  30.5°N 124.6°E  @09.15.12
2412W  30kt  热带低压(TD)  22.1°N 82.9°E  @09.15.12
2415W  20kt  热带扰动(DB)  13.4°N 143.4°E  @09.15.12
注：@xx.xx.xx 表示该时刻无正点定位，取最接近的一次定位。
```

## 指令

| 指令 | 说明 |
| --- | --- |
| `cx 2024.09.15.12` | 查询该时刻存在的系统（世界时） |
| `cx 2024.09.15` | 省略小时，按 00 时处理 |
| `cx` | 输出用法与数据范围 |
| `xrq wp162022` | 用本地 xrqa 数据绘制单个系统的路径图 |
| `最佳 wp162022` | 从 NaTyphoon 存档下载最佳路径并绘制路径图 |
| `xrq 13haiy` | 按「年份后两位 + 名字前缀」查（2013 年 HAIYAN），大小写不敏感 |
| `最佳 13haiy` | 同上，名字查询使用存档数据 |
| `命名 2013 wp` | 列出 2013 年 WP 洋区所有系统编号与名字 |
| `对照 2013 wp` | 对比该年该洋区 XRQA 与最佳路径的 ACE，输出统计表图 |
| `补录 2014mitag` | 查询 IBTrACS 补录中无编号的系统（见「补录查询」） |
| `补录 2014160N21120` | 按 SID 直接定位，输出路径图与摘要 |

分隔符支持 `.`、`-`、`/`，月/日/时可省前导零（`2024.9.5.0` 等价于 `2024.09.05.00`）。

## 单系统路径图（xrq / 最佳）

参数支持两种写法：

-   **系统编号**：洋区两位 + 编号两位 + 年份四位（`wp162022` = 2022 年 WP 洋区 16 号，即文件名 `bwp162022` 去掉 `b`）
-   **年份 + 名字前缀**：`13haiy`（两位年份，13 → 2013）或 `2013haiy`（四位年份），不区分大小写；两位年份不晚于今年后两位算 20xx，否则算 19xx（`98zeb` → 1998）

名字查询会先列出/下载该年份的存档：**查不到**会提示改用完整编号；**匹配到多个**会列出候选（最多 10 个）并要求补充字母或用完整编号。两个指令输出格式一致：

```
bwp312013 Haiyan 最佳路径
定位：37 条，2013.11.02.06Z — 2013.11.11.06Z
持续：9天0时，路径：6728km
巅峰：170kt 超强台风(ST) @ 2013.11.07.12Z
最低气压：895hPa
ACE：38.19
→ 图片：该系统全路径图（发送成功后自动删除）

bwp312013 Haiyan xrqa路径
定位：48 条，2013.11.01.00Z — 2013.11.12.00Z
持续：11天0时，路径：7732km
巅峰：185kt 超强台风(ST) @ 2013.11.07.18Z
最低气压：数据未提供
ACE：38.46
```

两个数据源：

-   **xrq**：插件自带 xrqa b-deck（`data/`，即原压缩包数据），1949—2026，气压字段缺失时显示「数据未提供」。本地文件没有名字字段，会按同编号向存档查一次名字；查不到显示 `Noname`。
-   **最佳**：[NaTyphoon 存档](http://data.natyphoon.top/atcf/b-decks/)（1851—2026），按需下载 `b<洋区><编号><年份>.dat` 到临时目录，绘制后连同图片一起删除。名字取文件中最后一次非占位名（`INVEST`、`THIRTYONE` 之类不算），全程没有名字显示 `Nameless`。

名字统一为首字母大写（`HAIYAN` → `Haiyan`）。存档同一时次可能拆成多行（34/50/64kt 风圈各一行），摘要按时间去重后再统计定位数与 ACE。

ACE 规则：仅统计 **00/06/12/18 正点**、TS / TY / ST / STS / TC / HU / MH 阶段且风速 ≥35kt 的定位，Σ (v/100)²（= v²×10⁻⁴，单位 ×10⁴ kt²）。 本地数据缺失时 `xrq` 会提示改用 `最佳`，反之亦然。绘制流程与 `drawImage` 相同（仅 Windows）。

## 命名查询

`命名 <年份> <洋区代号>` 列出该年份、该洋区的全部系统编号与名字。年份支持四位或两位（`13` → 2013），洋区代号不区分大小写：

```
命名 2013 wp

2013 年 WP（西北太平洋）共 33 个系统

01W  Sonamu
02W  Shanshan
...
```

-   洋区代号：`WP` 西北太平洋、`EP` 东北太平洋、`CP` 中太平洋、`AL` 北大西洋、`IO` 北印度洋、`SH` 南半球、`SL` 南大西洋
-   每个代号都收习惯写法：`WPAC` / `EPAC` / `CPAC` / `NATL` / `SATL` / `NIO`，不区分大小写，所以 `对照 2019 satl` 与 `对照 2019 sl` 等价
-   南半球可按责任区再分三段：`SWIO` 西南印度洋（30—90°E）、`AUS` 澳洲区（90—160°E）、`SPAC` 南太平洋（160—240°E），简写 `sw` / `si` / `au` / `sp` 同样可用
-   数据来自 NaTyphoon 存档（会走整年缓存），未命名系统显示 `Nameless`（`INVEST` 以及被字段长度截断的英文数字占位名都算未命名）
-   **IBTrACS 补录一并列出**：IBTrACS 有名字、但存档没收录的系统（编号类 458 个 + 无编号 155 个有名字） 也出现在表里——编号类按编号插进主列表并标 `※`，无编号的单独列 SID（`≈bwp…` 表示 XRQA 另有 扩展编号）。同一系统只出现一次：编号类按编号去重，无编号的与存档轨迹做时空重合 （±6h、≤150km，重合 ≥50% 视为同一场）
-   该年没有指定洋区时，会列出这一年的可用洋区代号

## 补录查询（无编号系统）

`data-ibtracs/sid/` 里的系统没有 `01W` 这类编号，`xrq` / `最佳` 的编号查询摸不到，单独用 `补录` 指令查。查询写法与 `xrq 13haiy` 的风格一致（也可用空格分隔）：

```
补录 2014160N21120     按 SID 直接定位，输出路径图与摘要
补录 2014              列出该年全部无编号系统（SID、洋区、名字、定位条数）
补录 2014wp            该年 + 洋区过滤
补录 2014mitag         该年 + 名字前缀；唯一命中时直接画图，多个时列出让用户补充
```

-   SID 是 IBTrACS 的 13 位编号（4 位年份 + 3 位序号 + 半球 + 5 位位置编码），不区分大小写
-   两字母过滤词先按洋区代号理解（`al`、`io` 这些前缀撞常见名字时洋区优先），按名字查请多打几个字母
-   名字来自生成补录数据时的 IBTrACS `NAME` 列（存在 `.sync.json` 清单里）
-   **xrqa 交叉对应**：xrqa 收录的JTWC 没编号的系统，清单里以 `≈bwp602014` 标注，单系统摘要末尾会提示 `xrq bwp602014` 可看再分析路径
-   摘要格式与 `xrq` / `最佳` 相同，标题注明 IBTrACS 补录；有编号的补录系统（1232 + 1033 个） 存在 `data-ibtracs/<年份>/` 下，格式与 `data/` 一致，暂无专门指令

## 逐年 ACE 对照

`对照 <年份> <洋区代号>` 把该年该洋区的两套数据按系统编号配对，输出一张统计表图：

```
对照 2013 wp
2013 年 WP（西北太平洋） ACE 对照
共 35 个系统 · XRQA 335.39 / 最佳 274.21 · 差值 +61.18
→ 图片：mth | ID | Name | 最佳（风速/气压/ACE） | XRQA（风速/气压/ACE） | +/-
```

-   无会话或绘制失败时退回等宽文本表

跨洋区的系统按**经纬分段**统计：

-   本洋区编号的系统只统计落在本洋区范围内的定位；
-   反过来，别的洋区编号的系统进入本洋区的那一段计入本洋区。
-   这类行单独列出，编号仍是原编号（`01C`），名字后面标 `(WP段)`，只计本洋区内的定位；
-   七个洋区都按经纬边界判定，经度统一折算到 0—360：WP 半岛分界—180°E、CP 180—220°E、EP 220°E—陆桥、IO 30°E—半岛分界、SH 赤道以南 0—300°E、SL 赤道以南 300—360°E、AL 陆桥—0°且严格取赤道以北（南半球另有 SWIO / AUS / SPAC 三个分区，见下一条）；
-   AL 与 SL 严格按赤道分界，两者不重叠：赤道以南一律归 SL，AL 一个点都不留；赤道本身判给南半球（与 `SH` / `SL` 的 `latMax: 0` 一致）。这条规则的代价是 IBTrACS 的历史遗留要单独处理——它在 2010 年才有 `SL` 编码，此前的南大西洋系统一律挂在 `AL` 下。2004 年 3 月的卡塔琳娜（Catarina）就是 `AL 50`，23 个定位全在 28.5—29.6°S、41.8—50.1°W，峰值 75kt、最低 981hPa，是南大西洋唯一被广泛承认的飓风。这类文件按**首个定位**重新判归属：赤道以南的算 SL 本区系统，赤道以北的仍归 AL。所以 `对照 2004 sl` 里它是 `50L Nameless`、ACE 4.77，`对照 2004 al` 里不再出现。编号仍沿用 `50L`（与 b-deck 文件名同源，`SL` 编号的后缀是 `Q`，2010 / 2011 的 Anita 与 Arani 是 `50Q`），所以 SL 表里会同时看到 `50L` 与 `50Q` 两种后缀；
-   南大西洋在 ATCF 里有三种写法，都指同一个洋区：`al`（2004 的 Catarina，`bal502004`）、`sl`（2010 / 2011 的 Anita 与 Arani，`bsl502010` / `bsl502011`）、`ls`（2019 起的巴西海军编号系统，`bls012019`）。`ls` 与 `sl` 字母顺序相反，不特殊处理的话它既进不了 SL 也进不了 AL，会整个消失；现在 `ls` 与 `al` 一样按首个定位判归属，`对照 2019 ls` 会归一到 `sl` 表，编号后缀统一显示 `Q`；
-   IBTrACS v04r01 的南大西洋列表（`ibtracs.SA.list`）只收了 2004、2010、2011 三个系统，之后巴西海军水文中心（CHM）命名的十几个热带 / 亚热带系统一个都没进。`data-ibtracs/` 下按年份人工补了 14 个（2015—2026，文件名 `blsNNYYYY.txt`），路径来自 Steve Young 的月度路径表（`australiasevereweather.com.au/cyclones/<年>/trak<两位年><两位月>.htm` 的 `S. ATLANTIC` 一节，以 NRL / NCEP-NCAR 再分析重建为主、KNES 提供逐 6 小时 Dvorak 定强）。编号沿用 CHM 的 TD# 写成 ATCF 形式（`b` + `ls` + 两位序号 + 四位年份），年内按生成先后排：2015 与 2021 各有 `01Q` / `02Q` / `03Q`，2019 是 `01Q` Iba 与 `02Q` Jaguar，其余年份各一个。名字在 `src/names.ts` 的 `SUPPLEMENT_NAMES` 里单独维护（不由 `gen-names.py` 生成），所以表里显示 `Iba`、`Raoni`、`Akará` 而不是 `Nameless`；
-   补录口径三条：**亚热带系统照收，ACE 记 0**（`SS` / `SD` 不在 ACE 计入集合里，Potira 33 个定位、峰值 40kt，ACE 仍是 0）；**没有风速的只保留路径，风速列留空、不补推测值**（Kurumí、Yakecan、2023 的 `01Q` 只有气压，ACE 自然是 0）；**本区 0 分的行照常列出**，不因为「本区 ACE 是 0」删行，否则系统数会少一个。2026 年 2 月那一节里另有一个未命名的 `DEPRESSION`，位置与 Caiobá 相近、疑为同一事件的另一版分析，没有收录；
-   站点只发布 1—6 月的月报，7—12 月几乎全 404，所以下半年生成的那批（Deni 2016-11、Eçaí 2016-12、Guará 2017-12、Oquira 2020-12、Ubá 2021-11、Biguá 2024-12）补不到；Mani 2020-06 虽在 1—6 月内，但那几期月报的南大西洋一节是空的。这批只能等 IBTrACS 后续版本收录。重新生成用 `python tools/gen-satl.py`（`--only=2016,2019` 只刷指定年份，`--dry` 只打印不写盘），文件首行是 `#` 注释，`tools/sync-ibtracs.py` 重跑时会跳过、不覆盖也不删；
-   WP 与 IO 之间不按 100°E 一刀切：马来半岛在 6—12°N 收窄到 98.5—99.5°E，泰国湾一侧（东）属西太、安达曼一侧（西）属印度洋，100°E 直线会把泰国湾的系统错划给印度洋。分界取半岛山脊中线（0°N 103.5°E → 2°N 103.1°E → 4°N 102°E → 6°N 99.95°E → 8°N 98.95°E → 10°N 98.75°E → 12°N 99.25°E → 14°N 100°E，14°N 以北回到 100°E），线以东算 WP、以西算 IO。2001 年的 32W 画眉在马六甲海峡内（1.6°N 103.0°E）转 IO，2018 年的 36W 帕布到 8.8°N 98.5°E 越过攀牙湾才转 IO，而它在泰国湾 8.3°N 99.8°E 的 40kt 仍算西太；
-   AL 与 EP 共用中美洲陆桥，不能只按经度划：德州登陆点（28°N 97°W）与东太平洋的 97°W 是同一条经线，中间只隔墨西哥陆地。分界取陆桥中线（0°N 80.5°W → 8°N 80°W → 10°N 84°W → 16°N 91°W → 18°N 94.8°W → 20°N 100.5°W → 25°N 103.5°W → 30°N 105°W），线以西算 EP，以东算加勒比海 / 墨西哥湾（AL）。大西洋系统翻过地峡进入太平洋的（1876 的 04L 带一条 1.36 的 EP 段）会多出一行 EP 段，反向同理；
-   只有相邻洋区之间才可能互相串段：WP ↔ CP、CP ↔ EP、IO ↔ WP、EP ↔ AL。EP 编号的系统可以穿 CP 进入 WP，北印度洋的系统也有从西太生成的（1978 年的 02I、1999 年的 05I 各带一条 WP 段，后者 0.61，其中 11.5°N 99.3°E 的 45kt 定位按半岛分界仍算西太），这些分段同样单独列出；
-   南半球按 WMO 责任区拆成三段，界线是 30 / 90 / 160 / 240°E：`SWIO` 西南印度洋（30—90°E，RSMC 留尼汪）、`AUS` 澳洲区（90—160°E，达尔文 / 珀斯 / 布里斯班）、`SPAC` 南太平洋（160°E—120°W，楠迪 + 惠灵顿）。`SH` 仍是三段的合计，旧写法照用。南半球的数据文件都叫 `bsh`，没有分区编号，所以**归属看轨迹首个定位**：首个定位落在本区的按本区系统列（正常行），从别的分区漂进来的按分段行标 `(AUS段)` 之类，两边都不会重复计算。
-   同一场台风偶尔会挂两个洋区编号：如 2025 年的 34W Senyar 与 04I Senyar。这种情况下分段行会与本洋区行重复，只保留本洋区那一行，它缺的那一侧从重复文件补过去。
-   还有一种相反的情况：同一系统被拆成两个编号、两段轨迹**首尾相接但不重叠**。这种按一条统计：ACE 与定位数相加、起止取并集、峰值取大，清单在 `src/compare.ts` 的 `SYSTEM_SPLITS` 里维护，只登记人工确认过的，不做自动判定。

版式按数据情况自动切换，共三种：

| 情况 | 版式 | 说明 |
| --- | --- | --- |
| 两套数据都有 | `both` | 完整六列，带 `+/-` 差值列 |
| 本地 xrqa 整侧没有该洋区 | `bestOnly` | 只画最佳一组，表宽 530，表底注明原因 |
| 存档整侧没有该洋区 | `xrqOnly` | 只画 XRQA 一组，表底注明原因 |

表宽随名字列自适应：名字列默认 172px，遇到 `Benjamine (SWIO段)` 这种「名字 + 段标」比列宽长时按实测像素加宽（上限 248px，再长交给省略号），整张表跟着变宽，单侧版式因此可能宽于 530。标题在 27px 下放不下时逐级缩到 19px，保证整行显示；单元格一律单行，不会折成两行挤在固定行高里。

只有**部分**系统缺一侧时保持 `both` 版式，每一处缺失都单独标出来：

-   缺一侧的编号后面加 `*`（两源都缺的系统也加，缺的是哪一侧看该侧的 `-`）
-   该侧整组单元格铺浅灰底，和完整行区分开

差值一律按**两源都有的系统**计算。

xrqa 没有名字字段，名字优先取存档 的第 28 列；1999—2000 的 11 列短格式和 1998 及以前的 9 列格式没有名字列，改用 `src/names.ts`，来自 **IBTrACS v04r01** ， 覆盖 AL / EP / CP / WP / IO / SH / SL 七个洋区，共 5604 个编号。这张兜底表在四条路径上都生效： 对照表、`命名` 列表、按名字查询、单系统摘要 （无名低压仍显示 `Nameless`）。

> IBTrACS 的 ATCF 编号与存档文件名同源（`SH021979` ↔ `bsh021979`），南半球按季节年编号， 与存档没有错位。

IBTrACS 把合并过的系统记成 `A:B`（如 `PAT:RUTH`、`BULBUL:MATMO`），这类记录要分两种情况处理：

-   一个组合对应**多个** ATCF 编号时按编号拆开，各自取属于自己的名字。
-   只对应**一个**编号时才当作别名：主名在前，另一个名字放括号，显示成 `Bulbul (Matmo)`。

极少数情况下一个 SID 对应两个 ATCF 编号，于是两个编号会同名。

性质缺失或为 `XX` 时 ACE 只能退化为按风速判定（≥35kt 且落在 00/06/12/18 正点）。

## 判定规则

-   **存在**：查询时刻落在一个系统路径的首条与末条记录之间（含端点）。
-   **快照**：取距离该时刻最近的一条定位，并列时取较早者。
-   **跨年**：同时扫描查询年与上一年，年初仍存活的系统不会被漏掉。
-   输出按风速从高到低排序，超过 `maxResults` 只显示风速最高的若干条。

## 路径图（可选）

打开配置项 `drawImage` 后，每次查询会**额外用 Typhoon4 把查到的系统画在同一张路径图上并发送**：

```
cx 2013.11.07.18
→ 文本：2013.11.07.18Z 共 2 个系统 …
→ 图片：一张含 1331W 与 1330W 全路径的 WPAC 区域图
```

工作方式：

1.  把本次要画的 b-deck 文件复制到独立临时目录，改写 `Settings.ini` 的 `Dir` 指向它（同时关掉图例）
2.  启动 `Typhoon4.exe`，通过窗口消息触发「打开文件」→「全选」→「确定」，程序自动开始绘画
3.  轮询标题栏等待处理完成，触发「保存路径图」并写入文件名
4.  关闭程序、**还原 `Settings.ini`**、清理临时目录
5.  用 GDI+ 把成图等比缩放到 `imageWidth` 宽（原始成图宽 5500–11000px、10–30MB，不适合直接发送）
6.  文本与图片发送完成后删除临时图片；发送失败则保留并在日志中给出路径

启用条件：

-   **仅 Windows**（依赖窗口消息与 GDI+）
-   本机已安装 Typhoon4（`typhoon4Dir` 留空时会在桌面、用户目录等位置有限深度搜索 `Typhoon4.exe`，结果缓存），可从`https://www.natyphoon.top/Download/#Typhoon4`下载
-   `koffi` 依赖可正常加载（若没有可以手动安装）

绘制期间会短暂弹出并自动操作 Typhoon4 窗口，**不要同时手动操作该窗口**；多次查询的绘制任务会自动串行排队。

## 配置项

| 配置 | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `dataDir` | string | 插件内 `data/` | b-deck 数据目录（内含年份子文件夹） |
| `windUnit` | `kt` / `ms` / `both` | `kt` | 风速单位 |
| `minWindKt` | number | `0` | 低于该风速的系统不展示 |
| `includeInvest` | boolean | `true` | 是否包含 60—69 号扰动临时编号 |
| `showPosition` | boolean | `true` | 是否附带定位（纬度 经度） |
| `showSnapshotTime` | boolean | `true` | 快照时间与查询时刻不同步时是否标注 `@` |
| `maxResults` | number | `60` | 单次最多展示数量 |
| `drawImage` | boolean | `false` | **打开后额外绘制查到的系统的路径图并发送** |
| `typhoon4Dir` | string | 空（自动探测） | Typhoon4 程序目录（含 `Typhoon4.exe`、`Settings.ini`） |
| `mapPath` | string | 空（沿用 `Settings.ini`） | 地形图 png 路径 |
| `imageWidth` | number | `1440` | 发送前缩放到的宽度（像素），`0` 表示不缩放 |
| `drawTimeout` | number | `300` | 单张路径图绘制超时（秒） |
| `archiveUrl` | string | dapiya 存档地址 | 「最佳」指令使用的数据存档地址 |

## 数据维护

`data/` 下按年份分文件夹存放 `b<洋区><编号><年份>.txt`（ATCF b-deck，来自于xrq自评）：

```
data/
  1949/bwp011949.txt …
  1979/bsh011979.txt …
  2026/bwp012026.txt …
```

[CyanideCN/xrqa\_bdeck\_data](https://github.com/CyanideCN/xrqa_bdeck_data)，本地统一转成 `.txt` + LF。同步用仓库自带脚本：

```
python tools/sync-xrqa.py --check   # 只看差异
python tools/sync-xrqa.py           # 浅克隆上游并写入 data/
python tools/sync-xrqa.py --from <已克隆目录>   # 不联网，离线同步
```

脚本只增改不删； 同步完把「系统时间 + 上游 commit + 本次新增/更新数量」写进 `data/.sync.json`。

更新数据时直接替换对应年份文件夹即可，插件按年份目录的修改时间自动失效缓存，无需重启。 年份范围由 `data/` 内实际存在的文件夹决定，指令中的年份超出范围会给出提示。

### IBTrACS 补录（data-ibtracs/）

这里补两类「IBTrACS 有、最佳路径存档没有」的系统。

**一、有 ATCF 编号、存档没有的 2265 个。** 拿 IBTrACS 的 ATCF 编号去对存档目录页的文件清单 （`const FN = [...]`），1949—2026 年里有 1232 个编号存档没有收录：SH 754、IO 393、WP 65、EP 10、 AL 6、CP 2、SL 2。存档本身从 1949 年才开始，而 IBTrACS 对更早的历史系统回填了 ATCF 式编号 （最早 1851 年），这些编号不可能出现在存档清单里，全部算缺——1949 年前共 1033 个 （AL 790、WP 94、SH 82、IO 67），两类合计 2265 个。 格式与 `data/` 完全一致（11 列 b-deck），只是在第 5 列把来源写成 `IBTR`

```
data-ibtracs/
  1967/bwp371967.txt
  1973/bal181973.txt
  2015/bls012015.txt           # 人工补录（首行 # 注释），IBTrACS 没收录的南大西洋系统
  2026/bls012026.txt
  sid/1971/1971351S17176.txt   # 没有 ATCF 编号的系统，文件名用 SID
  .sync.json                   # 生成时间、来源、每个系统的定位条数
```

**人工补录（14 个，全是南大西洋）。** 极少数系统两个源都没有，只能从别处找路径。 IBTrACS v04r01 的 SA 列表只有 2004 / 2010 / 2011 三个，2015 年之后 CHM 命名的系统一个都没收， 路径由 `tools/gen-satl.py` 从 Steve Young 的月度路径表抓下来写成 b-deck（编号与取舍见 「逐年 ACE 对照」一节）。这类文件首行写 `#` 注释说明来源与取舍，`tools/sync-ibtracs.py` 清理旧年份目录时会跳过它们（只删首行不是 `#` 的 .txt），所以重跑同步不会丢。它们也不计入 `.sync.json` 的 systems 数（清单里是 2265，磁盘上的 .txt 比它多这 14 个），名字走 `src/names.ts` 的 `SUPPLEMENT_NAMES` 而不是生成的 `STORM_NAMES`。

**二、没有 ATCF 编号的 4860 个。** IBTrACS 全量 13631 个系统里，8636 个带 ATCF 编号，另外 4995 个 没有：3993 个在 1949 年以前，1002 个落在 1949—2026。1949 起的这批去掉 135 个属于别的系统的碎片 （见下），实际 867 个；连同 1949 年前的 3993 个，共 4860 个，合计 190652 条定位。

这 4860 个不进年份目录——它们没有编号，所以单独放在 `sid/<年份>/<SID>.txt`，第 2 列编号写 `00`，其余字段与上面相同。

> 碎片指的是 IBTrACS 把一个台风拆成几段 SID 的情况 按 SID 判「无编号」会把这类续报段当成独立系统。脚本用时空重叠剔除：某个无编号 SID 有 30% 以上的定位点落在另一个有编号 SID 的轨迹 100km 内（同一天前后一天），就判为碎片。

1949 年前的 3993 个来自 HURDAT 回算与地方志整理，只有位置没有强度的占多数。

对只有位置没有风速的系统，生成时逐行按下面的顺序回退，两边独立判断， 都没有就写 0 ：

```
风速  USA_WIND → WMO_WIND → CMA_WIND → TOKYO_WIND → HKO_WIND → KMA_WIND
      → NEWDELHI_WIND → REUNION_WIND → BOM_WIND
气压  USA_PRES → WMO_PRES → CMA_PRES → TOKYO_PRES → HKO_PRES → KMA_PRES
      → NEWDELHI_PRES → REUNION_PRES → BOM_PRES
```

这份数据**不参与**对照表的统计，只作为备用数据。

## 常见问题

### koishi-plugin-xxcx-1 是什么？

TC历史查询插件 · cx 按时刻查询活动系统，xrq/最佳 绘制单系统路径图，对照 出逐年 ACE 对比统计表（xrqa 数据 \+ NaTyphoon 存档）

### 如何安装 koishi-plugin-xxcx-1？

在项目目录运行 npm install koishi-plugin-xxcx-1，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：koishi（^4\.18\.7）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### koishi-plugin-xxcx-1 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### koishi-plugin-xxcx-1 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### koishi-plugin-xxcx-1 可以商用吗？

koishi-plugin-xxcx-1 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### koishi-plugin-xxcx-1 还在维护吗？

最新版本 0\.0\.10 发布于 2026/11/04（1 天前）；至今共发布 9 个版本，其中过去 12 个月发布了 9 个；首次发布于 2026/09/21。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

