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 |
| 解压后 | 114 | MB,8923 个文件 |
| 依赖目录 | 322 | MB,128 个包 |
| 数据图层 | 26 | 个 |
| 图层分类 | 6 | 类 |
| 视觉预设 | 6 | 种 |
第一次打开会弹一个「Choose your first view」面板,4 个入口分别是实时航班、太空任务、地震火点、空白地球。选哪个都只是帮你预置几个图层,界面本身是一样的。

装之前先看三个前提
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-scripts | 19 | 秒,128 个包 |
| 下载的 Chromium | 157 | MB |
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 秒,输出一张能力表。它把这个项目的门槛讲得最清楚:底图、航班、发射、地震都能白用,船舶和火点要单独申请。
| 数据 | 状态 | 来源 |
|---|---|---|
| 卫星底图 + 地形 | 免 key | Esri World Imagery |
| 实时航班 | 免 key,限速 | OpenSky 匿名 |
| 太空发射 | 免 key | Launch Library 2 |
| 道路交通 | 模拟 | 内置 |
| 船舶 | 需 key | AISStream |
| 火点 | 需 key | NASA FIRMS |
| 语音 | 需 key | OpenAI |
右下角常驻一个「POWER UP · 8 KEYS WAITING」的按钮,点开是 10 个 provider 槽位,实测一个都没配。不配也能用,配了才多出 photorealism 和语音那些能力。
首屏面板挡住画面,按 Esc 关掉
那个四选一面板会盖住中间的地球,面板底部写了 ESC TO DISMISS。按一下 Esc,2 秒内就消失,之后才是完整的操作界面,右侧的 DATA LAYERS、SCENES、CONTEXT 才会露出来。
用自动化脚本点这个面板里的按钮并不可靠:外层容器和内部卡片的点击目标重叠,按文本匹配点下去 3 次都没反应。按 Esc 是最省事的路径,一次就成。

左边是数据,右边是传感器
26 个图层,分 6 类
展开 DATA LAYERS 之后,左侧滚动区列出 26 行:每个图层一行,右边跟着数据源和最近一次拉取的时间。分类标题用大写字母,实测 6 组。
| 分类 | 图层数 | 典型条目 |
|---|---|---|
| MOVEMENT | 8 | 卫星 / 航班 / 军机 / ADS-B / 船舶 / 车流 / 公交 / 共享单车 |
| CAMERAS | 2 | CCTV 与街景 / NASA 近期影像 |
| INFRASTRUCTURE | 5 | 车牌识别相机 / 数据中心 / 海底光缆 / 水坝 |
| EVENTS | 4 | 30 天发射 / 24 小时地震 / 活跃火点 / 火场边界 |
| WEATHER | 5 | 风场 / 雷达 / 卫星云图 / 闪电 / 气旋路径 |
| UTILITIES | 2 | 路线测算 / 无线电 |
数据源写在每一行下面,6 家来源一眼能对上:CelesTrak 的卫星轨道、OpenSky 的航班、adsb.lol 的军机、AISStream 的船舶、USGS 的地震、NIFC 的火场边界。愿意自己加,一个图层就是一个独立模块。
默认全部关闭,点开才拉数据
刚打开时 26 个图层全是 OFF,右侧的时间戳统一写着 never。这个设计对带宽友好,也让第一次打开的画面很干净:只有底图和一个圆形的取景框。
逐条点开才有意思。打开航班图层,地球表面开始冒出飞机标签;打开发射图层,21 条轨迹会一起铺在地球上。

HUD 上的数字是从相机算出来的
四角那些军用格式的标注不是贴图,是跟着镜头实时算的。压到奥斯汀市中心时,四角给出这 5 个读数:
| 字段 | 读数 | 含义 |
|---|---|---|
| ALT | 627 | 米,相机离地高度 |
| GSD | 0.23 | 米,单像素地面分辨率 |
| NIIRS | 7.1 | 影像可解读等级 |
| SUN | -41.7 | 度,太阳高度角 |
| MGRS | 14R PU 2090 4906 | 军用网格坐标 |
GSD 会跟着高度线性变。拉到 18000 公里时同一个字段读到 2998841.65 米,NIIRS 掉到 0.0。这组数字是 Cesium 相机和椭球算出来的,不是随机数。
6 种视觉预设,参数还能拧
VISUAL PRESETS 那条横排有 6 个风格,本质是叠在地球上的着色器。点一下整体换色,不用重启,地球还在转。
| 预设 | 观感 |
|---|---|
| NORMAL | 原始卫星影像 |
| CRT | 显像管扫描线加暗角 |
| NVG | 夜视仪的绿色单色 |
| FLIR | 热成像白热 |
| ANIME | 高饱和描边 |
| NOIR | 黑白高反差 |
FLIR 面板上的 5 个滑杆
切到 FLIR 之后右侧会多出一整块参数面板,滑杆是可以拖的,改完立刻重绘。实测默认值如下:
| 参数 | 默认值 |
|---|---|
| Sensitivity | 0.85 |
| Bloom | 0.28 |
| BloomThresh | 0.35 |
| Pixelation | 1.0 |
| Innoise | 0.6 |
面板里还有 3 个快捷档:3D、white-hot、ALL,以及一个 SCOPE 分组控制取景框的强度和帧数。想让画面对着参考图调,改这 5 个数比换预设更直接。

太空任务与整颗地球
30 天窗口里有 21 条发射
SPACE MISSIONS 面板顶部写着 21 / 30D,意思是 30 天窗口内 21 条。列表按时间倒序,每条带火箭型号、发射方、日期。
| 火箭 | 发射方 | 日期 |
|---|---|---|
| Falcon Heavy | SpaceX | 2026-10-02 |
| Starship | SpaceX | 2026-09-28 |
| Long March 8A | CASC | 2026-10-25 |
| Electron | Rocket Lab | 2026-10-23 |
| H3-24 | Mitsubishi Heavy | 2026-10-19 |
点任意一条,镜头会把整颗地球拉远到能看见全部 21 个发射点,同时在地表打出带箭头的标记。这一步是相机动画,不是瞬移,能看出它飞了哪条弧线。

拉到 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 秒。作者没有对超远视距做保护,想拍「整个太阳系尺度」的图,这条路暂时走不通。

性能:60 帧,65.1 MB 堆
画面流畅度用 requestAnimationFrame 采样,60 帧跑完 994 毫秒,折算 16.6 毫秒一帧,也就是贴着 60 帧的上限跑。这个成绩是在 1440x900 的画布上、独显直连的情况下拿到的。
| 指标 | 数值 | 说明 |
|---|---|---|
| 启动器就绪 | 2.93 | 秒 |
| DOM 可用 | 18.49 | 秒,首次含瓦片 |
| 生产构建 | 8.96 | 秒 |
| 构建产物 | 42252133 | 字节,432 个文件 |
| JS 堆 | 65.1 | MB |
| 堆上限 | 124.6 | MB |
| 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,火点图层也只是公开卫星产品。它能做的是把公开信息摊在一个地球上,不做任何超出的部分。







