C#,地理信息系统GIS开发实践——“Tanaka法”制作阴影轮廓线(Tanaka method or how to make shaded contour lines)

1 田中方法或如何制作阴影轮廓线

等值线已成为我们制图输出中司空见惯、不起眼的伴侣 - GIS 让我们忘记了它们的视觉潜力。早在 19 世纪,制图师就尝试了阴影轮廓,但该技术在日本制图师田中基蒂罗(Kennelly 2016,wiki.gis 2017)之后被称为田中方法。甚至伊姆霍夫的开创性书籍的封面也带有一堆阴影轮廓!

阴影轮廓粗细和颜色根据线方向和光源方向之间的差异而变化。垂直于光线的线比平行于光线的线粗,而“阳光照射”斜坡上的线应比阴影下的斜坡上的线更亮。这种渲染为轮廓地图添加了三维的感觉 - 没有任何实际的3D模型。

几年前,A. Graser已经提出了实现这种效果的解决方案(链接如下)。我已经为较新版本的QGIS调整了该方法,并添加了一个允许改变光线角度的逻辑。

2 轮廓

轮廓着色需要一致的轮廓方向,也就是说,它们都应该是顺时针或逆时针,但不能同时使用两者。(有一个例外,底层轮廓应该在相反的方向上,但这是一个细节。

我已经测试了几种算法:

SAGA:绝对不一致。

GRASS:不一致。

GDAL:终于OK了!

生成一致结果的唯一算法是在 GDAL 中实现的算法。它可以通过QGIS主界面访问:转到光栅»提取»轮廓

事实上,GDAL 经过明确调整以生成整洁的轮廓(“从版本 1.7 开始,轮廓线串的方向将一致。高边将在右侧,即线串绕顶部顺时针移动。根据我的经验,GDAL 有时会生成逆时针等值线,但它们仍然是一致的(当所有栅格边具有相同的值时,可能会发生这种情况)。在这种情况下,我们只需重新调整照明,如下所述。

3 应用样式

渲染田中线的问题在于为每个线段应用特定的样式。使用较旧的函数,这仅适用于轮廓文件的“松散”版本,即折线的所有双节点组件都注册为单独线的文件,然后可以单独设置样式(参见 A. Graser) 的方法)。但是,从 2.14 版本开始,QGIS 具有“动态”换行例程。这意味着我们所需要的只是一个嵌入到样式定义的表达式,不再需要具有溶解几何形状的其他文件。

TL;DR:您可以下载样式并将其应用于轮廓线(底部的链接)。但是请看一下它的功能解释... :)

1) 要将折线分解为简单的(双节点)元素,我们使用几何生成器作为符号图层类型,并使用表达式进行拆分。segments_to_lines( $geometry)

2)现在我们输入样式作为表达式(选择编辑)。

3) 对于颜色,样式定义如下所示:

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))

4)对于厚度:

scale_linear(
  abs(
    (135 +
      degrees(
        azimuth(
          end_point(geometry_n($geometry,@geometry_part_num)),
          start_point(geometry_n($geometry,@geometry_part_num))
      ) ))
    % 180 - 90),
 0, 90 ,0.2, 0.7)

调整线条粗细和光照方向

超级复杂?是的,确实是...如果没有真正的编程(例如在 Python 函数中),这是一个很难破解的难题。这是您需要了解的:

从函数中提取线条亮度和粗细值。前两个值是输入,后两个值是最小值和最大输出值。例如,在原始值 0 - 180 中,投影到 0 - 100 的范围。(scale_linear函数在QGIS表达式生成器中有很好的解释)。scale_linearscale_linear("our_file", 0, 180, 0, 100)

因此,要更改亮度,您必须使用颜色定义的最后两个值,其中 0 是黑色,100 是白色(100% 亮度)。同样,要更改线粗细,需要更改厚度定义的最后两个值(最小/最大厚度为 0.2 和 0.7)。

光线角度也可以调整。该函数使用模运算符 (%) 将整个角度范围压缩到较小的间隔。默认的光线角度 (0) 是从西方开始的,光源角度的值是逆时针增加的(不要问我为什么......

要调整照明,我们可以将范围的开头向前推,但不能将其拉入负范围。因此,对于西北照明,在顺时针方向的轮廓上,我们将角度设置为 135。为了对逆时针轮廓产生相同的效果,我们需要推到 315。

您可以在表达式中轻松找到 135 值:这是为了调整照明而要更改的值(!必须对颜色和线条粗细都这样做!

最后,当线路端子是圆形的(Cap stlye : Round)时,结果会更好[感谢Nyall Dawson的提醒。

判决

田中最初的阴影轮廓示例主要用于表示自然地形。我发现这种方法在视觉上太沉重了;很难在不过度拥挤地图的情况下添加额外的信息(但这只是一个印象......效果更好的是所有那些色彩缤纷的热图飞溅:田中的轮廓使它们栩栩如生!看看下面华丽的深度图...

猜你喜欢

转载自blog.csdn.net/beijinghorn/article/details/132236680
今日推荐