las格式读写
最近需要展示绝对位置的点云,原本用的点云格式是ply,但绝对位置的点云整数位有6位或者7位,ply是以float格式存储点云,以ply存储有精度损失的情况,了解到las格式后,选用las格式。
1. 配置las库
从GitHub 上下载las库的源码:
GitHub - LAStools/LAStools: efficient tools for LiDAR processing
下载好源码后,需要编译出静态库LASlib.lib,具体过程参考:
win7/win10 编译lastools(包含laslib laszip las2las las2txt等) - Lachiven - 博客园 (cnblogs.com)
分别用debug和release生成成功后,新建文件夹D:\LAStools,将编译之后的LASzip和LASlib文件夹放入
环境设置
Debug设置环境
VC++目录->包含目录:
D:\LAStools\LASzip\src
D:\LAStools\LASlib\inc
D:\LAStools\LASzip\include\laszip
VC++目录->库目录:
D:\LAStools\LASlib\lib\Debug
链接器->输入->附加依赖项:LASlib.lib
在项目属性里设置选择:属性->配置属性->C/C++ ->预处理器->预处理器定义->编辑,最下面加上一行:_CRT_SECURE_NO_WARNINGS
Release设置环境
VC++目录->包含目录:
D:\LAStools\LASzip\src
D:\LAStools\LASlib\inc
D:\LAStools\LASzip\include\laszip
VC++目录->库目录:
D:\LAStools\LASlib\lib\ Release
链接器->输入->附加依赖项:LASlib.lib
在项目属性里设置选择:属性->配置属性->C/C++ ->预处理器->预处理器定义->编辑,最下面加上一行:_CRT_SECURE_NO_WARNINGS
读写样例
点击查看代码
#include <iostream>
#include "laswriter.hpp"//必须写,写入的头文件
#include "lasreader.hpp"//必须写,读取的头文件
int main()
{
std::string file_name = u8"D:/数据/youruser.las";//" u8"不可忽略,否则会报错,改为外部传输时,需要将编码格式转换为utf-8
// 写出流
LASwriteOpener laswriteopener;
laswriteopener.set_file_name(file_name.c_str());
// 是否创建成功
if (!laswriteopener.active()) {
std::cout << "Failed!\n";
return -1;
}
// 初始化头
LASheader lasheader;
lasheader.x_scale_factor = 0.1; //保留位数,0.1表示保留1位小数,0.01表示保留2位小数,以此类推,y z同理
lasheader.y_scale_factor = 0.1;
lasheader.z_scale_factor = 0.1;
lasheader.x_offset = 200000.0;//偏移量double类型,y z同理
lasheader.y_offset = 200000.0;
lasheader.z_offset = 200000.0;
lasheader.point_data_format = 1;//格式类型,目前用1足够
lasheader.point_data_record_length = 28;
// 初始化点
LASpoint laspoint;
laspoint.init(&lasheader, lasheader.point_data_format, lasheader.point_data_record_length, 0);
// 写点云
LASwriter* laswriter = laswriteopener.open(&lasheader);
if (laswriter == 0) {
std::cout << "Failed!\n";
return -1;
}
for (int i = 0; i < 1000; i++) {
laspoint.set_X(i * 0.1 / lasheader.x_scale_factor);// laspoint.set_X(a) a为int类型,一般这样计算(原始数据-偏移量)/ lasheader.x_scale_factor,y z同理
laspoint.set_Y(i * 0.1 / lasheader.y_scale_factor);
laspoint.set_Z(i * 0.1 / lasheader.z_scale_factor);
laspoint.set_intensity((U16)i); //强度值,无符号短整形(unsigned short),取值范围为0~65535
laspoint.set_gps_time(0.0006 * i);//时间,double类型
laswriter->write_point(&laspoint);
laswriter->update_inventory(&laspoint);
}
// 关闭流
laswriter->update_header(&lasheader, TRUE);
laswriter->close();
delete laswriter;
return 0;
}
std::vector<PointCloudXYZCT> Las2Ply(std::string& sLasPath)
{
std::vector<PointCloudXYZCT>result;
LASreadOpener lasReadOpener;
lasReadOpener.set_file_name(sLasPath.c_str());
LASreader* lasReader = lasReadOpener.open(sLasPath.c_str());
#pragma region Las information
int majorVersion = lasReader->header.version_major;
int minorVersion = lasReader->header.version_minor;
int pointDataFormat = lasReader->header.point_data_format;
int pointAmount = lasReader->header.number_of_point_records;
double maxX = lasReader->header.max_x;
double minX = lasReader->header.min_x;
double maxY = lasReader->header.max_y;
double minY = lasReader->header.min_y;
double maxZ = lasReader->header.max_z;
double minZ = lasReader->header.min_z;
double deltaX = maxX - minX;
double deltaY = maxY - minY;
double deltaZ = maxZ - minZ;
double xOffset = lasReader->header.x_offset;
double yOffset = lasReader->header.y_offset;
double zOffset = lasReader->header.z_offset;
double xScale = lasReader->header.x_scale_factor;
double yScale = lasReader->header.y_scale_factor;
double zScale = lasReader->header.z_scale_factor;
#pragma endregion
while (lasReader->read_point())
{
LASpoint& pointReader = lasReader->point;
PointCloudXYZCT ply;
ply.x = pointReader.get_x();
ply.y = pointReader.get_y();
ply.z = pointReader.get_z();
ply.color = pointReader.get_intensity();
ply.time= pointReader.get_gps_time();
result.push_back(ply);
}
lasReader->close();
delete lasReader;
lasReader = nullptr;
return result;
}
遇到的问题
1.读写函数的具体含义,参考以下的博文:
2.路径为中文
如果路径中存在中文,需要将编码格式保证为utf-8,才能程序保证正常运行,例如这样
std::string file_name = u8"D:/数据/youruser.las";//" u8"不可忽略,否则会报错,改为外部传输时,需要将编码格式转换为utf-8
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)