From f67d43a43f6c3e58922e3c2f457dd9caafebfc67 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Fri, 14 Aug 2026 14:20:22 +0800
Subject: [PATCH] feat:具体能力实现处理

---
 capabilities/15-trajectory-analysis/README.md |  122 +++++++++++++++++++++++++++++++++++++++-
 1 files changed, 118 insertions(+), 4 deletions(-)

diff --git a/capabilities/15-trajectory-analysis/README.md b/capabilities/15-trajectory-analysis/README.md
index 708e568..a206d9a 100644
--- a/capabilities/15-trajectory-analysis/README.md
+++ b/capabilities/15-trajectory-analysis/README.md
@@ -1,6 +1,120 @@
-# Trajectory Analysis
+# 轨迹分析与行为识别
 
-- 输入:带时间戳的无人机、车辆、人员或船舶轨迹。
-- 输出:偏航、越界、聚集、停留和轨迹类别。
-- 首个 Demo:规则检测加轨迹聚类。
+状态:首个 CPU Demo 已验证(2026-08-14)。
 
+## 能力边界
+
+当前 Demo 归为 **C(产品业务能力)**,不是 `geoai-py` 内置功能:
+
+- 产品实现用 GeoPandas、Shapely、PyProj 和 scikit-learn 完成轨迹度量、空间关系计算、DBSCAN 分组和规则判断。仅使用这些生态库、但没有实际调用 `geoai-py`,不能标为 B。
+- `geoai-py` 的准确角色是上游来源之一:其目标检测和地理结果导出可为跟踪系统提供观测,但 `geoai-py 0.42.0` 没有轨迹、目标跟踪或行为识别 API。本 Demo 运行时因此不安装或调用 `geoai-py`。
+
+未来若把 `geoai-py` 检测/导出、独立多目标跟踪器和本规则服务连成完整流水线,流水线可同时包含 A、B、C;当前已实现并验证的部分仍是 C。
+
+首版所称“行为识别”是可解释的时空规则,不是视频动作识别模型,也不负责把逐帧检测框关联成轨迹 ID。
+
+## Demo 契约
+
+输入是一个 `*.case.json` 清单,引用三类真实业务可导出的文件:
+
+1. 轨迹点 CSV:固定字段 `track_id,entity_type,timestamp,longitude,latitude`。
+2. 参考路线 GeoJSON:每条 `LineString` 带 `track_id`。
+3. 区域 GeoJSON:每个面带 `zone_id` 和 `zone_type`;首版识别 `restricted`。
+
+首版只接受带有效 CRS 的 WGS84 经纬度(`EPSG:4326`)。每条轨迹至少需要两个不同时间戳;同一轨迹的重复时间戳保留最后一条并在元数据中计数。
+
+仓库没有用户实测轨迹,因此 [generate_demo_inputs.py](./generate_demo_inputs.py) 会生成两组小型、可审计的合成代表样本:
+
+- `normal`:2 条连续移动且贴合参考路线的轨迹,预期无事件。
+- `difficult`:3 条乱序轨迹,含 1 条重复观测,以及可人工核对的停留、偏航、禁入区和双人聚集。
+
+生成数据位于 `shared/data/raw/15-trajectory-analysis/`,不会提交 Git。真实验证仍需用户提供同结构的脱敏轨迹。
+
+## 环境与运行
+
+```powershell
+# Python 3.12 隔离环境
+powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\setup.ps1 -Capability 15-trajectory-analysis
+
+$py = '.\.venvs\15-trajectory-analysis\Scripts\python.exe'
+
+# 第一次生成验收输入
+& $py .\capabilities\15-trajectory-analysis\generate_demo_inputs.py
+
+# 分析目录内的 normal.case.json 和 difficult.case.json
+& $py .\capabilities\15-trajectory-analysis\run_trajectory_analysis.py
+
+# 只分析一个用户清单;输出仍放在 <output>/<case_id>/
+& $py .\capabilities\15-trajectory-analysis\run_trajectory_analysis.py `
+  --input .\path\to\my.case.json `
+  --output .\shared\outputs\15-trajectory-analysis\my-run
+```
+
+脚本默认拒绝覆盖已有输入和结果。只有明确要替换此前运行时才传 `--overwrite`。
+
+## 规则与输出
+
+默认规则:
+
+| 事件 | 条件 |
+| --- | --- |
+| 停留 `stop` | 速度不高于 0.8 m/s,持续至少 60 秒 |
+| 偏航 `route_deviation` | 到参考路线距离大于 25 m,持续至少 20 秒 |
+| 禁入区 `restricted_zone` | 轨迹点落入 `restricted` 面 |
+| 聚集 `gathering` | 至少 2 条轨迹在 20 m 内,持续至少 30 秒 |
+
+清单可用 `thresholds` 对象覆盖上述阈值。相邻观测超过 60 秒时事件连续段会断开,避免把长时间数据缺失误算为持续行为。
+
+每个案例固定输出:
+
+| 文件 | 内容 |
+| --- | --- |
+| `trajectory_summary.csv` | 每条轨迹的时间、距离、速度、偏航比例、停留/禁入时长、聚类 ID 和行为标签 |
+| `events.json` | 固定事件字段、参与轨迹、起止时间、位置和规则细节 |
+| `trajectories.geojson` | WGS84 轨迹线及汇总属性 |
+| `events.geojson` | WGS84 事件点及事件属性 |
+| `analysis.png` | 轨迹、参考路线、区域和不同形状事件标记 |
+| `run_metadata.json` | Python/依赖版本、规则/模型、阈值、CPU、输入数、耗时、清洗数和限制 |
+
+DBSCAN 只对轨迹汇总特征做探索性分组;`cluster_id=-1` 表示没有足够相似轨迹形成簇,不代表异常已被确认。
+
+## 已测验收结果
+
+运行环境:Python 3.12.10、CPU;`pip check` 通过。目录级运行处理 2 个案例、5 条轨迹和 78 条去重后观测,总耗时约 2.8 秒。
+
+| 验收项 | 预期 | 实测 |
+| --- | --- | --- |
+| 正常样本 | 2 条轨迹,0 个事件 | 通过:2 条轨迹,0 个事件 |
+| 困难样本清洗 | 乱序可排序,删除 1 条重复时间观测 | 通过:删除 1 条 |
+| 困难样本行为 | 四类事件各至少 1 个 | 通过:停留、偏航、禁入区、聚集各 1 个 |
+| 失败处理 | 缺少必填 CSV 字段时退出码为 2,并指出字段 | 通过 |
+| 输出完整性 | 每个案例生成 6 个非空文件 | 通过 |
+| 视觉检查 | 正常/困难 PNG 非空,轨迹、区域和事件可区分 | 通过;两张图均为 1400 x 980 |
+
+自动验收:
+
+```powershell
+$py = '.\.venvs\15-trajectory-analysis\Scripts\python.exe'
+& $py -m unittest discover -s .\capabilities\15-trajectory-analysis\tests -v
+```
+
+## 许可证
+
+| 项目 | 当前记录 |
+| --- | --- |
+| `geoai-py 0.42.0` | MIT;仅为可选上游,本 Demo 环境未安装 |
+| pandas / GeoPandas / Shapely / scikit-learn | BSD 3-Clause 系列许可证 |
+| PyProj | MIT;同时需遵守其随附 PROJ 数据/组件许可 |
+| Matplotlib | Matplotlib License;随附字体等资产有各自许可证 |
+| Demo 数据 | 由本仓库脚本生成,无第三方数据集或模型权重 |
+| 预训练模型/权重 | 无 |
+
+以上是开发阶段记录,不等于已完成产品商用法务审查。
+
+## 已知限制与下一步
+
+- 合成样本只能验证程序逻辑,不能证明真实场景准确率;目前没有可报告的真实误报率和漏报率。
+- 聚集要求时间戳对齐,GPS 漂移、采样频率和轨迹断点会直接影响结果。
+- 偏航依赖可信参考路线;禁入区依赖有效区域数据;不同人员、车辆、船舶和无人机需要分别标定阈值。
+- 下一步应先选 1 个正常、1 个困难的脱敏实测轨迹,人工标注事件,再评估误报、漏报和阈值,而不是直接跑大目录。
+- 若输入来自无人机视频,还需在此能力之前引入独立的多目标跟踪器,并验证 ID 切换问题。

--
Gitblit v1.9.3