6.2 KiB
6.2 KiB
收到,明白了。您决定走**“硬核极客”**路线:全开源技术栈 + 自主处理 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) 上传到本地服务器或静态托管服务进行测试。
- 步骤 1 (编码): 编写 Shell/Python 脚本,使用
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 的墨卡托坐标。
- 实现 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 (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 (用于生成 Terrain-RGB)
- MapLibre: maplibre-gl-js
📝 开发者备注 (Notes for Developer)
- 数据体积警告: 地形瓦片非常占用空间。建议只切片 14 座山峰周围 50km 的区域,不要尝试切片整个地球,否则你的硬盘会爆,免费托管也会超限。
- 坐标系转换: GDAL 处理时主要使用
EPSG:4326(WGS84),但在切片 (gdal2tiles) 时通常需要转换为EPSG:3857(Web Mercator) 以适配 Web 地图标准。 - 接缝处理: 如果下载的 DEM 是分块的,在转 RGB 之前最好先用
gdal_merge.py把它们拼成一张大图,避免地形出现裂缝。