God's Eye View 把一个可以自由飞行的三维地球放进了浏览器:底图是卫星影像,上面叠 26 个公开数据图层,镜头压到 627 米能看到街上的楼,拉起来能看到发射轨迹。

它的作者把它包装成「间谍卫星模拟器」,界面上滚着 MGRS 编号、GSD、NIIRS 这类军用标注,右下角还挂着 8 个待配 key 的提示。真正重要的是另一件事:这些数据本来就是公开的,代码也全部开放,光有界面不构成任何特权。

这篇按 0.2.1 从源码跑了一遍,6 个环节的耗时和报错都记下来了:装依赖、自检、起服务、开图层、换滤镜、拉远到失控。

它在浏览器里放了一颗地球

底层是 Cesium 的三维地球引擎,底图走 Esri 的公开卫星影像,地形不用 key。浏览器里画布是 1440x900,实测由 ANGLE 走 Direct3D11 交给独显渲染,帧间隔 16.6 毫秒。

界面按三块分:左边是数据图层清单,中间是地球,右边是当前传感器的参数面板。1440x900 的窗口里三块各占三分之一,只有影像瓦片和数据请求要出网。

项目数值说明
源码包86592734字节,zip
解压后114MB,8923 个文件
依赖目录322MB,128 个包
数据图层26个
图层分类6类
视觉预设6种

第一次打开会弹一个「Choose your first view」面板,4 个入口分别是实时航班、太空任务、地震火点、空白地球。选哪个都只是帮你预置几个图层,界面本身是一样的。

God's Eye View 0.2.1:首次打开的四选一面板,背后是奥斯汀的卫星影像与四角 HUD

装之前先看三个前提

Node 要 24,22 会被直接拒

package.json 里的 engines 写死了区间,装依赖那一步就会检查。系统里如果只有 22.x,npm 会报引擎不匹配然后停住。

"engines": { "node": ">=24.14.0 <25 || >=26 <27" }
"dev": "vite"

实测 24.20.0 一次通过。25.x 被明确排除,作者的说明是那一版已经停止维护。

第一次 npm ci 会卡在下载浏览器

依赖里带了 puppeteer,装包时会顺手拉一个 157 MB 的 Chromium 到用户目录。这一步在这台机器上走到 18 分钟还没结束,node_modules 从 17:13 之后就没再变动。

跳过安装脚本重新装,19 秒结束,128 个包全部到位。开发服务器不需要那个浏览器,跳过不影响运行。

装法耗时结果
npm ci 全量1080秒以上,未完成
npm ci --ignore-scripts19秒,128 个包
下载的 Chromium157MB

322 MB 依赖里,大头是地图引擎

Cesium 一个包就占了 74 MB,剩下的是矢量瓦片解析、卫星轨道计算、流媒体播放这些。装到 D 盘没问题,塞进 C 盘要先算一下余量。

对比一下生产构建的产物:打包后 432 个文件、42252133 字节,最大的一块是 Cesium 主包 5726887 字节。也就是说跑起来要 322 MB 依赖,发给别人只要 40 MB。

从源码跑起来

三步到能看见地球

npm ci --ignore-scripts
node scripts/setup-doctor.mjs
node node_modules/vite/bin/vite.js --port 4173 --host 127.0.0.1

启动器 1.5 到 2.9 秒之间就绪,三次实测分别是 1.50、1.90、2.93 秒。打开页面到 DOM 可用是 18.49 秒,这段时间花在拉 Cesium 和第一批影像瓦片上。

端口一定要带 --host 127.0.0.1。默认只监听 IPv6 的 ::1,用 127.0.0.1 去连会一直停在 SYN_SENT,看上去像服务没起来。

自检脚本会列出哪些数据不用 key

setup-doctor.mjs 跑完 1.59 秒,输出一张能力表。它把这个项目的门槛讲得最清楚:底图、航班、发射、地震都能白用,船舶和火点要单独申请。

数据状态来源
卫星底图 + 地形免 keyEsri World Imagery
实时航班免 key,限速OpenSky 匿名
太空发射免 keyLaunch Library 2
道路交通模拟内置
船舶需 keyAISStream
火点需 keyNASA FIRMS
语音需 keyOpenAI

右下角常驻一个「POWER UP · 8 KEYS WAITING」的按钮,点开是 10 个 provider 槽位,实测一个都没配。不配也能用,配了才多出 photorealism 和语音那些能力。

首屏面板挡住画面,按 Esc 关掉

那个四选一面板会盖住中间的地球,面板底部写了 ESC TO DISMISS。按一下 Esc,2 秒内就消失,之后才是完整的操作界面,右侧的 DATA LAYERS、SCENES、CONTEXT 才会露出来。

用自动化脚本点这个面板里的按钮并不可靠:外层容器和内部卡片的点击目标重叠,按文本匹配点下去 3 次都没反应。按 Esc 是最省事的路径,一次就成。

God's Eye View 0.2.1:城市视图,ALT 627M、GSD 0.23M、NIIRS 7.1,画面套一个圆形取景框

左边是数据,右边是传感器

26 个图层,分 6 类

展开 DATA LAYERS 之后,左侧滚动区列出 26 行:每个图层一行,右边跟着数据源和最近一次拉取的时间。分类标题用大写字母,实测 6 组。

分类图层数典型条目
MOVEMENT8卫星 / 航班 / 军机 / ADS-B / 船舶 / 车流 / 公交 / 共享单车
CAMERAS2CCTV 与街景 / NASA 近期影像
INFRASTRUCTURE5车牌识别相机 / 数据中心 / 海底光缆 / 水坝
EVENTS430 天发射 / 24 小时地震 / 活跃火点 / 火场边界
WEATHER5风场 / 雷达 / 卫星云图 / 闪电 / 气旋路径
UTILITIES2路线测算 / 无线电

数据源写在每一行下面,6 家来源一眼能对上:CelesTrak 的卫星轨道、OpenSky 的航班、adsb.lol 的军机、AISStream 的船舶、USGS 的地震、NIFC 的火场边界。愿意自己加,一个图层就是一个独立模块。

默认全部关闭,点开才拉数据

刚打开时 26 个图层全是 OFF,右侧的时间戳统一写着 never。这个设计对带宽友好,也让第一次打开的画面很干净:只有底图和一个圆形的取景框。

逐条点开才有意思。打开航班图层,地球表面开始冒出飞机标签;打开发射图层,21 条轨迹会一起铺在地球上。

God's Eye View 0.2.1:DATA LAYERS 展开后的 26 个图层,按 6 个分类分组

HUD 上的数字是从相机算出来的

四角那些军用格式的标注不是贴图,是跟着镜头实时算的。压到奥斯汀市中心时,四角给出这 5 个读数:

字段读数含义
ALT627米,相机离地高度
GSD0.23米,单像素地面分辨率
NIIRS7.1影像可解读等级
SUN-41.7度,太阳高度角
MGRS14R PU 2090 4906军用网格坐标

GSD 会跟着高度线性变。拉到 18000 公里时同一个字段读到 2998841.65 米,NIIRS 掉到 0.0。这组数字是 Cesium 相机和椭球算出来的,不是随机数。

6 种视觉预设,参数还能拧

VISUAL PRESETS 那条横排有 6 个风格,本质是叠在地球上的着色器。点一下整体换色,不用重启,地球还在转。

预设观感
NORMAL原始卫星影像
CRT显像管扫描线加暗角
NVG夜视仪的绿色单色
FLIR热成像白热
ANIME高饱和描边
NOIR黑白高反差

FLIR 面板上的 5 个滑杆

切到 FLIR 之后右侧会多出一整块参数面板,滑杆是可以拖的,改完立刻重绘。实测默认值如下:

参数默认值
Sensitivity0.85
Bloom0.28
BloomThresh0.35
Pixelation1.0
Innoise0.6

面板里还有 3 个快捷档:3D、white-hot、ALL,以及一个 SCOPE 分组控制取景框的强度和帧数。想让画面对着参考图调,改这 5 个数比换预设更直接。

God's Eye View 0.2.1:FLIR 风格下的传感器参数面板,含 Sensitivity、Bloom、Pixelation 等五个滑杆

太空任务与整颗地球

30 天窗口里有 21 条发射

SPACE MISSIONS 面板顶部写着 21 / 30D,意思是 30 天窗口内 21 条。列表按时间倒序,每条带火箭型号、发射方、日期。

火箭发射方日期
Falcon HeavySpaceX2026-10-02
StarshipSpaceX2026-09-28
Long March 8ACASC2026-10-25
ElectronRocket Lab2026-10-23
H3-24Mitsubishi Heavy2026-10-19

点任意一条,镜头会把整颗地球拉远到能看见全部 21 个发射点,同时在地表打出带箭头的标记。这一步是相机动画,不是瞬移,能看出它飞了哪条弧线。

God's Eye View 0.2.1:整颗地球与右侧太空任务列表,顶部显示 21 / 30D

拉到 18000 公里,渲染直接停

镜头继续往回拉,越过 18000 公里之后整个画面会冻住,中间弹一个红色错误框。这不是网络断了,是 Cesium 内部的数值算出了 NaN。

An error occurred while rendering. Rendering has stopped.
DeveloperError: normalized result is not a number

复现很稳定:先用 public 那个按钮复位,再连续滚 4 格滚轮,HUD 的 ALT 读到 18000.0KM 时必然触发。17800 公里以下随意怎么拉都没事,边界卡得很死。

遇到这个框只能刷新页面,重新等一遍那 18.49 秒。作者没有对超远视距做保护,想拍「整个太阳系尺度」的图,这条路暂时走不通。

God's Eye View 0.2.1:镜头拉到 ALT 18000.0KM 后弹出的 Cesium 渲染错误框

性能:60 帧,65.1 MB 堆

画面流畅度用 requestAnimationFrame 采样,60 帧跑完 994 毫秒,折算 16.6 毫秒一帧,也就是贴着 60 帧的上限跑。这个成绩是在 1440x900 的画布上、独显直连的情况下拿到的。

指标数值说明
启动器就绪2.93秒
DOM 可用18.49秒,首次含瓦片
生产构建8.96秒
构建产物42252133字节,432 个文件
JS 堆65.1MB
堆上限124.6MB
DOM 节点4545个
60 帧耗时994毫秒

开发模式会发 1177 个请求

1177 这个数字容易被误读成「这站很重」。实际是 Vite 在开发模式下把每个模块单独发出去,生产构建会合并成几个大文件。

请求 1177 个,content-length 合计 61804372 字节
text         716 个    48150120 字节
application  201 个     7343308 字节
image        256 个     6217624 字节
font           3 个       93320 字节

同一个页面跑生产构建,主包 2619312 字节、gzip 后 802.55 kB,最大的 egm96 地形修正包 2770496 字节、gzip 后 1849.99 kB。真正的首屏压力在这两个文件上,跟 1177 这个数字没有关系。

什么情况下别装

这东西好看,但它是个 322 MB 的重型前端。判断标准不是「想不想看地球」,而是「有没有一块能跑 WebGL2 的显卡」和「愿不愿意为看几眼装 Node 24」。

你的情况结论
独显或近三年的核显,想看公开数据的可视化合适
只有集显的老笔记本先试,128 个包换 5 帧不划算
只想看看卫星图不合适,Esri 网页版就够
要离线用不合适,瓦片全靠在线
要做数据看板交付给客户不合适,322 MB 依赖部署成本高

没有显卡加速的环境最难受:Cesium 会退回软件渲染,独显下 16.6 毫秒一帧的画面会拖成幻灯片。远程桌面里打开也是同样结果,它检测不到可用的 GPU 就换慢路子。

断网也基本没法用。底图瓦片全部来自 Esri,第一次加载就要 6 MB 以上的图片,缓存过的地方能撑一会儿,换城市立刻白屏。

拿它当情报工具同样不合适。界面上的 MGRS 和 NIIRS 是渲染出来的读数,航班数据来自公开的 ADS-B 聚合,船舶图层要自己申请 1 个 AISStream key,火点图层也只是公开卫星产品。它能做的是把公开信息摊在一个地球上,不做任何超出的部分。