使用laspy写入LAS文件时添加自定义属性及解决属性不显示问题
问题
运行以下代码保存包含x、y、z、intensity和reflectance属性的LAS文件时无报错,但在CloudCompare中无法看到reflectance属性:
input= laspy.file.File("inputFile.las", mode='r') header = laspy.header.Header() outfile = laspy.file.File("...file.las", mode="w", header=header) xmin = np.floor(np.min(input.x)) ymin = np.floor(np.min(input.y)) zmin = np.floor(np.min(input.z)) outfile.header.offset = [xmin, ymin, zmin] outfile.header.scale = [0.001, 0.001, 0.001] outfile.x = input.x outfile.y = input.y outfile.z = input.z outfile.intensity = input.intensity.astype(int) outfile.set_reflectance = input.reflectance.astype(int) outfile.close()
请问是否需要修改header来识别reflectance这个非标准属性?若需要该如何操作?另外,若要添加名为“NewAttribute”的自定义属性,不能直接使用outfile.set_NewAttribute = input.reflectance.astype(int)的方式,该如何修改代码?
一、Reflectance属性不显示的解决方法
需要修改header来正确识别reflectance属性。原因是你新建的空白Header()不包含原LAS文件中reflectance字段的定义(这类非标准属性通常依赖VLRS可变长度记录存储元信息),同时outfile.set_reflectance的赋值写法也不符合laspy规范。
修改方案:
- 复用原文件的header,保留所有字段定义和VLRS信息,不要新建空白header;
- 直接通过
outfile.reflectance赋值,不需要set_前缀。
修改后的代码:
import laspy import numpy as np # 读取原LAS文件 input_file = laspy.file.File("inputFile.las", mode='r') # 基于原文件header创建输出文件,保留所有原有字段定义 outfile = laspy.file.File("output.las", mode="w", header=input_file.header) # 设置偏移与缩放(如需覆盖原设置) xmin = np.floor(np.min(input_file.x)) ymin = np.floor(np.min(input_file.y)) zmin = np.floor(np.min(input_file.z)) outfile.header.offset = [xmin, ymin, zmin] outfile.header.scale = [0.001, 0.001, 0.001] # 复制标准属性 outfile.x = input_file.x outfile.y = input_file.y outfile.z = input_file.z outfile.intensity = input_file.intensity.astype(int) # 正确复制reflectance属性 outfile.reflectance = input_file.reflectance.astype(int) # 关闭文件 outfile.close() input_file.close()
二、添加自定义属性NewAttribute的方法
laspy中添加自定义属性需要先通过add_extra_dimension方法定义字段的名称、数据类型,再进行赋值。
示例代码:
import laspy import numpy as np input_file = laspy.file.File("inputFile.las", mode='r') outfile = laspy.file.File("output_with_new_attr.las", mode="w", header=input_file.header) # 设置偏移与缩放 xmin = np.floor(np.min(input_file.x)) ymin = np.floor(np.min(input_file.y)) zmin = np.floor(np.min(input_file.z)) outfile.header.offset = [xmin, ymin, zmin] outfile.header.scale = [0.001, 0.001, 0.001] # 复制原有属性 outfile.x = input_file.x outfile.y = input_file.y outfile.z = input_file.z outfile.intensity = input_file.intensity.astype(int) outfile.reflectance = input_file.reflectance.astype(int) # 定义并添加自定义属性:指定名称和数据类型(可根据需求修改,比如np.int32、np.float64等) outfile.add_extra_dimension(laspy.ExtraBytesParams(name="NewAttribute", type=np.uint16)) # 为自定义属性赋值 outfile.NewAttribute = input_file.reflectance.astype(np.uint16) # 关闭文件 outfile.close() input_file.close()
注意:自定义属性的数据类型需与赋值数据的类型匹配,避免兼容性问题。
内容的提问来源于stack exchange,提问作者Sbobby
相关产品推荐
相关产品推荐

