agambear25/situational-picture
GitHub: agambear25/situational-picture
一款本地优先、零成本的开源OSINT工具,将冲突数据库、火灾卫星和Sentinel影像等多源公开数据融合为带独立来源置信度评级的统一冲突地图。
Stars: 0 | Forks: 0
# 态势图
### ▶ [**打开实时演示 →**](https://agambear25.github.io/situational-picture/)
*一个真实的、可点击的仪表盘快照——完全在您的浏览器中运行,无需安装。*
**一款开源情报 (OSINT) 工具,它将零散的公开报告转化为一幅**
**值得信赖的冲突地图——专为完全在笔记本电脑上免费运行而构建。**
它读取免费的公开数据——冲突事件数据库、NASA 火/热卫星以及
Sentinel-1/2 影像——计算出哪些报告描述的是*同一个*真实世界的事件,将它们合并
为一个统一的事件地图,并根据有多少**独立**来源实际观测到该事件来对每个事件进行评级。
想象一个内置事实核查机制的新闻社电讯台:输入大量重叠且嘈杂的报告,输出一幅
去重且带有置信度评级的全貌图。
它是**决策支持,而非目标指引**——这条界限在设计中被强制执行,而不仅仅是口头承诺
(参见[设计上的负责任](#responsible-by-design))。
## 它的功能
- **连续的战争时间线。** 涵盖从 2022 年 2 月到
2026 年每个月的约 5,500 起事件,数据源自约 22,000 条真实冲突记录以及火灾和卫星数据。拖动滑块,
观察战线的推移。
- **“重要事件”优先。** 面板根据事件的*严重程度*、
*确认度*、*时效性*和*异常程度*对其进行排序,而不是展示一个扁平的列表——这样少数经过确认的、高风险的事件
就会从成千上万的例行报告中脱颖而出。
- **值得信赖的置信度。** 只有当**独立**类型的来源
达成一致时——例如在同一地点*同时*出现新闻报道*、*卫星探测*和*热特征*,一个事件才会被标记为“已确认”。
十条同一篇通讯稿的副本毫无意义;一个真正独立的第二来源则意义重大。
- **按区域深入挖掘。** 地区 → 区域 → 社区,每个层级都根据当地发生的事件量进行着色,
你可以一直深入到具体的事件。
- **标记您关注的区域。** 在
地图上绘制一个框或描绘一个特征(如河流线、公路走廊),为其命名,该工具会立即提取该区域内发生的所有事件。
- **四种类型的传感器。** 文本(冲突数据库)、热成像(NASA 火灾卫星)、雷达
(Sentinel-1,全天候穿透云层并在夜间工作)和光学(Sentinel-2,用于探测洪水和
火烧痕迹)——达成一致的独立传感器类型越多,置信度就越高。
- **对不确定性保持坦诚。** 每个地图上的点都会显示其置信度;没有任何信息会被悄悄
丢弃;每个事件背后的来源只需点击一下即可查看。
## 截图
操作面板有四个主要视图——**重要事件**(排名信息流)、**按区域**(区域
深度下钻)、**关注区域**(您标记的兴趣区域)和**事件**(可搜索的
时间线)——叠加在带有控制范围覆盖层的卫星底图之上。
**▶ [在浏览器中实时体验 →](https://agambear25.github.io/situational-picture/)** —— 该
演示是真实面板数据的静态快照,因此地图、排名和区域深度下钻
均可直接使用,无需安装任何内容。
## 它解决的有趣问题
与其说它是一个数据流水线,不如说它是一个小型情报引擎。难点在于:
**1. 判定什么是同一个事件。** 同一次炮击可能以新闻报道、
数据库条目和卫星变化的形式出现——且坐标和时间略有不同。引擎
按地点、时间和类型对候选报告进行分组,然后在合并前对每一对报告的*相似度*进行评分。它刻意先进行过度分组,然后再将其拆分,因为**遗漏一个事件**
**比重复更糟糕。**
**2. 客观评定置信度。** 置信度的计算方式确保了**独立**来源可以增强可信度,
但同一来源的**回声**不会。在同一地点对建筑损坏的卫星探测
加上关于袭击的新闻报道,会提升该事件的置信度;而对该新闻报道的转推则不会。
**3. 在引入 AI 的情况下保持可复现性。** 一个小型的**本地**语言模型(无需云服务、无需 API
密钥、成本 $0)用于在真正模棱两可的情况下打破僵局。其判定结果被缓存并标记版本,
因此整个地图可以**随时从原始记录中完全一致地重建**——AI 永远
不会成为无法审计的黑盒。
**4. 在本地读取卫星影像。** 雷达和光学变化检测器在笔记本电脑上运行
(云端仅作为免费的数据接口)。雷达损坏检测器已根据联合国对马里乌波尔的卫星
损坏评估进行了验证;光学燃烧检测器已根据 2022 年 Sviati
Hory 森林火灾进行了验证——33 次燃烧探测,零次洪水误报。
**5. 隐私和伦理内置于数据模型中** —— 见下文。
## 设计上的负责任
- **在任何数据存储之前,位置都会被舍入到约 1km 的网格单元中。** 精确坐标
在入口处即被丢弃。该工具只能说明“阿夫迪夫卡附近发生了一次袭击”,绝不会提供可定位的具体坐标。
- **不包含人员信息。** 数据模型在结构上无法将人员存储为实体——这是一项数据库
约束,而非指导原则。
- **决策支持,而非目标指引**在数据离开系统的边界处被强制执行。
- **许可证合规。** 它从不摄入专有的前线地图数据;“谁控制了什么”的
覆盖层是根据公开知识手工编写的,并明确标注为近似值。
## 构建方式
| 层级 | 技术 |
|---|---|
| 数据存储 | PostgreSQL + PostGIS (地理空间) |
| 后端 | Python, FastAPI (只读 API) |
| 影像 | Google Earth Engine (免费层) 作为数据接口;检测使用 NumPy/SciPy 在本地运行 |
| 僵局打破 AI | 通过 Ollama 运行的本地 LLM (Qwen 2.5),$0 / 离线 |
| 地图 UI | 原生 JavaScript + Leaflet (无构建步骤) |
| 地理信息 | OpenStreetMap + geoBoundaries (行政区域),MGRS 1km 网格 |
该引擎是**确定性和可重放的**:相同的原始记录始终能重建相同的地图,
这通过一项自动化测试进行了验证,该测试会重新运行整个流水线并检查结果是否
逐位一致。约 130 项测试把关每一次更改。
## 数据来源(均免费、均公开)
UCDP(冲突事件,CC-BY) · NASA FIRMS(火灾/热成像) · Copernicus Sentinel-1 和 Sentinel-2
(卫星影像) · UNOSAT(损坏评估,用作真实真值) · OpenStreetMap +
geoBoundaries(地理信息)。
## 运行说明
需要 PostgreSQL 17 + PostGIS、Python 3.11+,以及(可选)用于打破僵局的 AI 的 Ollama。
```
# Database
createdb osint_cop && psql osint_cop -c "CREATE EXTENSION postgis; CREATE EXTENSION vector;"
psql osint_cop -f db/migrations/0001_extensions.sql # ... through the latest migration
psql osint_cop -f db/roles.sql
# Python
python -m venv .venv && .venv/bin/pip install -e ".[full]"
# 构建 1km grid + 加载 geography/admin substrate
.venv/bin/python -m grid.cli build --theater ua_donbas
bash scripts/fetch_admin.sh # region/district/community boundaries
bash scripts/fetch_ucdp_donbas.sh # the 2022–2026 conflict chronology
# 将 raw records 转换为 map,然后对重要内容进行评分
.venv/bin/python -m fusion.run --theater ua_donbas
.venv/bin/python -m assess.run --theater ua_donbas
# 在 http://127.0.0.1:8000/ui/ 提供 board 服务
.venv/bin/uvicorn api.main:app --port 8000
```
使用 `pytest -q` 和 `python -m eval.harness` 运行测试套件和确定性检查。
## 诚实的局限性
- **单一精选战区。** 该流水线与区域无关,但目前仅完整加载了顿巴斯地区的数据。
- **多时间跨度,而非实时。** 冲突数据库有数周的延迟;卫星影像受限于过境频率
和云层遮挡;只有热数据是近实时的。面板如实反映了这种混合状态。
- **目前使用经典检测器。** 卫星检测器是确定性的基线;虽然设计上预留了深度
学习变化模型,但目前并未作为默认选项。
- **控制层覆盖图仅供示意** —— 为城市级别和近似值,根据公开
知识编写,明确*不是*实时前线。
## 项目布局
```
ingest/ read public feeds + run the imagery detectors → an append-only record log
fusion/ group, score, and merge records into confidence-rated events (the engine)
assess/ rank what matters + flag anomalies, exposure, and collection gaps
api/ + web/ read-only API and the operator map UI
geo/ grid/ the 1km grid, admin regions, and geography substrate
eval/ the determinism gate + the satellite-detector validators
docs/superpowers/specs/ design write-ups and the build checkpoint
```
*作为一个作品集项目构建,旨在探索一款严谨、诚实、成本 $0/本地化的情报工具仅依靠*
*公开数据能走多远。不附属于任何政府或供应商。*
标签:AI风险缓解, ESC4, HTTP/HTTPS抓包, OSINT, 地理信息系统, 态势感知, 情报分析, 数据可视化, 测试用例, 网络诊断, 逆向工具