geoclaw 是一个 Google Earth 协议逆向工程的 Go 实现,提供从 Google Earth 服务器获取、解析、转换和渲染 3D 瓦片数据的完整工具链。支持将 Google Earth 的私有地形和影像格式转换为标准的 3D Tiles(GLB)格式,可用于 CesiumJS 等 Web 3D 地图框架。
本项目源自 retroplasma/earth-reverse-engineering 的逆向工程成果,使用 Go 语言重写了核心协议实现。
geoclaw/
├── cmd/ # 可执行程序入口
├── config/ # 应用配置
├── core/ # 核心业务逻辑
│ ├── gelib/ # Google Earth 协议库
│ ├── geomath/ # 地理数学工具
│ ├── httplib/ # HTTP 客户端
│ └── rocktree/ # 3D 模型解码库
├── crawler/ # 瓦片数据爬虫
├── handler/ # HTTP API 处理器
├── middleware/ # HTTP 中间件
├── pkg/ # 公共工具包
├── dbroot/ # Google Earth 数据库根数据
三个可执行程序入口:
| 程序 | 说明 |
|---|---|
cmd/server |
HTTP 服务端 — 提供 Google Earth 瓦片数据的实时代理、REST API 和 3D Tiles 桥接 |
cmd/crawler_flatfile |
离线瓦片爬虫 — 从 Google Earth flatfile 服务爬取地形和影像,生成 GLB + tileset.json |
cmd/tileset_gen |
tileset.json 生成器 — 从已有的 GLB 文件生成 3D Tiles 标准 tileset.json |
从环境变量加载配置(PORT、APP_ENV),提供 Config 结构体和 Load() 函数。
| 子目录 | 说明 |
|---|---|
| gelib | Google Earth 协议核心库 — 认证(GeAuth)、数据库根(GeDbRoot)、四叉树(QuadtreeSet)、地形解码(DecodeTerrain)、加密解密(GeCrypted)、GLB 生成(WriteNamedTexturedGLB) |
| geomath | 地理数学工具 — Web Mercator 投影转换(GeoToTile/TileToGeo)、四叉树路径编码(QuadTreePath)、八叉树编号(TreeNumbering)、瓦片边界计算(QtNodeBounds) |
| httplib | HTTP 客户端 — 支持代理配置、浏览器指纹(User-Agent 伪装)、Cookie 管理、gzip 解压、GET/POST 请求 |
| rocktree | 3D 模型解码库 — 节点元数据(Node)、批量元数据(BulkMetadata)、CRN/DXT1 纹理解压缩、纹理格式转换(DXT1→RGB→PNG)、JSON 序列化 |
封装 Google Earth rt/ REST API 的 HTTP 客户端:
| 文件 | 说明 |
|---|---|
client.go |
HTTP 客户端 — FetchPlanetoidMetadata、FetchBulkMetadata、FetchNodeData、URL pb= 参数编码 |
geo.go |
地理坐标转换(委托 core/geomath) |
node_manager.go |
线程安全的节点缓存管理器(sync.RWMutex) |
request.go |
Protobuf 请求构建器(Builder 模式) |
| 路由 | 说明 |
|---|---|
GET / |
首页(Hello, World!) |
GET /tiles/ |
3D Tiles 动态桥接 — 实时从 Google Earth 获取并转换 |
GET /api/planetoid |
星球元数据 JSON API |
GET /api/bulk |
批量元数据 JSON API |
GET /api/nodedata |
节点数据 JSON API |
GET /api/v2/bulk |
批量元数据 V2 API(按类型分类返回) |
| 中间件 | 说明 |
|---|---|
chain.go |
中间件链模式 |
cors.go |
CORS 跨域支持(Allow-Origin: *) |
logger.go |
请求日志(唯一 ID + 处理时长) |
recovery.go |
Panic 恢复(返回 500) |
| 子目录 | 说明 |
|---|---|
logger |
分级日志(Debug/Info/Warn/Error) |
response |
标准 JSON API 响应封装({code, message, data}) |
包含 Google Earth 的 dbRoot 数据文件(earth1036.dat + earth1036.key),用于协议初始化和数据解密。
Google Earth Server
│
├─── rt/ REST API ──── crawler/client ──── handler/api ──── HTTP JSON API
│ │
│ └─── handler/tileset ──── 3D Tiles (tileset.json + GLB)
│
└─── flatfile ──── cmd/crawler_flatfile ──── GLB 文件 + tileset.json
│
└─── cmd/tileset_gen ──── tileset.json(从已有 GLB)
- 认证 →
gelib.GeAuth()获取 Session ID - 初始化 →
gelib.GeDbRoot()获取数据库根配置和加密密钥 - 元数据 →
crawler.FetchPlanetoidMetadata()/FetchBulkMetadata()获取节点树 - 数据获取 →
crawler.FetchNodeData()或 flatfile 下载地形+影像 - 解密 →
gelib.GeCrypted.JieBao()解密 Google Earth 加密数据 - 解码 →
gelib.DecodeTerrain()解码地形网格 - 纹理 →
core/rocktree解码 CRN/DXT1 纹理 → RGB - 输出 →
WriteNamedTexturedGLB()生成标准 GLB 文件 - 组织 → 构建 3D Tiles tileset.json(含 LOD、边界盒、子 tileset 分割)
- Go 1.26+
- 可选:SDL2、Eigen3(C++ 客户端)
# 启动 HTTP 服务
go run ./cmd/server
# 访问 API
curl http://localhost:8080/api/planetoid
curl "http://localhost:8080/api/bulk?path=020"
curl "http://localhost:8080/api/nodedata?path=020&epoch=12345"# 爬取喜马拉雅区域地形数据
go run ./cmd/crawler_flatfile -key 020121132332 -max-level 6 -out ./tiles
# 从已有 GLB 生成 tileset.json
go run ./cmd/tileset_gen -dir ./tiles -out tileset.json启动服务后,在 CesiumJS 中加载:
const tileset = await Cesium.Cesium3DTileset.fromUrl(
'http://localhost:8080/tiles/tileset.json'
);详见 DEVELOPMENT.md,包含:
- Go Workspace 多模块管理
- 编码规范(命名、文件组织、错误处理)
- 测试规范(表驱动测试、覆盖率、竞态检测)
- Git 提交规范(Conventional Commits)
- 分支策略
- 代码质量门禁
| 技术 | 用途 |
|---|---|
| Go 1.26 | 主要开发语言 |
| Protocol Buffers | Google Earth 数据序列化 |
| 3D Tiles 1.1 | 3D 瓦片标准格式 |
| GLB (glTF Binary) | 3D 模型格式 |
| Web Mercator | 瓦片投影坐标系 |
| CRN / DXT1 | Google Earth 纹理压缩格式 |
| C++ / SDL2 / OpenGL | 原生 3D 渲染客户端 |
| Emscripten / WebAssembly | 浏览器端 3D 渲染 |