1 基础知识
3 种最常见的激光雷达派生数据产品:
- Digital Terrain Model (or DTM):地面高程。
- Digital Surface Model (or DSM):表面顶部(想象一下在森林的树冠上覆盖一张床单)。
- Canopy Height Model (CHM):地面与物体顶部离地之间的高度或残差距离。这包括树木、建筑物和地球表面任何其他物体的实际高度。CHM 通过DSM 中减去 DTM 来创建。

2 基于地形数据计算山体阴影
1 读取地形数据
dtm_dataset = rio.open(os.path.join('.\data','NEON_D17_TEAK_DP3_320000_4092000_DTM.tif'))
dtm_data = dtm_dataset.read(1)

2 计算山体阴影
山体阴影用于可视化给定指定光源的表面上每个像素的假设照明值(从 0 到 255)。
要计算山体阴影,需要照明源的天顶(高度)和方位角,以及地形的坡度和坡向。
山体阴影的公式为:

其中所有角度均以弧度为单位。
# function to caluclate hillshade
def hillshade(array,azimuth,angle_altitude):azimuth = 360.0 - azimuth x, y = np.gradient(array)slope = np.pi/2. - np.arctan(np.sqrt(x*x + y*y))aspect = np.arctan2(-x, y)azm_rad = azimuth*np.pi/180. #azimuth in radiansalt_rad = angle_altitude*np.pi/180. #altitude in radiansshaded = np.sin(alt_rad)*np.sin(slope) + np.cos(alt_rad)*np.cos(slope)*np.cos((azm_rad - np.pi/2.) - aspect)return 255*(shaded + 1)/2hs_data = hillshade(dtm_data,225,45)

DTM+山体阴影:

3 计算冠层高度
dsm_dataset = rio.open(os.path.join('.\data','NEON_D17_TEAK_DP3_320000_4092000_DSM.tif'))
dsm_data = dsm_dataset.read(1)
chm_data = dsm_data - dtm_data;

4 三者一起展示
