使用GDAL对DEM渲染处理流程

下面是翻译的一篇国外的博客,没有严格按照原文的字面意思翻译,是按照我自己的理解来进行翻译的,如果有错误,还请大家指正,原文地址是:http://linfiniti.com/2010/12/a-workflow-for-creating-beautiful-relief-shaded-dems-using-gdal/

有时候我使用QGIS的Hillshade插件来生成山体阴影数据,然后和原来的DEM数据叠加显示。使用颜色表渲染后以及使用半透明显示的效果下图所示:

图1 使用hillshade使用假彩色渲染的效果

这种处理方式很好,但是有点不太方便(英文单词是impractical,没想到好的词语来代替,按照我的理解来翻的)。这是一种将DEM数据进行渲染的很好的方式。除此此外,我还希望能够指定一个shp文件来裁切渲染后的图像。幸运的是,GDAL提供的工具就可以达到这个目的。目前已经有一些很好的文章(比如这篇:http://developmentseed.org/blog/2009/jul/30/using-open-source-tools-make-elevation-maps-afghanistan-and-pakistan/,这篇翻译的地址:http://blog.csdn.net/liminlu0314/article/details/8526502)来说明这个处理流程,但是我还是要写这篇文章,因为我增加了一些步骤使我处理的更好。 

写在开始之前

在开始之前,你需要有下面的数据:

  1. DEM数据——我这里的数据名字是“alt.tif”
  2. 矢量数据(比如shp格式),范围是你最终处理结果的范围——我这里的名字是“Tanzania.shp”

生成hillshade图像

首先我们需要生成一个山体阴影数据。QGIS里面有一个使用python写的很好用的插件。在GRASS中使用这个插件可以来生成山体阴影数据。但在本文中,我将使用GDAL提供的工具来生成。我们要使用的是一个叫gdaldem的命令行程序。在这里我不会对gdaldem的参数进行说明解释,因为在gdaldem的帮助文档中有详细的说明。

我们生成山体阴影数据的命令行如下:

gdaldemhillshade alt.tif shade.tif -z 5 -s 111120 -az 90

生成的结果如下图所示:

图2 处理生成的山体阴影数据

创建地形渲染图

这个步骤中,我们将创建一个彩色的地形数据。关于色彩理论在互联网上有很多内容,如果你想了解更多的内容请使用Google搜索“colorberwer”。另一个我最喜欢的网站colourlovers.com也可以来进行了解关于色彩的知识。下面我将说明怎么生成一个调色板文件。

首先你需要选择了一个合适的颜色调色板(其中大约有五、六个颜色),此外你还需要知道DEM数据中的高程范围。这个范围你可以在QGIS很容易的点几次鼠标就搞定了,但是这里我们使用gdal的命令行:

gdalinfo -mm alt.tif

执行上面的命令行输出的信息包括第一波段的最大最小值,这个最大值最小值就是我们需要的东西。输出的内容如下所示:

Band 1 Block=1334x3 Type=UInt16, ColorInterp=Gray
 Computed Min/Max=1.000,5768.000
 NoData Value=65535

OK,通过上面的内容可以知道,我们的最低高程是1米,最大高程为5789米——这里就是坦桑尼亚的乞力马扎罗山的海拔!接下来我们把这个高程范围分为5类来匹配“Landcarpet Europe”制定的调色板(这里的Landcarpet Europe可能就是欧洲的一个地图渲染的颜色的标准吧,详细内容参考http://www.colourlovers.com/palette/1374547/Landcarpet_Europe,颜色如图3所示)。此外我又加了一个颜色就是在最高的地方设置为白色。

 

图3 Landcarpet Europe颜色

调色板的内容如下:

65535 255 255 255
5800 254 254 254
3000 121 117 10
1500 151 106 47
800 127 166 122
500 213 213 149
1 218 179 122

上面的一共有四列值,第一列表示的是高程值,后面三个就是对应的RGB值。把上面的内容保存为一个叫ramp.txt的文件,放到alt.tif所在的文件夹下。你会发现上面的值在低海拔处比较密集,而高海拔地区比较稀疏。(这里有一句看不明白,没翻译,不影响后续使用)。另外,可以发现我设置的颜色在地势最高的地方接近白色,所以最后设置NoData值(65535)的RGB值是白色(255,255,255)。

好了,现在我们可以用下面的命令生成彩色地形图:

gdaldem color-relief alt.tif ramp.txt relief.tif

处理的结果如下所示:

图4 生成的彩色地形图

处理的结果好像和调色板设置的颜色不太一致,不要担心,我们将在下面的步骤进行处理。

合并两个图像

接下来的步骤是将上面生成的两个图像合并起来。我使用Frank Warmerdam的hsv_merge.py脚本来完成。命令行脚本如下:

./hsv_merge.py relief.tif shade.tif colour_shade.tif

处理的结果如下图:

图5 使用山体阴影数据和颜色渲染数据合并后的数据

你可能已经注意到,目前处理的颜色和我们使用的调色板的颜色比较类似了。这里有点小问题,就是把图像中的Nodata值变成了白色(RGB:255 255 255)。

裁切和掩码

通过上面的步骤你可能已经得到了你想要的结果。此外,你还可以使用矢量数据来对数据进行裁切和掩码。命令行代码如下:

gdalwarp -co compress=deflate -dstnodata 255 -cutline Tanzania.shp  colour_shade.tif colour_shade_clipped.tif

我最后得到的图像是一个无压缩的tif数据,这个数据除了坦桑尼亚范围内有数据,以外都是Nodata,图像如下:

图6 最终结果:坦桑尼亚假彩色高程地图

最后再说明一点

我喜欢命令行的方式,主要是可以当作工作流重复的来进行处理。我在这篇博客中列举的所有的命令行,可以在任何时候进行执行。如果你仍然使用GUI程序来进行处理,那么你可以使用BASH(类似Windows下的bat批处理)来试试——你可以使用它处理很多的地理数据。

转载自:https://blog.csdn.net/liminlu0314/article/details/8522725

You may also like...