Syntax-Error-1337/radar

GitHub: Syntax-Error-1337/radar

一个聚合航班、船舶、GPS干扰、威胁警报和网络情报的实时地理空间态势感知平台。

Stars: 0 | Forks: 0

# RADAR — 地理空间情报平台
![Version](https://img.shields.io/badge/version-2.0.0-blue?style=flat-square) ![React](https://img.shields.io/badge/React-19-61DAFB?style=flat-square&logo=react) ![TypeScript](https://img.shields.io/badge/TypeScript-5.9-3178C6?style=flat-square&logo=typescript) ![Node.js](https://img.shields.io/badge/Node.js-20-339933?style=flat-square&logo=nodedotjs) ![MapLibre](https://img.shields.io/badge/MapLibre_GL_JS-5.x-396CB2?style=flat-square) ![License](https://img.shields.io/badge/license-MIT-green?style=flat-square) **一个实时地理空间情报平台,用于追踪飞机、海事船只、GPS 干扰、冲突区域和活跃威胁警报。** [功能特性](#-features) • [架构](#-architecture) • [快速开始](#-quick-start) • [API](#-api-reference) • [贡献指南](CONTRIBUTING.md)
## 概述 **RADAR** 是一个全栈地理空间情报仪表板,聚合来自多个来源的实时数据,在六个情报领域提供全面态势感知: - **✈️ 航班追踪** — 通过 ADS-B 数据获取实时飞机位置 - **🚢 船舶追踪** — 通过 AIS 流获取全球船舶追踪 - **🛡️ 网络情报** — 通过 Cloudflare Radar 获取互联网安全指标 - **🌍 OSINT 监控** — 地理定位新闻源和 AI 驱动的情报简报 - **📡 GPS 干扰** — 使用 H3 六边形网格的全球 GPS 干扰热力图 - **🚨 威胁警报** — 实时火箭/UAV 警报(以色列)和阿联酋地区威胁警报(GulfWatch) 基于 React 19、TypeScript、Express.js 和 MapLibre GL JS 构建 — 提供高性能、军用风格界面,支持三种视觉模式(EO/FLIR/CRT)。 ## ✨ 功能特性 ### ✈️ 航班追踪模块 - 来自 ADSB.lol(社区馈送,无需认证)或 OpenSky Network 的 **实时 ADS-B 数据** - **丰富的遥测数据** — 气压/几何高度、速度、航向、垂直速率、应答机代码、马赫数、IAS、TAS、滚转角、风速/风向、OAT/TAT、导航模式、RSSI - **飞机信息增强** — 注册号、制造商、型号、运营商、类型代码、制造年份(DuckDB + Parquet 数据库) - **航路历史可视化**,包含起飞机场数据 - 通过可配置边界框进行 **地理过滤** - **地面/空中检测**,具有视觉区分 - **紧急应答机高亮**(7500, 7600, 7700) - **地球与墨卡托投影** — 在 3D 和平面视图之间切换 ### 🚢 船舶追踪模块 - 通过持久 WebSocket 连接到 `wss://stream.aisstream.io` 的 **实时 AIS 流** - **完整的 AIS 消息支持** — 位置报告(A/B 类)、船舶静态数据、基站报告、SAR 飞机、助航设备、安全广播 - **船舶详情** — MMSI、名称、呼号、船舶类型、目的地、SOG、COG、航向、航行状态 - **历史航迹渲染** — 每艘船最近 150 个位置点 - **陈旧船只清理** — 30 分钟不活动后自动清理 - **自动重连** — WebSocket 断开后 5 秒退避重连 - **状态端点** — 实时连接健康状况、船只数量、消息统计 ### 📡 GPS 干扰模块 - 使用 H3 分辨率 4 六边形网格的 **全球干扰热力图** - 每日数据集自动从 GPSJam.org 下载(本地 CSV 缓存) - **干扰比率可视化** — 每个网格单元内良好与不良飞机信号计数 - **日期选择器** — 浏览数周前的历史数据集 - **自动回填** — 服务器启动时下载缺失的每日数据集 - **统计端点** — 按日期汇总(总网格数、可疑标记、高干扰网格数) ### 🚨 威胁警报 — OSINT 监控模块 一个包含四个实时情报面板的实时威胁监控仪表板: #### GPS 干扰小部件 - 来自最新数据集的实时干扰统计 - 高干扰网格数量和覆盖区域 #### 火箭警报小部件(以色列) - **数据源**:`agg.rocketalert.live` — 实时火箭和 UAV 警报突发 - 显示活跃区域、警报类型(火箭 vs UAV)、倒计时秒数、希伯来语和英语名称 - **地图图层**:根据警报坐标定位的圆形标记,红色(火箭)/ 橙色(UAV) - 点击任意标记查看完整弹窗:EN/HE 名称、区域、倒计时、坐标、时间戳 - 24 小时总计和 7 天每日趋势图 #### GulfWatch 小部件(阿联酋) - **数据源**:`gulfwatch-api.onrender.com` — 阿联酋酋长国的区域威胁警报 - 显示活跃酋长国、警报类型、严重程度(warning/watch)、描述、开始/过期时间 - **地图图层**:酋长国多边形填充 + 质心标记;按严重程度着色 - 点击任意多边形或标记查看完整弹窗:EN/AR 名称、描述、严重程度、来源计数、时间线 #### AI 洞察面板 - 通过 OpenRouter API 获取 **LLM 驱动的情报简报** - 从截获的新闻标题生成军用风格摘要 - 使用 Google Gemini 2.5 Flash 进行区域上下文感知分析 #### 实时新闻面板 - 来自 56,000+ 行数据库(190+ 个国家)的 **地理定位 RSS 源** - 获取特定区域的新闻(地缘政治、国防、本地来源) - 如果没有本地匹配,则回退到国际源(Reuters, AP, BBC) ### 🛡️ 网络情报模块 由 **Cloudflare Radar API** 驱动: - **DDoS 攻击来源** — 发起 Layer 7 攻击的主要国家 - **流量异常** — 互联网路由异常和 BGP 事件 - **热门域名** — 按流量排序的最受欢迎网站 - **攻击向量** — HTTP 方法分布、机器人分类 - **ASN 排名** — 自治系统活动 - **时间序列可视化** — 交互式图表和热力图 ### 🎨 显示模式 可从导航栏选择的三种视觉主题: | 模式 | 描述 | | -------- | ------------------------------------------------- | | **EO** | 光电 — 简洁的深色界面(默认) | | **FLIR** | 前视红外 — 热成像调色板 | | **CRT** | 阴极射线管 — 复古荧光绿美学 | ## 🏗️ 架构 ### 项目结构 ``` intelmap/ ├── client/ # React 19 + Vite frontend (port 5173) │ └── src/ │ ├── app/ # Entry point, routes, providers │ ├── modules/ │ │ ├── flights/ # ADS-B aircraft tracking │ │ ├── maritime/ # AIS vessel tracking │ │ ├── monitor/ # OSINT + threat alert hub │ │ │ ├── components/ # Map layers & widgets │ │ │ │ ├── GPSJammingLayer.tsx │ │ │ │ ├── RocketAlertLayer.tsx │ │ │ │ ├── GulfWatchLayer.tsx │ │ │ │ ├── layerIds.ts # shared layer ID constants │ │ │ │ └── widgets/ # dashboard panel components │ │ │ └── hooks/ # React Query data hooks │ │ ├── cyber/ # Cloudflare Radar integration │ │ └── osint/ # Shared OSINT components │ ├── ui/ │ │ ├── layout/ # TopNav, shell components │ │ └── theme/ # EO/FLIR/CRT mode + projection state │ └── core/ # Query client, providers │ └── server/ # Express.js backend (port 3001) └── src/ ├── core/ │ ├── source/ │ │ ├── adsblol.ts # ADSB.lol polling + cache │ │ ├── opensky.ts # OpenSky fallback │ │ ├── aisstream.ts # AISStream WebSocket singleton │ │ ├── cloudflare.ts # Cloudflare Radar API client │ │ ├── gpsjam.ts # GPSJam CSV ingestion + H3 query │ │ ├── rocketalert.ts # Rocket/UAV alert polling │ │ └── gulfwatch.ts # UAE GulfWatch alert polling │ ├── aircraft_db.ts # DuckDB/Parquet aircraft enrichment │ ├── scheduler.ts # Cron-like job runner for data ingestion │ └── cache.ts # TTL cache utility ├── routes/ │ ├── flights.ts # GET /api/flights/* │ ├── maritime.ts # GET /api/maritime/* │ ├── monitor.ts # GET /api/monitor/* (GPS jamming, alerts) │ ├── geo.ts # GET /api/geo/* (news, intel briefs) │ └── cyber.ts # GET /api/cyber/* (Cloudflare proxy) ├── Data/ │ └── gpsjam/ # Daily GPS interference CSVs + manifest ├── types/ # TypeScript definitions ├── news_feeds.json # 56k+ line RSS database (190+ countries) └── index.ts # Server entry point + scheduler bootstrap ``` ### 技术栈 | 层级 | 技术 | | ------------------ | ------------------------------------ | | 前端框架 | React 19 + Vite 7 + TypeScript 5.9 | | 地图渲染 | MapLibre GL JS 5 via react-map-gl 8 | | 状态管理 | Zustand 5 | | 数据获取 | TanStack Query v5 | | 样式 | Tailwind CSS v4 | | 图标 | Lucide React | | 后端运行时 | Node.js 20 + Express 4 | | 飞机数据库 | DuckDB + Parquet | | 海事流 | WebSocket (`ws` library) | | H3 空间索引 | H3-js (Uber H3 hex grid) | | RSS 解析 | rss-parser | | 地理定位 | which-country + i18n-iso-countries | | 构建工具 | `concurrently` (monorepo dev runner) | ## 🚀 快速开始 ### 前置条件 - **Node.js** v20 或更高版本 - **npm** v9 或更高版本 ### 1. 安装依赖 ``` npm run install:all ``` 这将同时安装 `client` 和 `server` 工作区的依赖。 ### 2. 配置环境变量 #### 服务端 — `server/.env` ``` cp server/.env.example server/.env nano server/.env ``` **必需的 API Keys:** | 服务 | 变量 | 获取地点 | 成本 | | ---------------- | ------------------------ | ---------------------------- | ------------- | | AISStream | `AISSTREAM_API_KEY` | https://aisstream.io | 免费层 | | OpenRouter (LLM) | `OPENROUTER_API_KEY` | https://openrouter.ai/keys | 按量付费 | | Cloudflare Radar | `CLOUDFLARE_RADAR_TOKEN` | https://dash.cloudflare.com/ | 免费 | **可选:** ``` # Flight 数据源 (默认: adsblol — 无需密钥) FLIGHT_DATA_SOURCE=adsblol # ADSB.lol 查询的地理中心 ADSB_LOL_LAT=0 ADSB_LOL_LON=0 ADSB_LOL_RADIUS=25000 # nautical miles (25000 ≈ global) # OpenSky 备用 (可选, 需要账号) # OPENSKY_CLIENT_ID=your_email@example.com # OPENSKY_CLIENT_SECRET=your_secret_here ``` #### 客户端 — `client/.env` ``` cp client/.env.example client/.env ``` ``` # Flight 数据提供商: "adsblol" | "opensky" | "mock" VITE_FLIGHT_PROVIDER=adsblol ``` ### 3. 运行开发服务器 ``` npm run dev ``` 这将启动: - **前端** → http://localhost:5173 - **后端** → http://localhost:3001 - **健康检查** → http://localhost:3001/health ## 🌐 API 参考 所有路由由 Express 后端在端口 `3001` 上提供服务。 ### 航班 | Method | Endpoint | 描述 | | ------ | ---------------------------- | ---------------------------------------------- | | `GET` | `/api/flights/states` | 所有追踪的飞机,类型为 `AircraftState[]` | | `GET` | `/api/flights/track/:icao24` | 按 ICAO24 hex 获取特定飞机的航路路径 | ### 海事 | Method | Endpoint | 描述 | | ------ | ---------------------------- | ----------------------------------------------- | | `GET` | `/api/maritime/snapshot` | 所有实时船只(位置/航向,无历史) | | `GET` | `/api/maritime/vessel/:mmsi` | 包含位置历史的完整船只详情 | | `GET` | `/api/maritime/status` | WebSocket 健康状况、船只数量、消息统计 | ### 监控 — GPS 干扰 | Method | Endpoint | 描述 | | ------ | ----------------------------------- | ------------------------------------------------------------- | | `GET` | `/api/monitor/gps-jamming` | H3 干扰网格单元(`?date=`、`?minInterference=`、`?h3=`) | | `GET` | `/api/monitor/gps-jamming/dates` | 可用的数据集日期 | | `GET` | `/api/monitor/gps-jamming/stats` | 按日期的干扰统计(`?date=`) | | `POST` | `/api/monitor/gps-jamming/backfill` | 手动触发数据集回填(`{limit?}`) | ### 监控 — 火箭警报 | Method | Endpoint | 描述 | | ------ | ------------------------------------ | ----------------------------------------------- | | `GET` | `/api/monitor/rocket-alerts` | 实时突发摘要 + 24 小时总计 + 7 天每日计数 | | `GET` | `/api/monitor/rocket-alerts/history` | 按警报记录(`?hours=24&alertTypeId=-1`) | | `GET` | `/api/monitor/rocket-alerts/daily` | 按日计数(`?days=7&alertTypeId=-1`) | ### 监控 — GulfWatch(阿联酋) | Method | Endpoint | 描述 | | ------ | ---------------------------------------- | ------------------------------------ | | `GET` | `/api/monitor/gulf-watch/alerts` | 活跃的阿联酋威胁警报摘要 | | `GET` | `/api/monitor/gulf-watch/alerts/history` | 警报历史(`?limit=50&offset=0`) | | `GET` | `/api/monitor/gulf-watch/geojson` | 阿联酋酋长国 GeoJSON(1 小时缓存) | ### 地理 (OSINT) | Method | Endpoint | 描述 | | ------ | ---------------------- | ------------------------------------------------------------------- | | `GET` | `/api/geo/news` | 地理定位的 RSS 新闻源(`?lat=&lon=&category=`) | | `POST` | `/api/geo/intel-brief` | 从新闻标题生成的 LLM 情报简报(`{news: [], lat, lon}`) | ### 网络 | Method | Endpoint | 描述 | | ------ | -------------------- | ---------------------------------------------------------------------- | `GET` | `/api/cyber/radar/*` | Cloudflare Radar API 代理(例如 `/attacks/layer7/top/locations`) | ### 系统 | Method | Endpoint | 描述 | | ------ | --------- | -------------------------- | | `GET` | `/health` | 返回 `{ status: "ok" }` | ## 🔌 数据来源 ### ADSB.lol(航班) - **URL**:`https://api.adsb.lol/v2/point/{lat}/{lon}/{radius}` - **认证**:无需(社区运营,免费) - **轮询**:后端 3 秒 TTL 缓存 ### AISStream.io(海事) - **URL**:`wss://stream.aisstream.io/v0/stream` - **认证**:需要 API Key(免费层) - **覆盖范围**:全球边界框 `[[-90, -180], [90, 180]]` - **内存**:每艘船最多 150 个历史点;陈旧船只在 30 分钟后清除 ### GPSJam.org(GPS 干扰) - **URL**:`https://gpsjam.org/data/{date}-h3_4.csv` - **认证**:无需(公开数据集) - **格式**:包含 H3 六边形索引、每个网格单元良好/不良飞机计数的 CSV - **计划**:通过服务器调度器每日自动下载新数据集 ### Rocket Alert Live(威胁警报 — 以色列) - **URL**:`https://agg.rocketalert.live/api/v1/` - **认证**:无需(公开 API) - **数据**:带有坐标、希伯来语/英语名称、倒计时的实时火箭和 UAV 警报突发 ### GulfWatch(威胁警报 — 阿联酋) - **Alerts API**:`https://gulfwatch-api.onrender.com/api` - **GeoJSON**:`https://gulfwatch.ai/data/uae-emirates.geojson` - **认证**:无需 - **数据**:带有严重程度、类型、描述的活跃酋长国级别威胁警报 ### Cloudflare Radar(网络) - **URL**:`https://api.cloudflare.com/client/v4/radar/*` - **认证**:Bearer Token(免费) - **端点**:50+ 指标(DDoS, BGP, DNS, HTTP, 邮件安全) ### RSS 新闻源(OSINT) - **来源**:`server/src/news_feeds.json`(56,934 行) - **覆盖范围**:190+ 个国家,按国防、地缘政治、经济、本地分类 - **回退**:对于未覆盖区域使用 Reuters, AP, BBC ## 🐳 Docker 部署 ``` # 构建镜像 npm run docker:build # 运行容器 npm run docker:run # 或者使用 docker-compose npm run docker:compose:build ``` ``` services: intelmap: build: . ports: - '3001:3001' env_file: - ./server/.env restart: unless-stopped ``` ## 🛠️ 可用脚本 | 命令 | 描述 | | ------------------------ | ------------------------------------------------ | | `npm run dev` | 在开发模式下同时启动客户端和服务端 | | `npm run install:all` | 安装所有工作区依赖 | | `npm run build` | 构建生产包(客户端 + 服务端) | | `npm run build:client` | 仅构建前端 | | `npm run build:server` | 仅构建后端 | | `npm run start` | 运行生产服务器(构建后) | | `npm run lint` | 在客户端运行 ESLint | | `npm run format` | 使用 Prettier 格式化所有文件 | | `npm run type-check` | 运行 TypeScript 类型检查(不发射) | | `npm run docker:build` | 构建 Docker 镜像 | | `npm run docker:compose` | 使用 docker-compose 启动 | ## 📁 关键文件 | 文件 | 描述 | | ---------------------------- | --------------------------------------- | | `package.json` | Monorepo 工作区配置 | | `client/.env.example` | 前端环境模板 | | `server/.env.example` | 后端环境模板 | | `server/src/news_feeds.json` | 56k+ 行 RSS 数据库(190+ 国家) | | `server/src/Data/gpsjam/` | 每日 GPS 干扰 CSV 数据集 | | `Dockerfile` | 多阶段生产构建 | | `docker-compose.yml` | 编排配置 | ## 🧪 Mock/离线模式 要在没有 API 依赖的情况下运行航班模块: 1. 编辑 `client/.env`: VITE_FLIGHT_PROVIDER=mock 2. 重启开发服务器。使用内置的 `flights_sample.json` 固定数据。 **注意:** 海事、GPS 干扰、警报和网络模块需要实时 API 连接。 ## 🗺️ 地图投影 通过 **VIEW** 按钮在两种渲染模式之间切换: - **Mercator** — 标准平面 2D 投影(最适合区域细节) - **Globe** — 3D 球面投影(最适合全球感知) ## 🔒 安全说明 - **永远不要提交 `.env` 文件** — 仅使用 `.env.example` 模板 - **所有密钥都在服务端** — 前端仅接收预处理后的数据 - **CORS**:目前为开发环境配置较宽松;生产环境中需限制 - **速率限制**:尚未实现;在公开部署前添加中间件 - 如果您不小心在 git 历史记录中泄露了密钥,请**立即轮换密钥** 请参阅 [SECURITY.md](SECURITY.md) 以报告漏洞。 ## 🤝 贡献 我们欢迎各种贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解指南。 **快速检查清单:** - Fork 本仓库 - 创建功能分支(`git checkout -b feature/amazing-feature`) - 提交更改(`git commit -m 'feat: add amazing feature'`) - 推送到分支(`git push origin feature/amazing-feature`) - 发起 Pull Request ## 📄 许可证 本项目基于 **MIT 许可证** 授权 — 详情请参阅 [LICENSE](LICENSE)。 ## 🙏 致谢 - **ADSB.lol** — 社区馈送的 ADS-B 网络 - **AISStream.io** — 免费的海事 AIS WebSocket API - **GPSJam.org** — 开放 GPS 干扰数据集 - **Rocket Alert Live** — 实时以色列警报 API - **GulfWatch** — 阿联酋区域威胁监控 - **Cloudflare Radar** — 互联网安全指标 - **MapLibre GL JS** — 开源地图渲染 ## 📞 支持 - **Issues**: [GitHub Issues](https://github.com/Syntax-Error-1337/radar/issues) - **Discussions**: [GitHub Discussions](https://github.com/Syntax-Error-1337/radar/discussions)
**为开源 OSINT 社区构建** [⬆ 回到顶部](#intelmap--geospatial-intelligence-platform)
标签:ADS-B, AIS, Cloudflare Radar, ESC4, Express, GEOINT, GNU通用公共许可证, GPS干扰, GPS欺骗, H3网格, HTTP/HTTPS抓包, MapLibre GL JS, MITM代理, Node.js, OSINT, React, Syscalls, TypeScript, UAV监测, WebGL, 仪表盘, 信号情报, 军事风格界面, 地图可视化, 地理空间情报, 大数据可视化, 威胁预警, 安全插件, 安全研发, 实时数据流, 态势可视化, 态势感知, 情报仪表盘, 数据聚合, 海事追踪, 火箭预警, 网络安全监控, 网络情报, 自动化攻击, 航班追踪, 请求拦截, 驱动开发