利用las格式点云数据生成DSM影像

本方法使用las格式的点云数据生成DSM。

首先来了解DSM是什么。DSM是地学中常用到的数字表面模型。要从点云生成数字表面模型 (DSM),首先要将感兴趣的点云区域划分为规则网格。随后,为每个网格单元分配一个高程值,该高程值源自单元内或附近点的3D坐标(X、Y、Z)。详细介绍查看博文从点云创建 DSM:网格化和可视化实用指南_点云网格化-优快云博客

需要导入的库为

from scipy.interpolate import griddata
import laspy

其中,SciPy的interpolate模块提供了许多对数据进行插值运算的函数,其中griddata()函数可以在二维平面进行插值操作。其插值方法有三中,分别为“linear“(表示线性插值)、”nearest“(表示最邻近插值)、”cubic“表示三次样条插值。

laspy是一个Python库,主要用于读取、修改和创建LAS点云文件。本代码仅使用该库进行las格式点云的读取,其他操作参照官方用户手册Installation — laspy 2.5.0 documentation

本文所使用到的数据为ISPRS 提供的Vauhingen数据集中的area1区域点云数据。 

生成DSM影像代码如下:

import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
import laspy

path = r"las点云数据路径"
las = laspy.read(path)

points = las.xyz

x = points[:, 0]
y = points[:, 1]
z = points[:, 2]

# Define grid parameters
xmin, xmax = np.nanmin(x), np.nanmax(x)
ymin, ymax = np.nanmin(y), np.nanmax(y)

grid_resolution =1 #格网分辨率
 
# Create a grid
xi, yi = np.meshgrid(np.arange(xmin, xmax, grid_resolution), np.arange(ymin, ymax, grid_resolution))

# Interpolate elevation values
zi = griddata((x, y), z , (xi, yi), method='linear')#线性内插

plt.figure(figsize=(10, 8))
new_zi = np.nan_to_num(zi, nan=np.nanmax(zi))
new_zi1 = np.clip(new_zi, a_min=None, a_max=z.max()+1)
new_zi1 = np.flipud(new_zi1)#flipud使数组上下翻转

#显示
plt.imshow(new_zi1, extent=[xi.min(), xi.max(), yi.min(), yi.max()], cmap="terrain")
plt.colorbar(label='Elevation')
plt.title('Digital Elevation Model (DEM) with imshow')
plt.xlabel('X-coordinate')
plt.ylabel('Y-coordinate')
plt.show()

 生成结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值