跳到主要内容
返回文章
文章方法与制图
2025年10月16日/8 分钟阅读

如何设置山体阴影

山体阴影”(Hillshade,也叫地形阴影或地形晕渲)是地理信息系统(GIS)中一种常见的**地形可视化技术**,用于根据数字高程模型(DEM)模拟太阳照射下的地形明暗效果,让地形起伏更直观。本篇文章介绍昕图中如何设置山体阴影。

栅格

什么是山体阴影

“山体阴影”(Hillshade,也叫地形阴影或地形晕渲)是地理信息系统(GIS)中一种常见的地形可视化技术,用于根据数字高程模型(DEM)模拟太阳照射下的地形明暗效果,让地形起伏更直观。

核心原理简述

山体阴影的本质,是把一个简化的光照模型应用到 DEM 上。系统会根据每个像元周围的高程变化,估算该位置坡面的朝向,再判断这个坡面是迎光还是背光,从而计算明暗。

整个计算过程可以概括为:

DEM(高程栅格)
-> 计算局部坡度和坡向
-> 求表面法向量 N
-> 根据太阳参数求光线向量 L
-> 计算亮度 I
-> 转成灰度值 Gray

在这个过程中,最核心的亮度公式可以写成:

I=clamp(max(0,NL)×LightIntensity+AmbientIntensity, 0, 1)I = \operatorname{clamp}\Big(\max(0,\,N \cdot L) \times \text{LightIntensity} + \text{AmbientIntensity},\ 0,\ 1\Big)

如果要输出为 8 位灰度值,可以进一步写成:

Gray=255×IGray = 255 \times I

公式中的量分别表示什么

  • NN:地形表面的单位法向量,表示坡面朝向。
  • LL:光照方向的单位向量,表示太阳光从哪个方向照来。
  • NLN \cdot L:两者点积,也就是夹角余弦;值越大,表示坡面越朝向光源。
  • max(0,NL)\max(0, N \cdot L):背光坡面的点积可能小于 0,实际计算中通常截断为 0,表示没有直射光。
  • LightIntensity:直射光强度,用来控制亮部对比度。
  • AmbientIntensity:环境光强度,用来保留暗部细节,防止阴影区完全发黑。
  • II:归一化亮度值,通常在 [0,1][0,1] 之间。
  • GrayGray:最终显示灰度值,通常在 [0,255][0,255] 之间。

可以简单理解为:

  • 直射光项 决定“哪里亮、亮多少”;
  • 环境光项 决定“阴影里还能不能看见细节”;
  • 两者共同形成最终的山体阴影效果。

参数简介

为了更容易理解,可以把这些参数分成三组:

  1. 光从哪里来LightDirectionZenithAngle
  2. 明暗有多强LightIntensityAmbientIntensity
  3. 地形起伏看起来多明显ElevationFactorExtrusion

光线方向:方位角与高度角

这两个参数共同决定光线方向向量 LL

光线向量可写为:

L=(sinAzcosZ, cosAzcosZ, sinZ)L = (\sin A_z \cos Z,\ \cos A_z \cos Z,\ \sin Z)

其中:

  • AzA_z:太阳方位角(Azimuth)
  • ZZ:太阳高度角(Altitude)

对应到参数设置:

  • LightDirection(Azimuth):太阳方位角,表示光从哪个方向照来,例如 315° 表示西北来光。
  • ZenithAngle(Altitude):这里实际表示太阳高度角,表示太阳抬升的角度;值越低,阴影越长;值越高,阴影越短。

直观效果:

  • LightDirection:主要改变阴影朝向;
  • ZenithAngle:主要改变阴影长度和立体感强弱。

亮度组成:环境光与直射光

这两个参数决定亮部和暗部之间的关系。

可把亮度理解为:

Ilight=max(0,NL)×LightIntensity+AmbientIntensityI_{light} = \max(0, N \cdot L) \times \text{LightIntensity} + \text{AmbientIntensity}

其中:

  • LightIntensity:直射光强度。值越大,迎光坡面越亮,对比越强。
  • AmbientIntensity:环境光强度。值越大,阴影越柔和,暗部细节越容易保留。

可以按效果理解:

  • 想增强立体感:提高 LightIntensity,适当降低 AmbientIntensity
  • 想保留阴影细节:提高 AmbientIntensity

几何比例:高程-平面换算因子

ElevationFactor 用来处理 Z 方向高程单位与 X/Y 平面单位不一致的问题。

例如:

  • 如果平面坐标单位是米,高程单位也是米,那么通常可设为 1;
  • 如果平面坐标是经纬度(度),高程单位是米,就需要换算,否则坡度计算会失真。

它解决的是:

  • 算出来的坡面方向是否几何真实

如果这个参数设置不合理,山体可能会显得“被压扁”或“被夸张”。


视觉夸张:拉伸因子

Extrusion 是视觉上的地形夸张因子,用于增强起伏表现。

在计算中,可理解为实际参与光照的高程为:

Z=Z×ElevationFactor×ExtrusionZ' = Z \times \text{ElevationFactor} \times \text{Extrusion}

这里两者分工不同:

  • ElevationFactor 负责单位换算;
  • Extrusion 负责视觉夸张。

因此:

  • ElevationFactor 决定“算得是否真实”;
  • Extrusion 决定“看起来是否足够明显”。

经验上:

  • 小比例尺或较粗分辨率 DEM:可适当提高 Extrusion(如 5 - 8)增强立体感;
  • 高精度 DEM(如 10 m):通常 1 - 2 就够了。

参数汇总表

参数中文名称常见取值*作用机理调整效果与建议
LightDirection太阳方位角(°,顺时针自北)0 - 360(默认 315° = 西北)决定光从哪边照来,直接控制阴影朝向。
  • 早晨效果:90°(东)。
  • 中午偏南:180°。
  • 常见的“西北来光”一般用 315°,更利于凸显南坡。
ZenithAngle太阳高度角(°,0 = 地平线,90 = 正顶)0 - 90(默认 45°)控制光线与地面的夹角,决定阴影长度和立体感强弱。
  • 低角度(10°):阴影拉长,立体感强,但山谷容易过暗。
  • 高角度(60° 以上):阴影更短,整体效果更柔和。
LightIntensity直射光强度0 - 1(默认 0.7 ~ 1.0)朗伯项系数,值越大,明暗对比越强。
  • 重点看它和 AmbientIntensity 的相对比例。
  • 通常 LightIntensity + Ambient 约等于 1。
  • 想突出山脊时,可适当提高到 1.2,并同步降低环境光。
AmbientIntensity环境光强度0 - 1(默认 0.6 ~ 0.9)给背光区域补充无方向柔光,避免暗部完全发黑。
  • 适合提升暗部细节可见性。
  • 过高会让阴影发灰、立体感下降。
  • 过低会让对比过强,细节损失明显。
  • 想做“夕阳侧光”时,可降到约 0.3。
ElevationFactor海拔因子 / 高程-平面换算因子
  • 经纬度 DEM:约 1 / 111 km。
  • 平面坐标与高程同单位时:1。
把 Z 高程转换到与 X/Y 一致的量纲,避免法向量计算失真。
  • Web Mercator / UTM 且 DEM 单位也是米时,可直接设为 1。
  • 经纬度(°)+ 高程(m)时,通常需乘约 0.000009。
Extrusion拉伸因子0 - 10(默认 1 ~ 5)ElevationFactor 一起作用,用于夸张地形起伏。
  • 值越大,山峰更尖、沟谷更深。
  • 0 表示完全平坦的阴影效果。
  • 10 m DEM 常用 1 ~ 2,90 m DEM 可放大到 5 ~ 8。

四种预设效果

为了方便用户使用,XinGEO预设了四种模式

预设LightDirectionZenithAngleLightIntensityAmbientIntensityExtrusion*适用场景
晨光90°(正东)20 - 30°0.850.42长阴影、对比强,强调山脊向西投影,适合表现晨曦氛围。
正午180°(正南)70 - 80°0.60.551.5阴影最短,立体感柔和,适合作为底图使用,不会过度抢占视觉焦点。
夕阳270°(正西)15 - 25°0.90.352与晨光方向相反,适合做夕照效果,山谷会向东拉出更长阴影。
夜光315°(西北)60°0.30.71.5直射光较弱,主要依赖环境光营造柔和暗调,适合暗色底图或夜景模式。

设置山体阴影

在栅格数据使用分级填色时,可以使用山体阴影,这里以全球海陆地形栅格数据为例。

image-20260323154908731

下面为四种效果,依次为晨光、正午、夕阳、夜光。

晨光

正午

夕阳

夜光

主题定位

方法与制图

地形表现、地图视觉与实操技巧

继续浏览

回到文章频道

查看全部文章、切换主题筛选,或从首页入口继续向下浏览。

浏览全部文章