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 |