LAS是ASPRS(美国摄影测量与遥感协会)于2003年发布一种点云数据格式,用以描述激光雷达的扫描点,目前已有1.0到1.4共计5种版本。
laspy则是可以用于读写las点云的python模块。
考虑到大家手头不一定有las格式的文件,所以对laspy的讲解从写入文件开始,而有关las文件格式的详细解释,则以列表的形式附在文末。
考虑到扫描激光雷达点云信息的复杂性,las格式并不是完全的数据格式,而是有其内部结构的,在laspy中,通过lasHeader创建las文件的数据头,通过lasData将数据头载入特定的las文件。
import laspy
import numpy as np
# 创建数据头
header = laspy.LasHeader(point_format=3, version="1.2")
header.offsets = np.zeros(3)
header.scales = np.ones(3)
# 创建las文件
las = laspy.LasData(header)
# 载入x, y, z 坐标
xs, ys = np.indices([500,500])-250
zs = np.sqrt(xs ** 2 + ys ** 2)
las.x = xs.reshape(-1)
las.y = ys.reshape(-1)
las.z = zs.reshape(-1)
las.write("test.las")
写入文件之后,可以打开看一下。能打开las格式的软件有很多,这里用开源的cloudcompare,效果如下

laspy.read可以读取las格式的点云文件,并返回一个las对象
import laspy #后续所有示例均默认此行,故不再重复
las = laspy.read('test.las')
通过dir可以查看laspy对象的成员和属性,其中带有一些常见的魔法函数,比如__sizeof__,说明可以通过len来查看元素个数。
其中header成员即为上文中创建的那个header,
h = las.header
print(h.z_max)
# 354.0
print(h.x_scale)
#1.0
las是一种二进制点云存储格式,具体包括11种,下表中,uint和 int分别代表无符号和有符号整形;float为浮点型。
格式0:
| 维度 | 类型 | 位数 |
|---|---|---|
| X, Y, Z | 有符号 | 32x3 |
| 强度 | 无符号 | 16 |
| 回波序号 | 无符号 | 3 |
| 回波数 | 无符号 | 3 |
| 正反扫描标志 | 布尔 | 1 |
| 扫描线标志 | 布尔 | 1 |
| 分类号 | 无符号 | 5 |
| 合成点标志 | 布尔 | 1 |
| 关键点标志 | 布尔 | 1 |
| 保留点标志 | 布尔 | 1 |
| 扫描角序号 | 有符号 | 8 |
| 用户数据 | 无符号 | 8 |
| 点源序号 | 无符号 | 8 |
格式1-5均基于格式0,分别添加一些维度
格式1添加GPS时间
| 添加维度 | 类型 | 位数 |
|---|---|---|
| GPS时间 | 浮点 | 64位 |
格式2添加了颜色信息
| 添加维度 | 类型 | 位数 |
|---|---|---|
| r, g, b | uint | 16x3 |
格式3添加GPS时间和rgb颜色
| 添加维度 | 类型 | 位数 |
|---|---|---|
| GPS时间 | 浮点 | 64位 |
| r, g, b | uint | 16x3 |
格式4
| 添加维度 | 类型 | 位数 |
|---|---|---|
| gps_time | 浮点 | 64位 |
| wavepacket_index | uint | 8 |
| wavepacket_offset | uint | 64 |
| wavepacket_size | uint | 32 |
| _point_wave_location | uint | 32 |
| x_t, y_t, z_t | float | 32x3 |
格式5添加GPS时间和rgb颜色
| 添加维度 | 类型 | 位数 |
|---|---|---|
| gps_time | 浮点 | 64位 |
| r, g, b | uint | 16x3 |
| wavepacket_index | uint | 8 |
| wavepacket_offset | uint | 64 |
| wavepacket_size | uint | 32 |
| _point_wave_location | uint | 32 |
| x_t, y_t, z_t | float | 32x3 |
格式6是一种新的基础格式
| 维度 | 类型 | 位数 |
|---|---|---|
| X, Y, Z | 有符号 | 32x3 |
| intensity | 无符号 | 16 |
| return_number | 无符号 | 4 |
| number_of_returns | 无符号 | 4 |
| synthetic | 布尔 | 1 |
| key_point | 布尔 | 1 |
| withheld | 布尔 | 1 |
| overlap | 布尔 | 1 |
| scan_channel | uint | 2 |
| scan_direction_flag | 布尔 | 1 |
| edge_of_flight_line | 布尔 | 1 |
| classification | uint | 5 |
| user_data | 无符号 | 8 |
| scan_angle | 有符号 | 8 |
| point_source_id | 无符号 | 8 |
| gps_time | float | 64 |
格式7在6的基础上添加了颜色信息
| 添加维度 | 类型 | 位数 |
|---|---|---|
| r, g, b | uint | 16x3 |
格式8在6的基础上添加了颜色信息和临近点
| 添加维度 | 类型 | 位数 |
|---|---|---|
| r, g, b | uint | 16x3 |
| nir | uint | 16 |
格式9
| 添加维度 | 类型 | 位数 |
|---|---|---|
| wavepacket_index | uint | 8 |
| wavepacket_offset | uint | 64 |
| wavepacket_size | uint | 32 |
| point_wave_location | uint | 32 |
| x_t, y_t, z_t | float | 32x3 |
格式10
| 添加维度 | 类型 | 位数 |
|---|---|---|
| r, g, b | uint | 16x3 |
| nir | uint | 16 |
| wavepacket_index | uint | 8 |
| wavepacket_offset | uint | 64 |
| wavepacket_size | uint | 32 |
| point_wave_location | uint | 32 |
| x_t, y_t, z_t | float | 32x3 |