介绍

Mapbox Terrain RGB是Mapbox推出的高程数据切片格式,通过PNG图像内的红色、绿色和蓝色通道来编码以米为单位的原始高度值,可以当作是建模里的UV贴图直接加载于Mapbox GL框架或Unity里面。Terrain-RGB将每个颜色通道作为256进制编号系统中的一个位置,允许有16,777,216个唯一值。

高度计算公式如下:height = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1)

制作

数据源

这里使用的数据源是2024年更新的AW3D30v4.1,主要数据是由JAXA的ALOS 01星在2006至2011年利用PRISM (Panchromatic Remote-sensing Instrument for Stereo Mapping)倾斜测量得到的。
其有商业的2.5/5米DSM数据可以购买(24年ALOS 04星上去了可以考虑下L波段InSAR制作出来的DTM),开源的30米AW3D30则是对其降采样得到的。

从JAXA注册个账号即可下载AW3D30数据。推荐使用位于日本的服务器,直接下载5°x5°的栅格数据效率高一点,其他地区似乎均有10Mbps限速。

数据处理

安装mapbox/rio-rgbify以伪256进制编码的任意位深度的栅格图像。

pip install rio-rgbify

一些基本参数如下

Usage: rio rgbify [OPTIONS] SRC_PATH DST_PATH

Options:
  -b, --base-val FLOAT   The base value of which to base the output encoding
                         on [DEFAULT=0]
  -i, --interval FLOAT   Describes the precision of the output, by
                         incrementing interval [DEFAULT=1]
  -r, --round-digits     Less significants encoded bits to be set
                         to 0. Round the values, but have better
                         images compression [DEFAULT=0]
  --bidx INTEGER         Band to encode [DEFAULT=1]
  --max-z INTEGER        Maximum zoom to tile (.mbtiles output only)
  --bounding-tile TEXT   Bounding tile '[{x}, {y}, {z}]' to limit output tiles
                         (.mbtiles output only)
  --min-z INTEGER        Minimum zoom to tile (.mbtiles output only)
  --format [png|webp]    Output tile format (.mbtiles output only)
  -j, --workers INTEGER  Workers to run [DEFAULT=4]
  -v, --verbose
  --co NAME=VALUE        Driver specific creation options.See the
                         documentation for the selected output driver for more
                         information.
  --help                 Show this message and exit.

根据前面的换算公式将基准高度设为-10000米。如果原始栅格数据内有无数据值需要用gdalwarp先转换一步,忽略掉无数据值,不标记任何像素为无效值,转换后保留其原始值。这里设置NODATA=255是兜底操作防止有时数据没设置上。

rio rgbify -i 0.1 --co NODATA=255 -b -10000
C:\Users\Administrator\Desktop\DSM\ALPSMLC30_N022E113_DSM.tif
C:\Users\Administrator\Desktop\DSM_RGB\ALPSMLC30_N022E113_DSM_RGB.tif

数据切片

完成编码后数据处理就完成了,你可以转换成MBTiles一个单文件配合后端服务去提供切片。但是运行一个后端总归是要服务器资源(包括Serverless),在我看来不如一步到位直接切成XYZ切片静态资源,随意在各种无限制的Pages上部署。
切片这里用的是OSGeo4W自带的gdal2tiles,当然也有很多别的开源工具去切,主要对CPU计算性能和硬盘空间有点要求请见下一节对腾讯云服务器的性能测试(不在意生成耗时无所谓)。
先将所有编码完的栅格图片配置成一个vrt,然后运行gdal2tiles完成切片。

python gdal2tiles.py -p mercator -w all -r average -a 0.0
C:\Users\Administrator\Desktop\DSM_RGB\DSM_RGB.vrt
C:\Users\Administrator\Desktop\DSM_RGB\Tiles --xyz

性能测试

因为要从JAXA的服务器拉大量数据而且对计算性能有一定要求,所以本次采用的是来自腾讯云的日本东京可用区的计算型C4云服务器。规格型号为C4.2XLARGE16配置为8vCPU,16GiB内存,处理器为Intel Xeon Cascade Lake 6231C,主频3.2GHz/睿频3.7GHz。

图中可见运行时对内存没什么占用,而腾讯云更多核心的实例配置内存来到了32-64GiB完全多余。全中国区12级切片done in 00:15:53.,剩余1-11级done in 00:03:53.。同时实例支持4Gbps内网宽带,完成切片后可直接走内网上传到东京可用区的COS对象存储。


寂静在喧嚣里低头不语,沉默在黑夜里与目光结交