如何为 God's Eye View 添加一个新数据层:图层接口从零到合并的完整教程
【免费下载链接】gods-eye-viewA spy satellite simulator in your browser, except the data is real. Live open source spatial intelligence on a photorealistic 3D globe.项目地址: https://gitcode.com/GitHub_Trending/go/gods-eye-view
God's Eye View是一个运行在浏览器里的开源"间谍卫星模拟器"——它用真实数据驱动一个照片级真实的 3D 地球,实时呈现航班、船舶、监控摄像头、无线电、海底电缆等开放空间数据。想让自己的数据也上"天"吗?本教程带你完整走一遍:从读懂God's Eye View 图层架构,到创建图层目录、注册数据源、接入图层面板,最后通过边界检查完成合并。
🌍 第 1 步:理解图层架构(先读这 5 分钟)
在动手之前,先搞清楚一个数据层由哪几块组成。项目文档 docs/CODE-BOUNDARIES.md 用一张"组件归属表"讲得很清楚:
| 目录 | 职责 | 你改哪里 |
|---|---|---|
src/layers/<family>/ | 数据获取、记录、Cesium 渲染资源 | ✅ 新图层主体 |
src/app/layers/ | 把场景服务注入每个图层工厂 | ✅ 加一行装配 |
src/app/ | 应用装配、目录注册、生命周期 | ✅ 注册图层 |
src/data/ | 图层状态、分享链接编解码 | ✅ 注册状态条目 |
server/providers/ | Node 端数据代理与缓存 | ⭕ 视数据源而定 |
一个简单记法:src/layers写图层本体,src/app负责装配,src/data负责状态与分享,server负责取数。更多装配细节可参考 docs/APPLICATION.md 与 docs/INFRASTRUCTURE-LAYERS.md。
📁 第 2 步:创建图层目录,照抄"自行车共享"样板
项目里现成的 src/layers/bikeshare/ 是结构最紧凑的图层之一,把它当作你的模板。典型目录长这样(以 bikeshare 为例):
index.js—— 图层总装:把下面各模块拼成一个完整图层实例source.js——数据源接口:对外只暴露取数方法(如getStations)ingestion.js—— 数据拉取与更新节奏lifecycle.js—— 开启/关闭/清理rendering.js—— Cesium 资源绘制state.js/model.js/policy.js—— 状态、数据模型与策略source.test.mjs—— 数据源的单元测试
打开 src/layers/bikeshare/index.js 可以看到装配顺序:createState → createIngestion → createModel → createViewport → createRendering → createSelection → createControls → createLifecycle。每个模块都通过统一的context = { state, services, parts, source }通信——这就是 God's Eye View 的图层接口约定:模块间不互相 import,全部经由 context 传递。
🔌 第 3 步:实现数据源(source)并声明取数方法
数据源是图层与外界的唯一通道。装配入口 src/app/constructCatalog.js 中有一份SOURCE_METHODS清单,它规定了每个图层的数据源必须实现哪些方法,例如:
bikeshare: ['getStations'], cctv: ['getCatalog', 'getHealth', 'getFrameUrl', 'getMediaUrl'], traffic: ['requestRoads', 'getStatus', 'fetchFlowForBounds', ...]你要做的就是:
- 在
SOURCE_METHODS中为你的图层声明取数方法列表; - 在 src/standalone/layerSources.js 中提供对应的 provider(浏览器直连或走
server/providers/的 Node 代理均可); - 确保导入模块不会立即发起请求——边界检查会拦截这一点。
💡 如果你的数据需要代理(如跨域、缓存),参考 server/providers/ 下
gbfs.js这类小型 provider 的写法:一个 middleware + 进程级缓存,不引入任何渲染代码。
🧩 第 4 步:把图层注册进应用目录(catalog)
这一步让图层"活"起来。涉及两个文件:
① 应用装配:在 src/app/constructCatalog.js 的createApplicationCatalog中,仿照createApplicationBikeshare加一行。每个图层的装配模块放在 src/app/layers/ 下(如 src/app/layers/bikeshare.js),职责只有一个——把场景服务(渲染调度、拾取注册、覆盖层等)注入图层工厂:
export function createApplicationBikeshare({ source }) { return createBikeshareLayer({ source, services: { render, sprites, picking, overlays }, }); }② 目录登记:src/app/catalog.js 的createLayerCatalog要求图层实例与序列化元数据一一对应,重复或缺失的 id 会直接抛错——这是防止拼写错误进入共享链接的第一道闸门。若你的图层需要被面板按钮直接控制,还要在CONTROL_LAYER_IDS中登记。
注册完成后,图层就会出现在侧边栏图层面板中,可随时开关。下面这张动图展示的就是全球电台图层开启后的真实效果:
🔖 第 5 步:注册图层状态(图层开关 + 分享链接)
想让图层的开/关状态可以被本地保存并编码进分享链接吗?答案是 src/data/layerState.js 中的LAYER_STATE_REGISTRY。每个条目长这样:
{ id: 'bikeshare', token: 'b', disposition: 'enabled-only' }id:与 catalog 中图层 id 完全一致token:一个未占用的单字母(用于 URL 中l=字段,如?l=b.f.t)disposition:enabled-only(只有开关)或enabled+options(还带图层选项)
若图层带选项(如 CCTV 的覆盖模式),还需在OPTION_GROUPS中声明选项规格。该文件内置validateLayerStateRegistry自检:token 重复、id 非法会立即报错,合并前跑一次测试即可验证。
✅ 第 6 步:跑通检查,准备合并
God's Eye View 有非常严格的架构门禁,提交前务必本地跑通:
| 命令 | 作用 | 依据 |
|---|---|---|
npm run test | 单元测试(含图层 source 测试) | TESTING.md |
npm run check:boundaries | 导入方向 + 包边界双检查 | scripts/check-import-directions.mjs、scripts/check-package-boundaries.mjs |
npm run format:check | Prettier 格式一致性 | docs/CODE-BOUNDARIES.md |
最容易踩的两个坑:
- 浏览器图层 import 了 Node/渲染模块—— 数据源(source)必须是可移植的纯模块,不能触碰 Cesium、DOM 或
fetch全局; - 导入即发起请求—— 工厂函数调用才创建缓存状态,import 时不做任何获取。
📋 合并前自查清单
- 新图层目录位于
src/layers/<family>/,模块间通过 context 通信 SOURCE_METHODS已声明取数方法,且实例均通过校验- catalog 中图层 id 与
LAYER_STATE_REGISTRY的 id 完全一致 - 分享 token 全局唯一,未占用现有字母
source.test.mjs覆盖空响应、畸形数据等边界情况npm run check:boundaries与npm run format:check全部通过
🚀 结语
God's Eye View 的图层体系设计得很克制:source 管取数、layers 管渲染、catalog 管注册、layerState 管持久化,四者各司其职。照着 bikeshare 这个样板,从目录到合并通常只需要几天时间。完成一次贡献后,别忘了在 CHANGELOG.md 中为你的新图层留下一笔——它可能正是下一个用户打开地球时看到的第一层数据。
【免费下载链接】gods-eye-viewA spy satellite simulator in your browser, except the data is real. Live open source spatial intelligence on a photorealistic 3D globe.项目地址: https://gitcode.com/GitHub_Trending/go/gods-eye-view
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考