2024 年初,Sogelink Research 团队开始了一个激动人心的项目:开发一项名为CTOD的开源服务,即 Cesium Terrain On Demand。该服务根据云优化 GeoTIFF (COG) 的量化网格格式按需生成 TILES。这些tiles非常适合在开源 Cesium 查看器中显示详细地形,甚至可以与 Unity 和 Unreal 的 Cesium 插件配合使用。
为什么按需生成图块会改变游戏规则?因为,我们不必用数百万个预先生成的图块(其中大多数可能永远不会面世)来填满存储空间,而是可以将 COG 文件存储在云中,例如 S3 存储中,并仅在需要时生成图块。这就像只在有人真正想吃饼干时才烤饼干一样——浪费少得多!此外,CTOD 具有高度可配置性,允许您决定图块的详细程度。它还可以消除其他工具经常遇到的那些令人讨厌的法线边缘问题。
在这篇文章中,我们将逐步介绍如何 准备数据集以供 使用。
CTOD 使用网格法生成图块,显示线框
生成步骤:
-
从所有下载的 DTM GeoTIFF创建云优化 GeoTIFF 文件。
-
创建一个包含所有这些 COG 的.vrt (虚拟光栅表)。
-
在线上传 COG并通过 客户端 请求图块。
优化重心
如果您处理的是小型数据集,您可能无需优化云优化 GeoTIFF (COG)。但是,当您处理较大的数据集时,优化可以显著提高性能。
投影
为了确保 CTOD 正确返回图块以供在 Cesium 中查看,数据需要采用 EPSG:4326 投影。虽然 CTOD 可以动态处理任何投影中的 COG,但这可能是一个瓶颈,尤其是对于大型数据集。因此,为了保持顺畅和快速,最好在创建 COG 之前将我们的 GeoTIFF 文件重新投影到 EPSG:4326。
TILE方案
Cesium 查看器使用WorldCRS84Quad切片模式请求切片。当切片请求进入 CTOD 时,它会使用HTTP 范围请求获取 COG 的相关部分。通过在考虑 WorldCRS84Quad 切片模式的情况下创建 COG,我们可以提高性能。此设置将图像划分为切片,每个切片代表栅格数据的小块,大小固定,与用于请求地形切片的切片模式完美匹配。在本文末尾的脚本中可以找到如何执行此操作的示例。
WorldCRS84Quad 平铺方案
概述
概览图本质上是原始图像的缩小版和低分辨率版本,这一过程称为降采样。通过增加网格单元的大小,可以使图像更小、细节更少。GeoTIFF 文件通常包含不同缩放级别的多个概览图。如果没有这些概览图,图块请求可能会从 COG 中提取大量数据,然后必须对其进行降采样才能适合 256x256 图块。
GeoTIFF 概览
对于我们的数据集,拥有 10 个概览效果很好,因为最低概览级别恰好适合单个 256x256 图块。您可以使用该gdalinfo
工具检查不同概览级别的图像大小。
网站优化
为了提高一点性能,我们可以将数据集与切片方案精确对齐。这可以通过在创建 COG 时使用--aligned-levels
标志来实现。对齐级别是指 GeoTIFF 图块与切片方案中定义的图块完美匹配的概览级别数。rio-cogeo
但是,有一个问题:设置过多对齐级别可能会在数据集周围引入明显的“无数据”边界。当通过 .vrt 文件使用多个 COG 时,这尤其成问题。如果重叠太多,CTOD/GDAL 将需要从所有重叠文件中获取多个图块并合并它们,这可能会减慢速度。
下面是将对齐级别设置为 8 时可以添加多少无数据(以红色突出显示)的示例。
由于重叠,对齐级别 8 导致对 COG 文件产生巨大的额外请求
使用对齐级别 2,我们可以在对齐和在数据周围添加无数据之间找到一个中间立场
对齐级别 2
当然,也存在以下问题。
高度不正确
在创建了一些测试用例并通过 CTOD 请求地形后,我们注意到了一些奇怪的东西:漂浮的房屋和树木!它看起来就像是超现实科幻电影中的场景。显然,高度数据有些不对劲……
是大地水准面与椭球体的问题,我们的数据最初是 平面坐标系,但需要转换为 EPSG:4326才能获得正确的基于椭球体的高度。通过这种转换,一切都恢复正常,并且高度现在看起来是正确的!
Nodata 值异常
我们的 GeoTIFF 带有大量无数据值,尤其是在水体周围。这导致了一些不太理想的视觉效果,存在明显的间隙和峰值。问题源于 CTOD 自动将无数据值视为高度 0 以便能够处理数据,这会导致出现那些奇怪的伪影。显然,这不是我们想要的效果!
为了解决无数据问题,我们可以填充这些空白区域。虽然可能还有更完善的解决方案,但事实证明这种蛮力方法对我们来说非常有效。有时,当有疑问时,最好大胆尝试!
投影后边缘参差不齐
将 GeoTIFF 投影到不同的坐标系后,我们注意到了一些对齐问题。具体来说,图块之间有 1 像素宽的狭窄间隙。这些微小的间隙会变得非常明显,并破坏我们想要的无缝外观。
这就是 QGIS 中 Tiff 数据不显示的情况
GeoTIFF 文件之间的像素宽度差距
这是渲染地形时这些间隙的样子
但在无数据值的数据周围添加一个像素。地形看起来好多了!