shuishen
2026-08-17 4092854b0bea9e1fc02f29222c6f7cd876e565a5
capabilities/15-trajectory-analysis/README.md
@@ -106,15 +106,41 @@
| pandas / GeoPandas / Shapely / scikit-learn | BSD 3-Clause 系列许可证 |
| PyProj | MIT;同时需遵守其随附 PROJ 数据/组件许可 |
| Matplotlib | Matplotlib License;随附字体等资产有各自许可证 |
| openpyxl 3.1.5 | MIT;仅用于读取用户提供的 XLSX 飞行日志 |
| Demo 数据 | 由本仓库脚本生成,无第三方数据集或模型权重 |
| 预训练模型/权重 | 无 |
以上是开发阶段记录,不等于已完成产品商用法务审查。
## 真实单例:田墩飞行任务 19578
用户提供的原始 XLSX、DJI WPMZ KMZ 和禁飞区 GeoJSON 保持在 `shared/data/raw/15-trajectory-analysis/tian-dun-demo-20260814/`,不会被脚本改写。使用以下命令生成可审计的处理输入,再运行单例分析:
```powershell
$py = '.\.venvs\15-trajectory-analysis\Scripts\python.exe'
& $py .\capabilities\15-trajectory-analysis\prepare_real_flight.py
& $py .\capabilities\15-trajectory-analysis\run_trajectory_analysis.py `
  --input .\shared\data\processed\15-trajectory-analysis\tian-dun-flight-19578\tian-dun-flight-19578.case.json `
  --output .\shared\outputs\15-trajectory-analysis\tian-dun-flight-19578
```
预处理器会将 Excel 的本地无时区时间按 `Asia/Shanghai` 解释后转换为 UTC,提取 `waylines.wpml` 中的 10 个 WGS84 航点,并从 2,300 个禁飞区源要素中按飞行/航线周边 5 km 筛选、合并为一个局部区域。点状区域按原始 `radius` 转为米制缓冲区;源数据的 `no-fly` 被映射为规则输入 `restricted`,只用于技术空间评估。适飞区 Gzip 已验证为 46,518 个闭合坐标环的 `int32 / 1e7` 流,田墩周边筛出 2 个适飞面;它只用于可视化,不参与禁入规则判定。
已验证的真实单例有 233 个观测点、1 条无人机轨迹,运行耗时 0.338 秒。输出报告 2 段偏航(77 秒、175 秒)和 1 个持续 464 秒的区域相交事件;没有停留或聚集事件。实飞点到计划线的最小/平均/最大距离为 0.0 / 221.0 / 540.8 m。两段偏航分别覆盖起飞接近计划线之前和自动返航/降落阶段,计划航线未表达这些飞行阶段,因此不能直接将其作为异常结论。区域相交仅代表与名为“三清山”的源区域(`no-fly-40001494`)发生空间相交,不是法规或运营违规认定。
处理输入位于 `shared/data/processed/15-trajectory-analysis/tian-dun-flight-19578/`;结果位于 `shared/outputs/15-trajectory-analysis/tian-dun-flight-19578/tian-dun-flight-19578/`,包括轨迹、计划航线、禁飞区、适飞区和事件 GeoJSON,以及 `analysis.png`。本地控制台的“田墩实飞”案例可直接查看这些结果;地图以 ArcGIS 影像为底图,并可在 `apps/workbench-console/.env.local` 配置 `VITE_TIANDITU_TOKEN` 叠加天地图影像和注记。
## 已知限制与下一步
- 2026-08-14 已归档一组用户提供的田墩真实原始资料至 `shared/data/raw/15-trajectory-analysis/tian-dun-demo-20260814/`:禁飞区 GeoJSON、适飞区 Gzip 二进制源文件、DJI WPMZ 航线 KMZ 与实际飞行 Excel。原文件保持未改名、未转换状态,当前尚未纳入分析结果。
- `prepare_real_flight.py` 已支持此批 XLSX、KMZ、禁飞 GeoJSON 与适飞区 Gzip 的单例准备。适飞区的二进制几何已验证为闭合坐标环,但其发布日期、授权方和运营语义仍未独立核验,当前只用于可视化,不参与规则判断。当前区域规则只识别 `zone_type=restricted`,不能把 `no_fly` 标签直接等同为已验证的禁入事件。
- 合成样本只能验证程序逻辑,不能证明真实场景准确率;目前没有可报告的真实误报率和漏报率。
- 聚集要求时间戳对齐,GPS 漂移、采样频率和轨迹断点会直接影响结果。
- 偏航依赖可信参考路线;禁入区依赖有效区域数据;不同人员、车辆、船舶和无人机需要分别标定阈值。
- 下一步应先选 1 个正常、1 个困难的脱敏实测轨迹,人工标注事件,再评估误报、漏报和阈值,而不是直接跑大目录。
- 若输入来自无人机视频,还需在此能力之前引入独立的多目标跟踪器,并验证 ID 切换问题。
## 控制台输入转换
本地实验控制台支持直接上传用户常见的 `XLSX` 飞行日志、`KMZ` DJI WPMZ 航线、禁飞区 `GeoJSON`,以及可选适飞区 `Gzip`。服务端会在固定的轨迹虚拟环境中调用 `prepare_real_flight.py` 和 `run_trajectory_analysis.py`,把文件转换成 Demo 的 `case.json`、WGS84 轨迹和 GeoJSON 输出。适飞区缺省时仍可分析,地图只是不显示适飞区图层。
每次运行使用新的 `trajectory-<UTC时间>-<随机串>` 编号,原始输入不会被覆盖;控制台案例库会自动扫描 `shared/outputs/15-trajectory-analysis`,行为标签在界面显示中文释义,结构化文件继续保存英文键值,便于程序处理。