制作3D地形(二):高程数据处理
前言:为了能在建模软件 Blender 中成功建立起3D模型,需要对高程数据进行预处理。高程数据,你也可以叫 DEM(数字高程模型)数据。这种数据有多种表现形式,同样也有多种储存方式,或者说格式;最常见的就是以灰度值来表示高程的灰度栅格数据 TIFF,后缀为 tif 的格式。后文说的高程数据都是指高程灰度图栅格数据。Blender 就是通过读取高程数据中各像素的灰度值来获取相应的高度信息,然后建立起3D模型。Blender 仅读取灰度值,对其空间坐标信息不敏感,读入到 Blender 中的空间坐标信息就没了,所以不一定非要 TIFF 数据才行,只要是灰度栅格图像,比如 PNG 和 JPEG 格式,在保证像素类型正确的前提前,都是可以通过 Blender 建立3D模型的。根据具体的情况和相应的场景可能需要不同的格式,不过一般使用 TIFF 格式的就可以了。数据处理分为以下4个部分,其中最后两个部分才是重中之重,并且所有的操作都同时提供 ArcGIS 和 QGIS 两种处理方式:数据获取;合并-裁剪-投影-重采样;范围拉伸;转换像素类型。理论非常简单,但是制作出的地形模型好坏的关键就是数据处理。文章最后会提供原始高程数据以及处理完成后的数据,你可以在后续的教程和个人的试验中使用,需要的可以自取。第一步 数据获取
制作3D模型需要高程数据,现在获取高程数据的有效途径非常多,读者可以根据自己的需要选择合适分辨率的高程数据,如果你想制作小比例尺大范围的地图,最好选择较大空间分辨率的高程数据,比如1千米x1千米分辨率;而如果你想制作大比例尺较为精细的地图的话,就可以选择10米x10米、甚至更小空间分辨率的高程数据。特别提醒一点,小心使用保密数据,尽量不用。你能在网上下载到的数据想怎么折腾都可以。网上有很多关于高程数据的获取指南,各位可以根据自己的实际情况获取相应的数据。笔者目前使用较多的是下面这个网站:http://viewfinderpanoramas.org/Coverage%20map%20viewfinderpanoramas_org3.htm该网站可以下载全球的高程数据,其中中国区域高程数据的空间分辨率一般都是90米,最重要的是下载速度不慢;打开网址可以看到很多小格子,点击就可以下载这个区域内的 DEM 数据,解压后数据格式是 HGT 格式,可以直接用 ArcGIS 或者 QGIS 打开。
第二步 合并-裁剪-投影-重采样
其实这四个操作都是可选的,因为并不是所有数据都需要全部走一遍这些流程,因为你完全可以使用一个已经处理好、同时已经设置了投影系的 tif 数据。不过可能并不是所有读者都有 GIS 相关背景经验,可能有的读者仅仅是兴趣使然,所以为了不落下每一个人,这里讲一下如何合并-裁剪-投影-重采样,对此非常熟悉的读者朋友可以跳过这一小节,直接进入下一小节。2.1 合并通常来说,高程数据都是一块一块的矩形;所以你很有可能需要通过将多个矩形合并起来获取目标范围区。将周围的高程数据添加进来,将其合并(也叫镶嵌)成一个整块。
4块高程数据>>工具位置ArcGIS 可以使用镶嵌至新栅格工具,该工具位于数据管理工具->栅格->栅格数据集->镶嵌至新栅格。QGIS 中使用 Merge 工具可以镶嵌栅格;该工具来自于 GADL 包。位于QGIS 右侧工具栏,GDAL->Raster miscellaneous->Merge。或者在上方工具栏中快捷打开:
>>2.2 裁剪>>工具位置ArcGIS 可以使用裁剪工具;位于数据管理工具->栅格->栅格处理->裁剪;QGIS 中依然在上方的 Raster 菜单中,依次点击 Extraction-> Clip raster by mask layer 即可。>>2.3 投影在 Blender 读取高程数据之前应该确保高程数据已经正确设置好了投影。不然 Blender 读取的形状就是扁的,因为这个扁扁的形状才是投影前高程数据的真实情况。那为什么 ArcGIS 中就显示正常呢?因为 GIS 软件会自动做一个投影显示。所以设置投影系是必不可少的一步操作。
左:投影前的真实形状,形状更扁;右:投影后>>工具位置ArcGIS 中的投影工具在数据管理工具->投影和变换->栅格->投影栅格;QGIS 的投影工具在菜单栏上方的 Raster-Projections-Warp。>>2.4 重采样重采样:根据一部分像素的信息赋值给其他像素信息的过程。这里的重采样应该叫修改像素空间分辨率,只不过也是用重采样的方式实现而已。什么叫空间分辨率?一个像素所表示的实际地理大小就是空间分辨率。比如这个教程使用的高程数据空间分辨率是90米,那么这就代表一个像素映射现实生活中一个90米长、90米宽的方形区域。如果想要制作整个中国的3D模型,90米分辨率就太精细了,整个数据量就非常庞大,直接让电脑死机,所以可以通过重采样为1千米或者10千米。单独的重采样工具不是所有 GIS 软件中都有,GIS 软件中一些和栅格相关的工具通常会自带修改空间分辨率的选项,所以可以顺便设置好空间分辨率大小;比如使用 QGIS 时我就喜欢使用栅格投影工具来顺便修改空间分辨率。该教程提供的高程数据空间分辨率大小合适,不需要修改。>>工具位置ArcGIS 中的单独重采样工具在数据管理工具->栅格->栅格处理->重采样;ArcGIS 10.3版本有4种方法。QGIS 的话我是直接使用投影工具来解决,因为 QGIS 本身没有独立的重采样工具,在 QGIS 主界面上面的菜单栏中选择 Raster-Projections-Warp 即可。将投影工具中的投影选项空着,只需要设置好 Output file resolution in target georeferenced units 这个选项,就可以在不修改投影的前提下修改空间分辨率。>>第三步 范围拉伸
范围拉伸,英文:rescale。范围拉伸是指把高程数据的范围扩大,普通的高程数据一般就在0到4000左右,教程提供的高程数据范围是42到2283(是否构建栅格金字塔会导致范围些许的不同,不过影响不大),那么为什么要拉伸?有以下两个重要原因:适配 Blender;如果以42到2283这样的范围导入 Blender,最终的成果建模是非常平坦,就像一张白纸,就像下面这样,看的见嘛?快瞅瞅:
保留细节;一般来说,高程数据的像素数据类型是浮点型,是小数形式,而 Blender 支持整数,所以需要转换。如果不拉伸直接转换,小数会被四舍五入成整数,数据丢失,反映到模型上就是细节丢失、不连续。由于这两个原因,所以我们必须先对高程数据进行拉伸。那么具体拉伸到多大呢?大神 Daniel Huffman 提供了参考,或许这不是参考,这就是答案 👍 :
>>工具位置ArcGIS 中使用栅格计算器,工具栏中依次打开 Spatial Analyst 工具->地图代数,最后打开栅格计算器工具执行栅格拉伸操作。
然后输入以下计算表达式:
你每一个输入的整数最好使用 ArcGIS 提供的关键字 Float 括起来,否则输出的数据就有可能自动四舍五入到整数位,最后导致的结果要么是0要么是65535(是否会四舍五入到整数取决于高程数据当前的像素类型,不过保险起见,都统一加上 Float 吧)。QGIS 使用 Raster Calculator。点击主界面上方菜单栏中的 Raster->Raster Calculator。
然后输入以下计算表达式:
>>Note:①这里没有考虑高程数据范围涉及到负数(海底)的情况。②可能会遇到高程数据中有空值 Nodata,请注意。第四步 转换像素类型
简单理解,像素类型描述了图像的最小储存单元所使用的格式。
查看像素类型在创建3D模型时,Blender 只能支持特定的像素类型,那就是16位无符号整型;所以现在要做的就是把像素类型装换为6位无符号整型。16位无符号整型,英文:16 unsigned int 或者 16 bit unsigned;无符号表示正数,从0开始到2的16次方的整数。从0到2的16次方正好有65536个数(包括0),那么最大数就是65535,这就是公式最后乘数字65535的原因。>>工具位置ArcGIS 可以使用复制栅格工具来修改像素类型:数据管理工具->栅格->栅格数据集->复制栅格;然后像素类型选择:16_BIT_UNSIGNEDQGIS 可以使用 translate 工具:上方菜单栏依次点击 Raster->conversion->translate;然后在 Output data type 中选择 UInt16。>>最后
本章节你可以了解到:使用高程灰度图栅格数据可以在 Blender 中创建3D地形模型;高程数据的基本预处理操作(包括 ArcGIS 和 QGIS);高程范围拉伸的重要性和操作;Blender 建模需要像素类型为16位无符号整型的栅格图像。好的,学完这章,距离下面的成果又近了一大步!
资料下载:提供原始高程数据以及处理好后的高程数据;1 原始高程数据:原始未投影 TIFF 数据。2 成果高程数据:完成所有处理步骤,可直接建模的 TIFF 数据。Blender 文件(后续章节会提供);系列教程PDF文档。