文章方法与制图
如何设置山体阴影
山体阴影”(Hillshade,也叫地形阴影或地形晕渲)是地理信息系统(GIS)中一种常见的**地形可视化技术**,用于根据数字高程模型(DEM)模拟太阳照射下的地形明暗效果,让地形起伏更直观。本篇文章介绍昕图中如何设置山体阴影。
栅格
什么是山体阴影
“山体阴影”(Hillshade,也叫地形阴影或地形晕渲)是地理信息系统(GIS)中一种常见的地形可视化技术,用于根据数字高程模型(DEM)模拟太阳照射下的地形明暗效果,让地形起伏更直观。
核心原理简述
山体阴影的本质,是把一个简化的光照模型应用到 DEM 上。系统会根据每个像元周围的高程变化,估算该位置坡面的朝向,再判断这个坡面是迎光还是背光,从而计算明暗。
整个计算过程可以概括为:
DEM(高程栅格)
-> 计算局部坡度和坡向
-> 求表面法向量 N
-> 根据太阳参数求光线向量 L
-> 计算亮度 I
-> 转成灰度值 Gray
在这个过程中,最核心的亮度公式可以写成:
如果要输出为 8 位灰度值,可以进一步写成:
公式中的量分别表示什么
- :地形表面的单位法向量,表示坡面朝向。
- :光照方向的单位向量,表示太阳光从哪个方向照来。
- :两者点积,也就是夹角余弦;值越大,表示坡面越朝向光源。
- :背光坡面的点积可能小于 0,实际计算中通常截断为 0,表示没有直射光。
LightIntensity:直射光强度,用来控制亮部对比度。AmbientIntensity:环境光强度,用来保留暗部细节,防止阴影区完全发黑。- :归一化亮度值,通常在 之间。
- :最终显示灰度值,通常在 之间。
可以简单理解为:
- 直射光项 决定“哪里亮、亮多少”;
- 环境光项 决定“阴影里还能不能看见细节”;
- 两者共同形成最终的山体阴影效果。
参数简介
为了更容易理解,可以把这些参数分成三组:
- 光从哪里来:
LightDirection、ZenithAngle - 明暗有多强:
LightIntensity、AmbientIntensity - 地形起伏看起来多明显:
ElevationFactor、Extrusion
光线方向:方位角与高度角
这两个参数共同决定光线方向向量 。
光线向量可写为:
其中:
- :太阳方位角(Azimuth)
- :太阳高度角(Altitude)
对应到参数设置:
- LightDirection(Azimuth):太阳方位角,表示光从哪个方向照来,例如 315° 表示西北来光。
- ZenithAngle(Altitude):这里实际表示太阳高度角,表示太阳抬升的角度;值越低,阴影越长;值越高,阴影越短。
直观效果:
- 改
LightDirection:主要改变阴影朝向; - 改
ZenithAngle:主要改变阴影长度和立体感强弱。
亮度组成:环境光与直射光
这两个参数决定亮部和暗部之间的关系。
可把亮度理解为:
其中:
- LightIntensity:直射光强度。值越大,迎光坡面越亮,对比越强。
- AmbientIntensity:环境光强度。值越大,阴影越柔和,暗部细节越容易保留。
可以按效果理解:
- 想增强立体感:提高
LightIntensity,适当降低AmbientIntensity - 想保留阴影细节:提高
AmbientIntensity
几何比例:高程-平面换算因子
ElevationFactor 用来处理 Z 方向高程单位与 X/Y 平面单位不一致的问题。
例如:
- 如果平面坐标单位是米,高程单位也是米,那么通常可设为 1;
- 如果平面坐标是经纬度(度),高程单位是米,就需要换算,否则坡度计算会失真。
它解决的是:
- 算出来的坡面方向是否几何真实
如果这个参数设置不合理,山体可能会显得“被压扁”或“被夸张”。
视觉夸张:拉伸因子
Extrusion 是视觉上的地形夸张因子,用于增强起伏表现。
在计算中,可理解为实际参与光照的高程为:
这里两者分工不同:
ElevationFactor负责单位换算;Extrusion负责视觉夸张。
因此:
ElevationFactor决定“算得是否真实”;Extrusion决定“看起来是否足够明显”。
经验上:
- 小比例尺或较粗分辨率 DEM:可适当提高
Extrusion(如 5 - 8)增强立体感; - 高精度 DEM(如 10 m):通常 1 - 2 就够了。
参数汇总表
| 参数 | 中文名称 | 常见取值* | 作用机理 | 调整效果与建议 |
|---|---|---|---|---|
LightDirection | 太阳方位角(°,顺时针自北) | 0 - 360(默认 315° = 西北) | 决定光从哪边照来,直接控制阴影朝向。 |
|
ZenithAngle | 太阳高度角(°,0 = 地平线,90 = 正顶) | 0 - 90(默认 45°) | 控制光线与地面的夹角,决定阴影长度和立体感强弱。 |
|
LightIntensity | 直射光强度 | 0 - 1(默认 0.7 ~ 1.0) | 朗伯项系数,值越大,明暗对比越强。 |
|
AmbientIntensity | 环境光强度 | 0 - 1(默认 0.6 ~ 0.9) | 给背光区域补充无方向柔光,避免暗部完全发黑。 |
|
ElevationFactor | 海拔因子 / 高程-平面换算因子 |
| 把 Z 高程转换到与 X/Y 一致的量纲,避免法向量计算失真。 |
|
Extrusion | 拉伸因子 | 0 - 10(默认 1 ~ 5) | 与 ElevationFactor 一起作用,用于夸张地形起伏。 |
|
四种预设效果
为了方便用户使用,XinGEO预设了四种模式
| 预设 | LightDirection | ZenithAngle | LightIntensity | AmbientIntensity | Extrusion* | 适用场景 |
|---|---|---|---|---|---|---|
| 晨光 | 90°(正东) | 20 - 30° | 0.85 | 0.4 | 2 | 长阴影、对比强,强调山脊向西投影,适合表现晨曦氛围。 |
| 正午 | 180°(正南) | 70 - 80° | 0.6 | 0.55 | 1.5 | 阴影最短,立体感柔和,适合作为底图使用,不会过度抢占视觉焦点。 |
| 夕阳 | 270°(正西) | 15 - 25° | 0.9 | 0.35 | 2 | 与晨光方向相反,适合做夕照效果,山谷会向东拉出更长阴影。 |
| 夜光 | 315°(西北) | 60° | 0.3 | 0.7 | 1.5 | 直射光较弱,主要依赖环境光营造柔和暗调,适合暗色底图或夜景模式。 |
设置山体阴影
在栅格数据使用分级填色时,可以使用山体阴影,这里以全球海陆地形栅格数据为例。

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



