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;
}
ply格式替换为自己需要的格式 生成的las文件拖到cc中显示如下:

image

遇到的问题

1.读写函数的具体含义,参考以下的博文:

LASTools读取操作

2.路径为中文
如果路径中存在中文,需要将编码格式保证为utf-8,才能程序保证正常运行,例如这样
std::string file_name = u8"D:/数据/youruser.las";//" u8"不可忽略,否则会报错,改为外部传输时,需要将编码格式转换为utf-8

posted @   Sunshine_today  阅读(255)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示