108 lines
6.2 KiB
Markdown
108 lines
6.2 KiB
Markdown
收到,明白了。您决定走**“硬核极客”**路线:**全开源技术栈 + 自主处理 NASA 数据**。
|
||
|
||
这意味着我们要放弃现成的商业瓦片服务,转而自己搭建一套“地形瓦片生产流水线”。虽然前期工作量稍大,但完全免费且自主可控,非常有成就感。
|
||
|
||
这份修正后的 `ROADMAP.md` 专注于 **MapLibre GL JS** 和 **数据预处理** 流程。
|
||
|
||
***
|
||
|
||
# 🏔️ Project 14 Peaks: Open Source Edition
|
||
|
||
本项目旨在构建一个**完全免费、零商业依赖**的 Web 3D 地球可视化项目,展示全球 14 座 8000 米级雪山。
|
||
|
||
核心理念是“数据自主”:直接从 NASA 获取原始地形数据,自行加工处理,并使用开源引擎 **MapLibre** 进行渲染。
|
||
|
||
## 🛠 技术栈 (Tech Stack)
|
||
|
||
| 模块 | 技术选型 | 说明 | 费用 |
|
||
| :--- | :--- | :--- | :--- |
|
||
| **核心引擎** | **MapLibre GL JS** | Mapbox 的开源分支,API 兼容,完全免费 | **$0** |
|
||
| **3D 渲染** | **Three.js** | 负责渲染攀登路线、营地、光效 | **$0** |
|
||
| **地形数据源** | **NASA SRTM / ASTER** | 30m 精度原始 GeoTIFF 数据 | **$0** |
|
||
| **卫星影像源** | **Esri World Imagery** | 免费且高质量的全球卫星图源 (无需 Key) | **$0** |
|
||
| **数据处理工具** | **GDAL / rio-rgbify** | Python/CLI 工具,用于将 TIFF 切割为 RGB 瓦片 | 开源 |
|
||
| **数据托管** | **GitHub Pages / Vercel** | 静态托管切好的地形瓦片 | **$0** |
|
||
|
||
---
|
||
|
||
## 📅 开发路线图 (Roadmap)
|
||
|
||
### Phase 1: 数据生产流水线搭建 (Data Pipeline Setup)
|
||
**这是本路线最核心、最硬核的部分。** 目标是建立一套将 NASA 原始数据转化为 Web 可用瓦片的工作流。
|
||
|
||
- [ ] **环境准备**
|
||
- [ ] 安装 Python 环境。
|
||
- [ ] 安装 GDAL 库 (地理空间数据处理瑞士军刀)。
|
||
- [ ] 安装 `rio-rgbify` (用于将高程编码为 RGB 颜色)。
|
||
- [ ] 安装 `gdal2tiles` (用于将大图切割为金字塔瓦片)。
|
||
- [ ] **数据获取 (以珠峰为例)**
|
||
- [ ] 注册 NASA Earthdata 或访问 USGS Earth Explorer。
|
||
- [ ] 下载珠峰区域 (27.9N, 86.9E) 的 **SRTM 1 Arc-Second Global** GeoTIFF 文件。
|
||
- [ ] **数据处理脚本编写**
|
||
- [ ] **步骤 1 (编码):** 编写 Shell/Python 脚本,使用 `rio-rgbify` 将原始 DEM 转换为 RGB 编码的 TIFF (`base_val=-10000`, `interval=0.1`)。
|
||
- [ ] **步骤 2 (切片):** 使用 `gdal2tiles` 将编码后的 TIFF 切割为 Zoom Level 10-14 的瓦片文件夹结构。
|
||
- [ ] **步骤 3 (托管):** 将生成的瓦片文件夹 (`/tiles/{z}/{x}/{y}.png`) 上传到本地服务器或静态托管服务进行测试。
|
||
|
||
### Phase 2: 前端引擎实现 (MapLibre Integration)
|
||
目标:使用开源引擎成功加载我们自己生产的地形瓦片。
|
||
|
||
- [ ] **MapLibre 初始化**
|
||
- [ ] 引入 `maplibre-gl.js`。
|
||
- [ ] 配置 `style` 对象,使用 **Esri World Imagery** 作为底图源 (Tiles URL: `https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}`).
|
||
- [ ] **加载自定义地形**
|
||
- [ ] 配置 `raster-dem` 源,指向 Phase 1 中生成的瓦片 URL。
|
||
- [ ] 设置 `encoding: "mapbox"` (因为我们用 rio-rgbify 模仿了 Mapbox 的编码格式)。
|
||
- [ ] 调试:确保珠峰看起来是立体的,而不是平面的。
|
||
- [ ] **Three.js 图层接入**
|
||
- [ ] 实现 MapLibre 的 `CustomLayerInterface` (与 Mapbox API 基本一致)。
|
||
- [ ] 完成坐标同步:将经纬度转换为 MapLibre 的墨卡托坐标。
|
||
|
||
### Phase 3: 14座山峰数据迭代 (Data Scaling)
|
||
目标:将单座山的流程复制到所有 14 座山峰。
|
||
|
||
- [ ] **批量数据处理**
|
||
- [ ] 整理 14 座山峰的坐标列表。
|
||
- [ ] 批量下载这 14 个区域的 SRTM 数据。
|
||
- [ ] 运行自动化脚本,生成所有山峰的地形瓦片包 (注意控制文件体积,仅生成山峰核心区域)。
|
||
- [ ] **路线数据 (GPX)**
|
||
- [ ] 从 OpenStreetMap/SummitPost 获取 14 条路线 GPX。
|
||
- [ ] 编写解析器,利用 MapLibre 的 `queryTerrainElevation` (如果支持) 或在预处理阶段获取海拔,确保路线贴合地面。
|
||
|
||
### Phase 4: 交互与视觉开发 (Visualization)
|
||
目标:在开源引擎上实现不输商业引擎的视觉效果。
|
||
|
||
- [ ] **3D 场景构建**
|
||
- [ ] 绘制攀登路线 (`TubeGeometry`)。
|
||
- [ ] 标记关键营地 (Camp 1, Camp 2, C3, C4, Summit)。
|
||
- [ ] **视觉增强**
|
||
- [ ] **大气层模拟:** 由于 MapLibre 原生天空层较简单,考虑编写 Custom Shader 或使用简单的 CSS 渐变背景模拟高空大气。
|
||
- [ ] **光照:** 在 Three.js 场景中添加模拟太阳的平行光,根据山峰朝向调整光影。
|
||
- [ ] **漫游控制器**
|
||
- [ ] 实现点击列表切换山峰的功能 (Camera FlyTo)。
|
||
|
||
### Phase 5: 优化与部署 (Optimization)
|
||
- [ ] **瓦片加载优化:** 确保只在视野内加载地形瓦片。
|
||
- [ ] **资源压缩:** 压缩 PNG 瓦片以减少带宽消耗。
|
||
- [ ] **部署:** 将前端代码 + 地形瓦片数据一同部署到 GitHub Pages (如果是小范围数据) 或 Cloudflare R2/AWS S3 (如果数据量较大)。
|
||
|
||
---
|
||
|
||
## 📂 数据与资源清单 (Resources)
|
||
|
||
### 1. 核心数据源 (Free Sources)
|
||
* **Elevation:** [NASA Earthdata Search](https://search.earthdata.nasa.gov/) (Collection: SRTM 1 Arc-Second Global)
|
||
* **Imagery:** Esri World Imagery (通过 REST API 访问,无需 Token)
|
||
* **Routes:** OpenStreetMap (Overpass API) / SummitPost
|
||
|
||
### 2. 关键工具 (Tools)
|
||
* **GDAL:** `gdal_translate`, `gdalwarp`
|
||
* **rio-rgbify:** [Mapbox/rio-rgbify](https://github.com/mapbox/rio-rgbify) (用于生成 Terrain-RGB)
|
||
* **MapLibre:** [maplibre-gl-js](https://maplibre.org/)
|
||
|
||
---
|
||
|
||
## 📝 开发者备注 (Notes for Developer)
|
||
|
||
1. **数据体积警告:** 地形瓦片非常占用空间。建议**只切片 14 座山峰周围 50km 的区域**,不要尝试切片整个地球,否则你的硬盘会爆,免费托管也会超限。
|
||
2. **坐标系转换:** GDAL 处理时主要使用 `EPSG:4326` (WGS84),但在切片 (`gdal2tiles`) 时通常需要转换为 `EPSG:3857` (Web Mercator) 以适配 Web 地图标准。
|
||
3. **接缝处理:** 如果下载的 DEM 是分块的,在转 RGB 之前最好先用 `gdal_merge.py` 把它们拼成一张大图,避免地形出现裂缝。 |