天天看点

使用liblas库读写las文件c++代码

需要包含的头文件包括

//标准c++
#include <string>
//liblas库
#include <liblas/liblas.hpp>
#include <liblas/point.hpp>
#include <liblas/version.hpp>
//pcl库
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
           

读las文件

bool readLasFile(string filename){

    //pcl点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);    

	//打开las文件
	std::ifstream ifs;
	ifs.open(filename, std::ios::in | std::ios::binary);
	if (!ifs.is_open())
		return false;
	liblas::ReaderFactory f;
	//使用ReaderFactory从stream中构造Reader而不是直接调用Reader构造函数,因为las可能是压缩的
	liblas::Reader reader = f.CreateWithStream(ifs);

	liblas::Header const& header = reader.GetHeader();    //读取文件头
	int pointsNum = header.GetPointRecordsCount();    //读取点数
	//初始化cloud
	cloud->width = pointsNum;
	cloud->height = 1;
	cloud->resize(pointsNum);

	//读取相关信息
	vector<uint8_t> pclassification(pointsNum);    //记录类别信息
	vector<liblas::Color> pcolor(pointsNum);    //记录颜色信息
	vector<uint16_t> pintencity(pointsNum);    //记录强度信息
	for (int i = 0; i < pointsNum; i++)    //这里用for比wihle安全
	{
		reader.ReadNextPoint();
		const liblas::Point& p = reader.GetPoint();

		float px = (float)p.GetX();
		float py = (float)p.GetY();
		float pz = (float)p.GetZ();

		(*cloud)[i].x = px;
		(*cloud)[i].y = py;
		(*cloud)[i].z = pz;

		pclassification[i] = p.GetClassification().GetClass();
		pcolor[i] = p.GetColor();
		pintencity[i] = p.GetIntensity();
	}

	ifs.close();    //关闭文件
	return true;
}
           

写las文件

bool writeLasFile(string filename, liblas::Header header, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {

	//写文件头
	std::ofstream ofs(filename.c_str(), ios::out | ios::binary);
	liblas::Writer writer(ofs, header);
	writer.WriteHeader();

	int pointsNum = cloud->size();    //获取点数

	//记录数据范围
	float minx = 99999999;
	float miny = 99999999;
	float minz = 99999999;
	float maxx = -99999999;
	float maxy = -99999999;
	float maxz = -99999999;

	//读取并写点
	liblas::Point p(&header);
	for (int i = 0; i < pointsNum; i++) {
		float tx = cloud->at(i).x;
		float ty = cloud->at(i).y;
		float tz = cloud->at(i).z;
		minx = minx > tx ? tx : minx;
		miny = miny > ty ? ty : miny;
		minz = minz > tz ? tz : minz;
		maxx = maxx < tx ? tx : maxx;
		maxy = maxy < ty ? ty : maxy;
		maxz = maxz < tz ? tz : maxz;

		p.SetCoordinates(tx, ty, tz);
		writer.WritePoint(p);
	}

	header.SetMax(maxx, maxy, maxz);    //设置数据范围
	header.SetMin(minx, miny, minz);
	header.SetPointRecordsCount(pointsNum);    //设置点数
	                                           //(若中间处理过程点数有变化的话,可以通过此方法进行修改)
	                                           //(若无变动,则可以在一开始就设置点数)
	writer.SetHeader(header);    //设置文件头
	writer.WriteHeader();    //重写文件头

	ofs.close();    //关闭文件
	return true;
}
           

继续阅读