signed

QiShunwang

“诚信为本、客户至上”

制作浮雕效果等高线的原理与实践

2020/12/26 21:58:52   来源:

明暗等高线 ( illuminated contour)进行地貌表达的方法最早是由日本制图学家 Kitiro Tanaka发明并得到地图制图界的一致认可 ,因此有时又称为Tanaka法,其最大的特点是利用等高线的明暗变化, 在含有计量信息的地形图上给观众造成立体视觉效果 。

 

 

近日,QGIS官网的样式库中上传了名为“Tanaka Contours”的样式,实现了明暗等高线表达,可以一键让等高线呈现明暗变化的浮雕效果,大家快来试试看吧!

 

 01  准备数据

 

如果您手中已经有等高线,可以直接进行下一步骤。

 

如果没有等高线,可以从SRTM 的DEM数据中提取,DEM数据的下载地址:https://earthexplorer.usgs.gov/,需要科学上网,注册账号后即可免费下载。

 

本文选择青岛崂山风景区附近的DEM作为演示数据,其栅格文件为:n36_e120_1arc_v3_qingdao.tif。

 

从QGIS打开下载到的n36_e120_1arc_v3_qingdao.tif,点击菜单【栅格】->【提取】->【等值线…】,打开等高线提取对话框。

 

 

在对话框中设置如下参数:

 

输入图层:n36_e120_1arc_v3_qingdao;

等值线之间的间隔:50;

等值线:任意存储路径/contours50m.shp。

 

 

点击【运行】按钮,生成等高线,效果如下:

 

 

 02 下载并导入“Tanaka Contours”样式

 

打开浏览器,输入QGIS官方样式库地址:https://plugins.qgis.org/styles/,在上方的搜索框中输入‘contours’(等高线)。

 

 

找到名称为“Tanaka Contours”的样式,点击右边的按钮下载该样式。

 

 

在QGIS中,点击工具栏的【样式管理器】按钮,打开样式管理器对话框,找到右下方的【导入/导出】按钮,从下拉菜单选择【导入项】,将下载到的“Tanaka Contours”的样式导入到QGIS中。

 

 03  配置明暗等高线

 

在图层面板中,点击【打开图层样式面板】,开始设置等高线样式。

 

 

在图层样式面板中,图层选中“contours50m”,采用【单一符号】渲染,选择符号图层中的“线条”,在下方的预定义符号中,找到并选择“Tanaka contours”。

 

 

可以在地图主窗口中看到明暗等到线的效果如下:

 

 

为了更好的显示效果,可以为地图添加注记,并将“contours50m”的图层混合模式改为“叠加”,最终的效果如下:

 

 

 04  实现原理

 

我们来剖析一下“Tanaka contours”样式的实现原理。

 

明暗等高线法的主要特点是在确定光源位置的前提下,根据地形的坡向,按其受光的情况,运用色调的反差来刻划出立体感。

 

在QGIS中,方位为0°的光源将从西向东照射到等高线上,各个方向的光源角度如下图:

 

 

假设光线来自西北方向135°,那么北东——南西线(即图中两个×连线)将作为明暗分界线,从北东逆时针到南西的范围用明线描绘,从北东到南西顺时针方向的范围用暗线描绘。

 

 

传统的GIS软件做明暗等高线时,需要对栅格做坡向分析,找到阴坡区和阳坡区在进行渲染,相对来说,QGIS实现起来就比较简单,分为两步:第一步是用表达式将等高线提取为各个组成线段;第二步根据各个线段的方位角计算出该段是处于明线范围还是暗线范围,并将角度映射为色调和线宽,刻画出立体效果。

 

  • 第一步:用表达式将等高线提取为各个组成线段

 

在预定义样式中选择“Tanaka contours”,可以看到其符号图层类型为“几何图形生成器”,几何图形类型为“线串/多线串”。在QGIS中,几何图形生成器是一种用表达式控制生成的符号图层,利用属性、变量和函数生成变化多样的符号,是表达式的高级应用。

 

 

“Tanaka contours”样式使用“几何图形生成器”将等高线的多个部分分解为单一线段,表达式为:

 

segments_to_lines( $geometry)

 

其中,“segments_to_lines”为几何图形函数,返回由输入几何图形中每个线段的一条直线组成的多线几何图形;$geometry函数返回当前要素的几何图形,作为参数传入“segments_to_lines”函数,将得到当前等高线每个线段的直线组成的多线几何图形。

 

  • 第二步:根据线段的方位角计算出该段是处于明线范围还是暗线范围,并将角度映射为色调和线宽,刻画出立体效果

 

有了线段,即可取出其起始点和终点计算线段的方位角,根据方位角和光照角度,设置等高线的颜色和线宽

 

我们先看看如何实现根据光照和角度调整线宽。在符号图层框中,选择“线条”,下方提供设置线宽选项,注意其右侧的【由数据定义覆盖】按钮为黄色,表示线宽从表达式计算结果获取。点开【由数据定义覆盖】,从下拉菜单中选择【编辑】,打开表达式字符串构建器,查看表达式的内容:

 

 

scale_linear(  abs(     (135+        degrees(          azimuth(             end_point(geometry_n($geometry,@geometry_part_num)),             start_point(geometry_n($geometry,@geometry_part_num))      ) ))          %  90),   0, 90 , .1, .7)

 

上述表达式涉及到多个函数嵌套,主要作用是计算每段等高线的方位角,加上设定光源为135°,与90°取模,使其最终的角度值固定在0到90°之间,再用scale_linear函数将角度值映射为线型宽度取值。所使用的函数解析如下:

 

scale_linear:利用线性插值法将定义域中给定的值变换到某个输出范围,在本例中,scale_linear将[0,90]度角度映射成[0.1,0.7]线宽。

abs:取角度的绝对值。

degrees:将弧度转换为度。

azimuth:从垂直到终点(点A)到 起点(点B)上自北起顺时针方向量算的方位角的角弧度。

end_point:几何图形的最后一个结点。

start_point:几何图形的第一个结点。

geometry_n:从几何图形集合返回特定的几何图形;如果输入几何图形不是集合,则返回NULL。

$geometry:当前要素的几何图形。

@geometry_part_num:变量,正在呈现的要素的当前几何图形部件编号。

 

同样道理,点击符号图层框中的“简单线条”,可以看到颜色随光线变化的效果设置:

 

 

其表达式与线宽设置类似,所不同在于使用color_hsl函数生成颜色随角度变化取值, scale_linear函数将0到180度角度值映射为0到100的亮度取值:

 

color_hsl( 0,0,   scale_linear(      abs(       (135 +          degrees(            azimuth(              end_point(geometry_n($geometry,@geometry_part_num)),              start_point(geometry_n($geometry,@geometry_part_num))                 )))            % 360 - 180),      0, 180 ,0, 100))

 

上面两个表达式所设置的光源方位在西北方向135°,可根据需要调整,只需用对应的光源方位角替换135即可。

 

 


参考资料:

[1] https://anitagraser.com/2015/05/24/how-to-create-illuminated-contours-tanaka-style/。

[2] https://landscapearchaeology.org/2018/tanaka-contour-lines/。

版权声明

 

本文欢迎转载,转载时请注明出处。