谷歌地图的3D街景(Google Street View)以及3D城市模型使用的不是公开标准格式,而是 Google 自定义的私有格式,以下是它们背后的主要数据格式和技术细节(基于公开资料与技术逆向分析):
🌐 一、3D 街景(Street View)
1. 图像部分
格式:JPEG、WebP、或类似压缩格式(部分使用 JPEG XR、JPEG 2000)
全景格式:Equirectangular(等距矩形投影),常见尺寸为
13312x6656
或类似的宽高比。Tile 切片方式:
- 图像被切片成瓦片(Tiles),根据缩放级别分层加载,类似于 Google Maps 瓦片地图。
- 切片 URL 通常通过 token+坐标的方式组合,需解码 API 请求。
2. 元数据(Metadata)
格式:JSON 或 Protocol Buffers(protobuf)序列化格式
包含:
- 相机位置(GPS)
- 朝向、视场角(pitch, yaw, fov)
- 拍摄时间、设备信息
- 邻近街景的 ID 列表(用于导航)
🏙️ 二、3D 城市模型(Google Earth 或 Maps 的倾斜摄影模型)
1. 模型部分
格式:Google 使用的是一种叫做 “glTF-like” 的私有格式,非标准 glTF,但结构类似
实际内部结构常见为:
.bin
或.pb
(protobuf 二进制),包含 mesh 顶点、索引、纹理坐标等.json
或manifest
描述文件(可类比 glTF 的 scene tree)- 高度优化与压缩(经常使用 Google Draco、Zstandard 等压缩)
2. 瓦片划分(Tiling System)
- 类似于 Cesium 3D Tiles 的金字塔瓦片结构(类似于 quadtree/octree)
- 每个区域以瓦片(tile)划分,每块 tile 内包含多个 mesh 与材质贴图
3. 材质贴图
- 使用压缩纹理(如 WebP、Basis、JPEG),并进行多级 mipmapping 优化网络加载速度
🛑 注意
谷歌并没有公开其3D模型和街景的完整格式规范,这些数据基本上都通过加密 API 或数据流加密保护,不开放下载与二次利用。部分开源项目(例如 google-maps-3d-hack
)通过逆向工程获取了部分解码逻辑,但需谨慎使用,可能违反服务条款。
🔄 与标准格式对比(参考)
数据类型 | Google 内部格式(私有) | 类似标准格式 |
---|---|---|
街景全景图像 | Equirectangular JPEG/WebP | JPEG, equirectangular |
3D Mesh | Protobuf + Binary | glTF, 3D Tiles |
材质贴图 | WebP / Basis | JPEG, PNG, KTX2 |
瓦片结构 | 自定义 tile LOD 树结构 | Cesium 3D Tiles |
好的,我们来详细解析一下 Google 地图中 3D Mesh 使用的 Protobuf + Binary 私有格式,以及与其类似的标准格式 glTF 和 3D Tiles,从结构、用途、优势、实现方式等方面进行对比。
✅ 一、Google 3D Mesh 使用的格式(Protobuf + Binary)
Google Earth 或 Google Maps 中的 3D 建筑、地形模型,使用了如下结构:
1. 数据结构
- 元信息:使用 Protocol Buffers (Protobuf) 编码
- 模型数据(Mesh、纹理):使用二进制数据(.bin),通常是自定义结构体布局
- 切片结构:基于 四叉树(Quadtree) 或 八叉树(Octree) 空间分层
2. 典型组成
文件类型 | 内容说明 |
---|---|
.pb 或 .pbf |
Protobuf 序列化的元信息(如 tile 索引、LOD、边界框、相机) |
.bin 或 .mesh |
实际的顶点坐标、法线、索引、纹理坐标等 |
.jpg/.webp |
纹理图 |
.manifest 或 .json |
根节点引用和层级说明 |
Google 使用自家优化方案对这些数据进行了压缩、加密和混淆。
✅ 二、glTF(GL Transmission Format)
glTF 是 Khronos Group 推出的现代 3D 模型标准,被称为“3D 场景的 JPEG”。
1. 格式类型
文件类型 | 说明 |
---|---|
.gltf |
JSON 格式描述文件,引用外部资源 |
.glb |
二进制封装版 glTF,包含所有资源 |
.bin |
外部二进制缓冲区(用于顶点、索引、法线等) |
.jpg/.png |
外部纹理贴图 |
2. 核心特性
- 支持网格(Mesh)、材质(PBR)、动画、骨骼、相机、节点树
- 支持 Draco 压缩、KTX2 纹理压缩
- 体积小,适合网络传输(Web-friendly)
3. 示例结构(gltf JSON):
{
"asset": { "version": "2.0" },
"scenes": [{ "nodes": [0] }],
"nodes": [{ "mesh": 0 }],
"meshes": [{
"primitives": [{
"attributes": {
"POSITION": 0,
"NORMAL": 1,
"TEXCOORD_0": 2
},
"indices": 3,
"material": 0
}]
}]
}
✅ 三、3D Tiles(由 Cesium 推出)
专为大规模地理空间数据(如城市模型、倾斜摄影)优化的格式,适用于:
- 城市级别 3D 建模
- 大量 Tile 的 LOD 加载
1. 组成文件
文件类型 | 说明 |
---|---|
tileset.json |
瓦片层级、空间结构、每个 tile 的 bounding volume |
.b3dm |
包含 glTF 的 3D Mesh + Metadata(Binary glTF + Batch data) |
.i3dm |
Instanced glTF(适用于大量重复模型) |
.pnts |
点云格式 |
.cmpt |
多类型组合格式(如多个 b3dm) |
2. 瓦片机制(LOD)
- 每个 tile 包含一部分区域的模型
- 根据相机距离自动加载不同分辨率
- 具备 culling、boundingVolume 等性能优化机制
3. b3dm 文件结构
Header (28 bytes)
├─ magic: 'b3dm'
├─ version: 1
├─ byteLength
├─ featureTableJsonLength
├─ batchTableJsonLength
├─ glb: 二进制 glTF 数据体
🧠 总结对比
特性 | Google 私有格式 | glTF | 3D Tiles |
---|---|---|---|
是否开放 | ❌ 否 | ✅ 是 | ✅ 是 |
是否支持瓦片LOD | ✅ 是 | ❌ 无(需自建结构) | ✅ 是(原生支持) |
文件结构 | Protobuf + Binary + Texture | JSON + BIN + Texture | JSON + 多种 Tile 格式 |
网络友好 | ✅ 高度优化 | ✅ 网络优先 | ✅ 为 WebGIS 设计 |
使用场景 | Google Earth/Maps | Web 3D 模型展示 | Cesium / 地理数据 |
🔧 开发者建议
目标 | 建议使用 |
---|---|
浏览器显示 3D 模型 | glTF / glb (如 three.js, babylon.js) |
GIS 城市级 3D 数据 | 3D Tiles (如 CesiumJS) |
模拟 Google Earth 效果 | 自建 3D Tiles + 倾斜摄影 模型 |
解码 Google 格式 | 高难度,不建议(需逆向 protobuf,违反 ToS) |