summit/ROADMAP.md

108 lines
6.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

收到,明白了。您决定走**“硬核极客”**路线:**全开源技术栈 + 自主处理 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` 把它们拼成一张大图,避免地形出现裂缝。