LibLas学习笔记

las 

什么是Las格式

LAS文件格式是数据用户之间交换三维点云数据的公共文件格式。

虽然这种格式主要用于交换激光雷达点云数据,但是它支持交换任何三维的x、y、z 数组。

这种二进制文件格式可以替代私有系统或许多公司使用的通用ASCII文件交换系统。私有系统的问题很明显,因为数据不能轻易地从一个系统转移到另一个系统。

ASCII文件交换有两个主要问题:

  1. 性能问题: 因为ASCII高程数据的读取和解释可能非常慢,即使对于少量数据,文件大小也可能非常大。
  2. 所有与激光雷达数据相关的信息都会丢失。

Las文件的优势

LAS文件格式是一种二进制文件格式,它维护特定于数据的激光雷达性质的信息,同时不会过于复杂。

Las格式介绍

参考链接

该格式包含由公共头块组成的二进制数据,任意数量的(可选)可变长度记录(vlrs),点数据记录,任意数量(可选)可扩展的可变长度记录。

所有数据是小顶端的格式

公共头文件包含的数据内容:

1. 一般的数据,点的个数和点的边界。

可变长度包含的数据类型:

1. 投影信息

2. 元数据

3. 波形包信息数据

4. 用户应用数据

可扩展的可变长度数据: 可以追加在LAS文件的末尾。


LAS文件数据格式定义

头文件格式的定义:

使用liblas库

  1. 包含所需的头文件和C++标准库
#include <liblas/liblas.hpp>
#include <fstream> // std::ifstream
#include <iostream> // std::cout
  1. 为las文件创建输入流,使用binary模式
  1. std::ifstream ifs; 

  2. ifs.open("file.las", std::ios::in | std::ios::binary); 

  1. 创建ReaderFactory和实例化一个liblas::Reader使用流
liblas::ReaderFactory f;
liblas::Reader reader = f.CreateWithStream(ifs);
  1. 读取liblas头文件中的内容
liblas::Header const& header = reader.GetHeader();

std::cout << "Compressed: " << (header.Compressed() == true) ? "true":"false";
std::cout << "Signature: " << header.GetFileSignature() << '\n';
std::cout << "Points count: " << header.GetPointRecordsCount() << '\n';
  1. 遍历点的数据
while (reader.ReadNextPoint())
{
liblas::Point const& p = reader.GetPoint(); std::cout << p.GetX() << ", " << p.GetY() << ", " << p.GetZ() << "\n";
}
  1. 随机访问数据

    注意:如果是压缩的las数据,会影响性能。如果是批量读取数据请使用Seek方法
reader.ReadPointAt(2);
liblas::Point const& p = reader.GetPoint();

使用las库写数据

Include required header files from libLAS and C++ Standard Library

#include <liblas/liblas.hpp>

#include <fstream>  // std::ofstream
#include <iostream> // std::cout

Create output stream and associate it with .las file opened to write data in binary mode

std::ofstream ofs;

ofs.open("file.las", ios::out | ios::binary);

Note It is also possible to open the stream in append mode to add data to an existing file. You should first instantiate a liblas::Reader and fetch the liblas::Header from the file, and then create the liblas::Writer with that header and the ofstream opened in append mode.

liblas::Header header = reader.GetHeader();

std::ios::openmode m = std::ios::out | std::ios::in | std::ios::binary | std::ios::ate;
ofs.open("file.las", m);
liblas::Writer writer(ofs, header);

Create instance of liblas::Header class to define Public Header Block and set some values

liblas::Header header;
header.SetDataFormatId(liblas::ePointFormat1); // Time only // Set coordinate system using GDAL support
liblas::SpatialReference srs;
srs.SetFromUserInput("EPSG:4326"); header.SetSRS(srs);

// fill other header members

Note Simply setting header.SetCompressed(true) on the header will be sufficient to output a compressed file when the liblas::Writer is created if LASzip support is enabled in libLAS, but it is up to the user to specify the proper file name extension, .laz, when writing the file.

Note The default constructed header object can be used as perfectly valid header. It will define LAS file according to LAS 1.2 and Point Data Format 3.

Create LAS file writer object attached to the output stream and the based on the header object.

liblas::Writer writer(ofs, header);

// here the header has been serialized to disk into the file.las

Write some point records

liblas::Point point(&header);
point.SetCoordinates(10, 20, 30);
// fill other properties of point record writer.WritePoint(point);

参考链接

LibLas学习笔记的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

随机推荐

  1. (Les17 移动数据)expdp/impdp

    oracle 11.2.0 expdp/impdp 数据泵参数   expdp参数=========================================================== ...

  2. 仿手机iPhone QQ消息小红点动画1

    前言 偶然发现iPhone QQ 显示消息条数的小红点可以响应动作事件,也有人问我这样的动画该怎么做,这里就把实现的思路简单的描述一下.在实现的过程中,同样发现该功能并没有看到的那么简单,要做一个完备 ...

  3. Java监听器原理及实例

    一.监听器原理 监听器是基于事件驱动的,用于对操作事件进行监听.处理,是观察者设计模式的应用 监听器三元素: 2.1 事件源:事件发生的源头 2.2 事件:对事件进行抽象.封装 2.3 监听器:用于监 ...

  4. Python中模块

    模块 模块对我来说是什么 模块对我来说,感觉就像亲属或者朋友已经走过的路,他们已经趟过的浑水.掉过的坑.践行过的路线,全部提供给你,在你需要的时候请求帮助,借鉴他们的解决方法一样.都是为了方便走好人生 ...

  5. CentOS6安装各种大数据软件 第五章:Kafka集群的配置

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

  6. $.ajax 完整参数

    jquery中的ajax方法参数 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意 ...

  7. 通过SSH服务登陆linux服务器(版本RHEL7)

    通过SSH服务登陆linux服务器(版本RHEL7) SSH服务概述:是一种能够以安全的方式提供远程登陆的协议,也是目前远程管理linux系统的首选方式.在此之前,我们一般使用FTP或者telnet来 ...

  8. Selenium_python自动化跨浏览器执行测试(简单多线程案例)

    发生背景: 跨浏览器测试是功能测试的一个分支,用以验证web应用在不同浏览器上的正常工作,通常情况下,我们都期望web类应用能够被我们的用户在任何浏览器上使用,例如有的人喜欢IE浏览器上使用,有的人喜 ...

  9. LIFO栈 ADT接口 链表实现

    LIFO 链栈结构 typedef int ElemType; struct node{ ElemType data; struct node* next; }; typedef struct nod ...

  10. 学习Emmet

    学习Emmet 在进行Web开发时,就免不了需要编写html文件,如何快速(偷懒^-^)的进行编写html,是个大问题,上网找了一下,发现了一个好东西 ,视频教程可以看下小马技术Emmet爆速开发, ...