

God's Eye View 深度拆解:Cesium+WebRTC 打造的浏览器上帝视角
💬 评论GitHub Trending #1、YouTube 千万播放的"上帝视角"地球开源版,Vite + Cesium + WebRTC Realtime + 15 路本地代理,把 OpenSky/AIS/CelesTrak/FIRMS 这些公开数据塞进一台浏览器。
2026 年 8 月,一个叫 God’s Eye View 的仓库冲上 GitHub Trending 全球日榜和周榜双 #1。它背后是 YouTube 上 5M+ 播放的”上帝视角”系列视频(原名 WorldView),作者 Bilawal Sidhu 把那个”看起来像军用卫星操控台”的演示项目完整开源了 —— 524 个文件、163MB 代码仓、3.6 万行样式表 —— 然后告诉你:
“数据全是从 OpenSky、AISStream、CelesTrak、FIRMS、Overpass 这些免费公共接口里拿的。每行代码都能审计。”
我把这个仓库完整 clone 下来、逐模块拆完,发现它不是又一个”Cesium 炫技 demo”。它解决的是 “如何把 15 路异构公共数据流,在浏览器里拼成一个生产级的实时态势感知系统” 这个真问题,而且给出了几条值得抄作业的工程答案。本文按”为什么这样做 → 怎么做的 → 代码细节”三段式,把核心架构讲清楚。

仓库地址:
bilawalsidhu/gods-eye-view,v0.1.1,2026-09-11 最后提交#322。本文所有代码引用、行数、commit 信息均基于此版本。
一、问题:为什么”上帝视角”很难做#
一句话总结需求:在浏览器里渲染一个 3D 地球,实时叠加飞机/船/卫星/地震/CCTV/野火/雷达/火箭/海底光缆/军用设施/交通/无线电/共享单车,还能语音控制(“飞到北京,跟着这架 F-35,切到红外样式”)。
这件事的难度不在 Cesium。Cesium 已经能干所有 3D 渲染。难在三层:
- 数据异构:15 路数据源,协议各异(ADS-B REST、SGP4 推算、AISStream WebSocket、Overpass 查询、NASA FIRMS CSV、TomTom 矢量瓦片、Radio Browser JSON……),延迟差异巨大(飞机 10s 刷新,卫星 1s 推算,CCTV 是 MJPEG 帧流)。
- 预算约束:“无密钥能用”是硬要求。Google Photorealistic 3D Tiles 是首选但要 key,CelesTrak/Esri/OSM/OpenSky/adsb.lol/AISStream/CCTV 都得有无 key 兜底路径。
- 生产级:要能跑 60 FPS(M5 Metal 实测,见
docs/PERFORMANCE.md)、要把场景、面板、图层、工具状态序列化进 URL hash 做分享链接、要做语音控制的成本闸门、要给”机场附近的飞机总是被房子挡住”这种 bug 写 owner decision 注释。
作者 Bilawal Sidhu 前 Google Earth / TED 演讲人,做这件事的方式很工程师 —— 不堆花哨架构,而是把”为什么这样写”刻在每一行注释里。下面我从最有价值的几个设计点拆起。
二、架构总览:4 阶段启动 + 15 路本地代理#
2.1 应用生命周期只有 4 个阶段#
打开 src/app/application.js,你会看到一个非常干净的工厂:
const START_ORDER = ['scene', 'controls', 'data', 'tools'];
const STOP_ORDER = ['tools', 'controls', 'data', 'scene'];js整个应用就是一个 createApplication({ createScene, createControls, createData, createTools }),每个 factory 返回组件并立即注册 defer(dispose)。启动按 scene → controls → data → tools 顺序,每阶段拿到的是已就绪的前序组件 + AbortSignal + defer 回调。停止严格逆序。任何一个阶段失败,前面所有资源被回收。
这个设计的妙处:没有全局状态,没有”应用单例”。src/standalone/application.js 只是把 4 个具名工厂实现接起来,跑在浏览器里。但你完全可以拿 createApplication 在测试里塞 mock factory,在 worker 里跑,在 Vite dev server 里跑。包边界检查脚本 scripts/check-package-boundaries.mjs 强制:基础设施模块(@gods-eye-view/infrastructure)不准 import 浏览器应用入口,Node 服务也不准 import Cesium。这套约束保证拆分后没人偷偷耦合。
应用启动最终是这段(src/main.js):
const application = createStandaloneApplication({
googleApiKey: import.meta.env.GOOGLE_MAPS_API_KEY,
cesiumToken: import.meta.env.CESIUM_ION_TOKEN,
allowQaRegistration: import.meta.env.DEV,
});
application.start().catch(err => { /* 在加载屏写错误,不抛 */ });jsimport.meta.env 在构建时被 Vite define 替换(build/vite.js)。注意 Cesium ion token 和 Google Maps key 都可以为空 —— 空时整个地图栈会优雅降级到 Esri 卫星 / OSM 矢量。
2.2 地图栈:5 个底图 + 3 种降级路径#
src/mapStackController.js 是作者最得意的一段。MAP_STACKS 数组 5 个:photoreal(Google 3D Tiles)、bing-aerial/bing-labels(Cesium ion,需 token)、esri-imagery(ArcGIS Online,无 key)、osm(OpenStreetMap,无 key)。
关键逻辑在 photorealUnavailableReason(hasCredentials):
return hasCredentials
? 'Google 3D tiles unavailable — check the key\'s API restrictions, quota, or network'
: `${keySetupRequirement('google-maps')} — or a Cesium ion token for the ion-hosted route`;js为什么这段值得抄:同一个”Google 3D 不可用”的错误,根据用户是否已配 key 给出不同的修复建议。没 key 的告诉你”加 key”;有 key 的告诉你”检查 API 限制、配额或网络”。同一行错误文本,推荐的不是同一个动作。代码注释里管这叫”phrased so the tooltip and toast recommend the RIGHT fix”。
降级链是无 key 用户唯一路径:Esri 卫星(默认) → OSM。地形走 Re:Earth / Mapterhorn 免费 quantized-mesh 全球高程(CC BY 4.0,EGM2008 大地水准面),构造用 .fromUrl(),绝不手搓 {z}/{x}/{y}.terrain URL(注释里写了”review correction, spec §1a”)。
2.3 15 个本地代理:Node 中间件,不走浏览器 CORS#
server/providers/local.js 列出了全部中间件:
1. OpenSky — 飞机状态向量(OAuth/Basic/匿名)
2. CelesTrak — 卫星 TLE 星历
3. Overpass — OSM 道路几何查询
4. GBFS — 共享单车
5. CCTV — 交通摄像头帧、MJPEG 流、降级 SVG
6. adsb.lol — 军用飞机追踪
7. AIS live — AISStream WebSocket 活船舶位置
8. Terrain — Re:Earth 椭球高程查询
9. TomTom — 实时交通流矢量瓦片(预算管控、可降级无 key)
10. NASA FIRMS — 活火点(VIIRS × 3、过去 24h)
11. 军事设施 — 限定、缓存的 OSM 特征
12. 区域简报 — 缓存地点、天气、近期地理匹配新闻
13. 天气效果 — 摄像机本地 Open-Meteo 观测
14. 火箭发射 — Launch Library 2 任务元数据
15. Radio — Radio Browser 公共台站目录与计数plaintext每个代理的职责清晰:bypass CORS、加缓存、加认证、限流。比如 aisLiveProxy 把浏览器连不上 WebSocket 的问题用 Node 当中转;firmsAdapt 把 NASA FIRMS CSV 字段名标准化;tomtomTiles.js 用 normalizeBudget / isOverBudget 做 keyless 退化。
这套架构的复用价值:任何”多源 OSINT 可视化”项目,都可以把这套本地代理作为底座直接 fork。比起让浏览器直连每个上游,Node 集中代理能做四件事 —— 缓存、配额治理、跨域、敏感 key 不暴露给前端 —— 都是生产化必须的。
三、核心机制:从飞机渲染看”工程级”的差距#
3.1 单 BillboardCollection 渲染 5000+ 飞机#
打开 src/data/flights.js(5338 行),第一行注释就把架构定了:
“All aircraft are drawn as billboards in a single BillboardCollection for GPU-efficient batching (handles 5000+ aircraft). Each billboard’s alignedAxis is set to the WGS84 ellipsoid surface normal so that the rotation value operates in the local tangent plane.”
Cesium 里默认 billboard 是屏幕朝向的,要”贴地球表面”必须设 alignedAxis = surface normal。这一步是飞行图标能在 3D 地球上朝正确方向旋转(机头指向前进方向)的前提。
刷新策略是”OpenSky 每 10–30 秒拉一次 + 中间用 ENU 坐标系航位推算”(motionModel.js 提供 courseBetweenCartesians、arcOffsetEnu、lerpAngleDeg 等函数)。当新 fix 到达,1 秒 lerp 平滑过渡,避免视觉跳变。
但让我觉得真值得抄的是这堆注释 —— Bilwal 把每个反直觉决定的”为什么”写满:
// TINT: full-strength, same pipeline as airborne (white / amber-military /
// cyan-tracked). Day 1 shipped a slate-gray 50%-alpha "muted" ground tint; the
// owner killed it the same day ("just leave them as white, dude … in NYC I can
// barely see them, extremely grayed out"). "On the ground" reads from the ×0.8
// scale + missing trail; "feed-dropped, coasting" stays the 45%-alpha stale fadejs他不是写代码的人,他就是产品经理。注释里写 “owner decision 2026-07-03 field test”。当一个工程师把”为什么不用灰色”这种决定追溯到一条具体日期的字段反馈时,这个团队的代码质量就有底了。
3.2 3D 模型 vs 2D billboard 的距离阈值#
飞机在远处是 2D billboard,镜头拉近到 MODEL_ALT_CEIL_M = 800000m 以下才换成真实 GLB 模型。但只换”看得见的”(frustum-based)+“足够近的”,每模式有独立阈值:
const MODEL_PROX_ADD_M = 150000; // 'proximity' 模式加新模型
const MODEL_PROX_KEEP_M = 185000; // 滞后边,防 zoom 时反复加卸
const MODEL_ALL_ADD_M = 400000; // 'all' 模式加新模型
const MODEL_ALL_KEEP_M = 450000;
const MODEL_MAX = 150; // 'proximity' 模式硬上限
const MODEL_MAX_ALL = 350; // 'all' 模式硬上限js为什么有 KEEP > ADD?滞回。KEEP - ADD = 35000m 让飞机在边界徘徊时不会反复 add/remove GLB,避免 zoom 时闪屏(注释里叫 “the zoom/pan flicker”)。
为什么有”每个 GLB 自己的 draw call”?没用 instancing。注释解释:“no instancing yet”。所以硬上限 150/350 是必须,否则 draw call 爆炸直接掉帧。MODEL_BELLY_OFFSET_NATIVE = 6.719 是 airplane.glb 的原点 Y 偏移,乘上每类倍数(5–9.7m),让贴地的模型”机腹着地”而不是中心点着地。
3.3 停在地面的飞机:Day 1 杀掉的反直觉决定#
注释一开始写:
“Day 1 shipped: skip grounded planes entirely. Owner reversal 2026-07-03: ‘absolutely we should see planes taxiing and landing’.”
最初的逻辑”飞机在地就不画” —— 跟 ADS-B Exchange 之类的传统 tracker 一样。但作者改了:地面飞机也要画(同色同尺寸,只是 ×0.8 缩小,无轨迹)。理由:“absolutely we should see planes taxiing and landing”。一个 KOL 作者能现场推翻自己的设计决策,而且把日期、对话内容、改进细节全部写进注释 —— 这是 GitHub 上很少见的工程纪律。
接着是另一条:
“Grounded planes draw no trails and are excluded from the ambient enrichment sweep (click-to-enrich still works). In 3D mode they take model slots like airborne planes.”
每个边界都有 owner decision。代码读起来像产品 log,而不是实现 log。
3.4 卫星:SGP4 + 6 个 CelesTrak 分组#
src/data/satellites.js(2397 行)用 satellite.js 做 SGP4 推算。关键细节:CelesTrak 的 GLONASS 组名是 glo-ops,不是 glonass-operational —— 后者 404。这条注释不知道省了多少人多少小时。
const CATALOG_GROUPS = [
{ tag: 'stations', path: 'stations' },
{ tag: 'visual', path: 'visual' },
{ tag: 'gps-ops', path: 'gps-ops' },
{ tag: 'glonass', path: 'glo-ops' }, // 不是 glonass-operational!
{ tag: 'galileo', path: 'galileo' },
{ tag: 'geo', path: 'geo' },
];js追踪镜头偏移按轨道高度自动缩放:
const TRACK_VIEW_FROM_LEO = new Cesium.Cartesian3(-450000, -450000, 350000); // LEO
const TRACK_VIEW_FROM_HIGH_SCALE = 4; // MEO/GEO × 4jsLEO 卫星(ISS、星链)相机推后 ~726 km;MEO 导航星 / GEO 同步轨道推后 ~2900 km。用户注释:这种距离让卫星每帧移动不糊、标签不闪、轨道环能完整入画。
“dense” 模式(打开 Starlink 星链)的处理是点-only、不画标签、不参与检测框、按 round-robin 5 帧一次推算,性能压住。
四、语音控制:WebRTC Realtime + 函数调用,3000 行 actions 字典#
4.1 为什么用 OpenAI Realtime 而不是 STT+LLM+TTS#
src/voice/gevRealtime.js(2734 行)是项目里最有野心的模块。它直接连 OpenAI Realtime WebRTC,不要中间 STT/TTS 往返,端到端语音流式送进模型,模型直接吐语音回来。
为什么这样设计:“fly to Beijing and track the nearest F-35” 这种命令要的不是聊天,是动作链。传统 STT→LLM→TTS 三段加起来延迟 2–3 秒,体验是”我说完它卡一下才动”;WebRTC Realtime 流式,延迟 300–500ms,接近真人对话节奏。代价是贵 —— Realtime API 按音频秒计费,所以模块里写满了成本闸门。
4.2 三层成本治理#
const VOICE_TIER_STORAGE_KEY = 'godsEyeView.voiceCost.tier';
const VOICE_LIMITS_STORAGE_KEY = 'godsEyeView.voiceCost.limits';jsvoiceCost.js 提供 normalizeCostLimits、isKnownVoiceTier、formatCostUsd、resolveVoiceModel、serializeCostLimits、createVoiceCostTracker。整套状态都序列化进 localStorage,跨刷新保留。
serializeCostLimits 的注释很戳:
“A DISABLED threshold is Infinity, and
JSON.stringify(Infinity)isnull— which reads back as ‘absent’ and silently restores the default, re-arming a cap the user turned off.”
用户关掉的 cap 不能因为 JSON.stringify 副作用被偷偷恢复。这种”看似不可能的坑”代码里到处有。
VIEWPORT_MAX_PIXELS = 1200 * 900(约 1.08 MP)+ VIEWPORT_MAX_ENCODED_BYTES = 200 * 1024(200 KB)。旧的代码只 clamp 宽度,竖屏窗口截出过大的图,dc.send 直接抛 —— 现在总像素 + 编码后字节双重 cap,整张图过大就直接丢弃不送,不会崩数据通道。
4.3 函数调用:3000 行的 actions 字典#
src/voice/gevActions.js(3459 行)实现 GevActionRunner,把语音流变成 30+ 个具名动作:flyRoute、moveCamera、adjustOrbitRange、interruptCameraMotion、searchAndFlyTo、warmGroundFloor、resolveRegionRingForQuery、normalizeRadioCountryInput、collectAircraftProximityWindow……
每个面板都有别名映射:
const PANEL_ALIASES = new Map([
['data layers', 'data-panel'],
['data layer menu', 'data-panel'],
['visual styles', 'control-panel'],
['cameras', 'cctv-panel'],
['global context', 'global-context-panel'],
// …共 30+ 入口
]);js为什么搞这么多别名?因为用户说”layers”、“data”、“data layers”、“data layer menu”指的都是同一个面板 —— 别名表让 LLM 输出的乱序字符串都能解析。
CONTEXT_MODE_ALIASES 处理 “context”/“contacts”/“flights”/“space missions”/“missions” → 内部模式 id。“off”/“none”/“clear” 都映射为关闭。
analystEngine 是更高层的封装,把”这个区域最近有哪些飞机/船/卫星/地震”组织成一个回答;militaryAwareness 在 contactsWindowFromSnapshot 上做战术窗口聚合。整套 actions 系统本质上是用 LLM 把”自然语言意图”映射到一个离散动作表,然后用 Cesium API 执行。
4.4 失败恢复:WebRTC ‘disconnected’ 6 秒宽限#
const DISCONNECT_GRACE_MS = 6000;
// WebRTC 'disconnected' is frequently momentary (a brief network blip that ICE
// recovers on its own). Give it this long to return to 'connected' before we
// treat it as a real drop (H8).jsWebRTC 的 disconnected 经常是 1–2 秒就自动恢复的瞬时网络抖动,立刻重连会进入连接风暴。宽限 6 秒,期间只观察状态,不触发重连逻辑。这种”不要过度响应”的工程纪律,是这类实时系统里最容易翻车的点。
五、其他值得抄的设计点(选 4 个有代表性的)#
5.1 样式切换:GLSL sensor looks(NVG / FLIR / CRT / Snow / Noir / Anime)#
src/styles/ 下 6 个 GLSL shader:retro.js(CRT)、surveillance.js(NVG)、thermal.js(FLIR)、noir.js、snow.js、anime.js。

风格不是简单滤镜,整套 UI 都跟着切:mapStackChips 切底图图标,SHARE_STYLE_PARAM_REGISTRY 切可分享的状态字段(每种风格参数不同,retro 有 pixelation/distortion/instability,surveillance 有 gain/bloom/scanlineStr,thermal 有 sensitivity/mode/palette)。decodeBloomIntensity 处理不同 bloom scale 版本之间迁移。
5.2 海底光缆:Cesium polyline + TeleGeography 数据#
src/data/telegeographySubmarineCables.js。TeleGeography 是全球海底光缆的真实数据集(Submarine Cable Map),作者直接打包进 local_data/,通过 localGeojson 加载。性能文档写:Cold activation 614ms / heap 412 MiB(docs/PERFORMANCE.md)—— 它是最重的图层。

复用价值:很多项目都想要”全球基础设施可视化”,光缆、电力、海底观测网,套路完全一样 —— GeoJSON + Cesium polyline + LOD,关键是 localGeojsonLod 提供的 80/200/420 三段 stem 上限(按相机高度切换)。
5.3 ISS 路径预测 + 临时性背景#

src/data/issPass.js 算”下一次 ISS 经过某点的时间”,regionalBrief.js 把”该区域最近 24h 新闻 + 天气 + 附近摄像机”打包成一个本地化的”区域简报”。当你跟踪 ISS 时,右侧自动浮出它当前所在区域的简报 —— 把”追踪”从”看一个点”升级成”看一片地方”。
src/data/regionalProxy.test.mjs 在 server 侧做缓存,避免每次都重拉新闻/天气。
5.4 飞行员座舱:CAT 模型 + AR HUD#

src/cockpitTracking.js + src/cockpitAirLod.js + src/data/cockpitModels.js 实现”乘坐飞机”的体验:相机锁在飞行器位置,地形一直保持在下方,飞到机场自动减速贴地。AR HUD 渲染高度、地速、航向、目的地 ETA。cockpitDetectionSubjects.test.mjs 让座舱模式下也能识别周围飞机,渲染为绿色光点 + 距离环。
性能:COCKPIT_MODEL_MAX = 60(座舱内最多 60 个 GLB,不影响地图模式的 150/350 上限)。
六、Share Link:URL hash 序列化一切#
src/sharelink.js 把”当前视图”打包成 URL hash:
#lat=37.77&lon=-122.42&alt=800&heading=0&pitch=-35
&style=nvg&bloom=1&bi=84&bv=2&sharpen=0&si=65
&hud=tactical&hv=1&dm=BALANCED&dd=50&da=elastic
&kf=16&ko=0&cr=0&map=photoreal
&ui=c,l,d,v,r,s,g,p,m&sp=...&at=1700000000plaintext每个风格参数有独立 token:retro/p/d/i(pixelation/distortion/instability)、surveillance/g/b/s/p(gain/bloom/scanline/pixelation)、thermal/s/b/m/p/a(sensitivity/bloom/mode/pixelation/palette)。9 个面板的可见/钉住状态用单字符 token 序列化(c/l/d/v/r/s/g/p/m)。
**为什么是 hash 不是 path?**hash 不进服务端日志、不污染 SEO、刷新不丢、跨页面片段可保留。关键是每个面板单独 token,可选 pinnable —— 钉住的会跨刷新保持,非钉住的只是临时显示。SHARE_CREATED_AT_PARAM(at)和时间戳组合做版本兼容。
clampScopeTerminusPct、migrateDetectionState、encodeLayerStateParams、decodeLayerStateParams —— 全套状态序列化 + 旧版本迁移。读 sharelink.js 不用五分钟,但能学到的状态管理哲学值五小时。
七、性能基线:M5 上 60 FPS 是怎么保住的#
docs/PERFORMANCE.md 是项目里我最喜欢的一份文档。它写明:
- 测试机:Apple M5,Chrome 150,1440×900,DPR 1,前台 focus
- 场景:5s 脚本运动 + 5s 静止,3 次取样,冷缓存
- 冷启动中位数:
App ready 605ms,Initial settle 1855ms,Load 439ms,Motion/Rest 双双 60 FPS,JS heap 105 MiB
冷激活每个图层:
| 图层 | 激活耗时 | 源数量 | FPS | heap |
|---|---|---|---|---|
| CCTV city | 19608ms | 48 | 60/60 | 193 MiB |
| Space Missions | 3581ms | 26 | 60/60 | 131 MiB |
| Radio | 3458ms | 750 | 60/60 | 125 MiB |
| Bikeshare | 2069ms | 633 | 60/60 | 157 MiB |
| Datacenters | 817ms | 4362 | 59.6/60 | 328 MiB |
| Flights | 667ms | 247 | 60/60 | 118 MiB |
| Submarine cables | 614ms | 2629 | 60/60 | 412 MiB |
CCTV 最慢(城市级摄像头要拉 MJPEG 流,逐帧解码到 canvas),Submarine cables 最吃内存(2629 条 polyline × LOD × billboard stem)。
性能不是魔法 —— renderGovernor.js 提供 holdContinuousRender/releaseContinuousRender,图层切换时显式请求连续帧;focusDeemphasis.js 控制 sprite focus alpha 的写入频率;worldOverlayAllocation.worker.mjs 把重叠检测放到 worker 里。整个性能预算写在一份公开的文档里,这是比”我们 60 FPS”四个字更值钱的东西。
八、写给工程师的几条 takeaway#
1. 把”为什么这样写”刻在代码里。 flights.js 第一段就告诉你用了 alignedAxis 让 billboard 朝向地球切线。satellites.js 提醒你 CelesTrak GLONASS 组名是 glo-ops。voiceCost.js 解释 JSON.stringify(Infinity) === null。注释不是解释代码做了什么,是解释为什么不做另一种做法。
2. 架构的简单是结果,不是起点。 4 阶段启动 + 5 个底图栈 + 15 个本地代理。createApplication 一个工厂,4 个具名 slot,defer(dispose) 注册清理。包边界检查脚本强制不许隐式耦合。简单来自纪律。
3. “Owner decision 2026-07-03” 是工程纪律的最高级形式。 反直觉决定(地面飞机要画、灰色地勤飞机被 kill、CCTV 不要热成像)、日期、对话上下文、后续实测结果,全在代码注释里。读者不需要进 GitHub issues 就能理解产品演化。
4. “无 key 兜底”是 OSINT 项目的分水岭。 photorealUnavailableReason(hasCredentials) 根据用户状态给不同建议。15 路数据中只有 Google 3D Tiles 和 Bing Aerial 强需 key,其余全有 keyless 降级。你的 OSINT 项目能不能让”完全没 API key 的用户先跑起来”决定它能不能传播。
5. 性能预算写文档,不要写 PR description。 docs/PERFORMANCE.md 是项目最值钱的文档之一:测什么、什么机器、什么场景、什么结果、什么 heap 占用。读者不需要自己跑就知道这个项目在 M5 上能跑 60 FPS。
6. URL hash 序列化一切。 Share Link 是病毒传播的引擎。面板钉住/不钉住的状态机是产品细节。“分享” 不是一个按钮,是一个状态机。
7. 成本闸门写进 localStorage,失败有兜底。 Realtime API 按秒收费,voiceCost 写满了 “disabled threshold is Infinity, JSON.stringify null” 这种看似边角实际致命的细节。
8. WebRTC 瞬时断连给 6 秒宽限。 不要立刻重连,不要立刻报失败。过度响应是实时系统最常见的 bug。
九、跟 Pi Agent Harness、DeepSeek-V4.1、HyperFrames 横向比#
| 维度 | God’s Eye View | Pi Harness | DeepSeek-V4.1 | HyperFrames |
|---|---|---|---|---|
| 体量 | 524 文件 / ~150k 行 | 1700+ 文件 / 149k 行 | 552B MoE | 7122 文件 / 36.4 万行 |
| 核心抽象 | 4 阶段 Application 工厂 | 11 个包 + Skills | KV 压缩三层 | 内容寻址 Plan |
| 实时关键 | WebRTC Realtime + 15 路数据流 | JSONL 会话 + 事件订阅 | 552B 推理引擎 | 帧原子截屏 |
| 工程亮点 | Owner decision 注释、5 底图栈 | 6 个 No 的差异化 | CED/CSA2/SWA 三层 KV | beginFrame 帧原子 |
| 性能预算 | M5 上 60 FPS,docs 公开 | 文档即评测 | — | Plan→Map(N) Lambda |
| 包边界检查 | 有(check-package-boundaries) | 有(erasable TS) | — | — |
God’s Eye View 的位置:它是”公共数据 + 浏览器可视化”这个赛道里工程化最完整的样本。同赛道的项目很多(各种 ads-b 地图、AIS tracker、Earth Studio),但大多数死在三层:数据缺降级路径、性能没公开预算、代码没人能 fork。GEV 把这三层都解决了。
十、结语#
“Half the magic is that it looks like a forbidden cockpit. The other half is that every line of code is inspectable.” — Bilawal Sidhu, README
一个 YouTube 千万播放的 KOL 项目,选择 全部开源 而不是卖 SaaS —— 这件事本身就是一种立场。代码里写满的 “owner decision 2026-07-03” 不是表演,是 GitHub 上少见的”产品 log 即代码注释”工程文化。
如果你要做 OSINT 可视化、实时态势感知、或者只是想知道 “怎么把 15 路异构公开数据流在浏览器里拼成一个能跑 60 FPS 的生产级系统” —— 这个仓库值得逐模块 fork。
附录:关键文件清单#
src/main.js— 17 行,真正的入口src/app/application.js— 152 行,4 阶段生命周期src/app/viewer.js— 36 行,Cesium viewer 配置src/mapStackController.js— 494 行,5 底图栈 + 降级链src/data/flights.js— 5338 行,飞机层(最重)src/data/aisLiveVessels.js— 2109 行,AISStream 集成src/data/satellites.js— 2397 行,SGP4 推算src/data/cctv.js— 4825 行,CCTV 流src/voice/gevRealtime.js— 2734 行,WebRTC Realtimesrc/voice/gevActions.js— 3459 行,语音→动作映射src/scenes/director.js— 1441 行,电影感场景回放src/sharelink.js— 617 行,URL hash 状态序列化server/providers/local.js— 15 个 Node 中间件build/vite.js— 30 行,Node-only Vite 配置导出docs/PERFORMANCE.md— 公开性能基线docs/CURRENT-STATE.md— 运行时权威描述docs/INFRASTRUCTURE-LAYERS.md— 包接口契约
本文所有代码引用、行数、commit 信息均基于
bilawalsidhu/gods-eye-viewv0.1.1,commitbdfd02b,2026-09-11。