ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

libLAS 1.8.1 实战:LAS点云文件读写与处理工具详解

libLAS 1.8.1 实战:LAS点云文件读写与处理工具详解 简介针对Windows 64位环境预编译的libLAS 1.8.1开源C库面向需要读写LAS和LAZ点云数据的开发者尤其适合在Visual Studio 2017下搭建点云处理工程。包体约6.01兆字节压缩包内含可直接引用的头文件和库文件免去自行编译的麻烦。libLAS支持ASPRS标准格式涵盖元数据解析、点坐标、颜色、强度等属性访问并提供距离过滤、高度过滤、坐标变换与格式转换等常用功能配合VS2017的调试和性能优化工具可高效处理大规模点云数据。已有139人浏览学习对从事无人机测绘、建筑信息模型、逆向建模或自动驾驶数据预处理的C开发者来说这套64位版本库能直接集成到项目中快速实现点云文件的读取、写入与基础操作缩短环境搭建周期同时熟悉libLAS接口也有助于理解激光雷达数据的组织方式为后续开发更复杂的点云处理算法奠定基础。无论你是刚接触点云处理的初学者还是需要快速集成点云读写能力的工程师这套预编译库都能提供稳定且轻量的基础支撑。1. 拿到 libLAS-1.8.1.rar 之后我到底在研究什么第一次看到这个压缩包的人大概率会以为它是个什么冷门游戏资源或者某款软件的安装包。实际上libLAS 是做激光雷达数据处理的人几乎绕不开的一个基础库它专门用来读写 LAS 格式的点云文件。如果你接触过机载激光雷达、车载移动测量或者地面三维扫描那你一定遇到过 .las 和 .laz 后缀的文件这些文件动辄几个 GB里面存的是几千万甚至上亿个三维坐标点。libLAS 就是处理这类文件的一把瑞士军刀。我刚拿到手上这个 libLAS-1.8.1.rar 的时候第一反应是现在怎么还有人用 rar 打包源码后来想想也合理Windows 环境下很多用户对 zip 的处理不如 rar 顺手而且国内不少测绘、遥感行业的从业者工作机就是 Windows拿到的工具包也经常是这种形式。重要的是压缩包里面是什么而不是它用什么格式压缩。这篇东西我不打算写成 libLAS 的官方文档翻译而是从实际使用的角度把库能干什么、怎么装、怎么用、会遇到什么坑一条条捋清楚。无论你是刚入行的小白还是被 LAS 文件折磨过几次的老手应该都能在里面找到点有用的东西。libLAS 本身是一个 C 库通过命令行工具和 C API 两种方式提供服务。1.8.1 这个版本号是 2014 年左右发布的说实话不算新但它胜在稳定、依赖简单至今仍有很多项目在用它做基础的点云读写。对于多数场景来说它的功能完全够用甚至比某些重量级方案更轻量、更好上手。2. 为什么选择 libLAS它到底解决了什么问题2.1 LAS 格式的特殊性在聊 libLAS 之前先花两分钟理解一下 LAS 格式不然你很难明白这个库的价值。LAS 是 ASPRS美国摄影测量与遥感学会制定的激光雷达点云数据标准格式。它不是普通的文本文件不是 CSV也不是简单的二进制点列而是有严格结构定义的二进制格式。一个标准的 LAS 文件由三部分组成公共文件头Public Header Block、变长记录VLRVariable Length Records、点数据记录Point Data Records。公共文件头里存着文件版本、点数、坐标范围、缩放因子等全局信息。变长记录可以存波形信息、坐标系统、元数据等扩展内容。点数据记录则是每个点的实际属性通常包括 X、Y、Z 坐标强度值Intensity回波号Return Number回波总数Number of Returns分类值Classification扫描角Scan Angle等等。每种属性都有精确的字节长度和位偏移少读一位或者偏移搞错整个文件就废了。这就是为什么你不能简单地用记事本打开 LAS 文件然后手动提取坐标。手动解析二进制不是不行但你需要面对字节序、位域、变长记录偏移、不同版本的点格式差异等问题这些事做起来又繁琐又容易出错。libLAS 的存在意义就是把这些底层的二进制解析全部封装好让你直接拿到可用的点云数据。2.2 为什么是 1.8.1 这个版本libLAS 的版本迭代里1.8.x 系列算是生命周期比较长的稳定分支。1.8.1 修复了 1.8.0 里的一些 bug对 LAS 1.0 到 1.2 规范的支持已经非常成熟同时兼容部分 1.3 特性。虽然官方文档推荐的稳定版本里后来也有更高版本出现但在实际项目里1.8.1 依然被广泛使用。我自己选择 1.8.1 的原因有三个第一稳定压倒一切。这个版本经过多年检验社区反馈的 bug 很少网上能搜到的资料也几乎都是基于这个版本写的遇到问题很容易找到解决方案。第二编译门槛低。它依赖的库很少核心功能只需要 GDAL 可选支持即使完全不装 GDAL 也能正常编译和使用大部分功能。相比一些需要一堆依赖的库libLAS 1.8.1 对新手极其友好。第三功能覆盖日常需求的 90%。对于读取信息、格式转换、简单合并这些高频需求1.8.1 完全能胜任。如果你只是做点云的日常预处理不需要 LAS 1.4 的高压缩比特性那 1.8.1 够用到退休。2.3 libLAS 能做的几件事libLAS 提供两套使用方式命令行工具和 C API。命令行工具是开箱即用的适合快速处理数据。C API 适合嵌入到自己的程序里实现自动化批量处理。命令行工具集包括lasinfo查看 LAS 文件的头信息、点格式、坐标范围、统计信息。las2txt把 LAS 转成文本格式方便在 Excel、Python 里做进一步分析。las2lasLAS 格式转换、坐标改写、点重分类。lasmerge合并多个 LAS 文件。laszip对 LAS 文件做无损压缩解压生成 LAZ 格式。lasground基于渐进加密三角网的滤波算法用于提取地面点在部分版本中提供。lasheight根据地面点计算每个点的相对高度。这套工具从数据质检到格式转换都覆盖了配合脚本使用能省下大量手动操作的时间。3. 安装部署全流程从解压到编译运行3.1 Windows 环境下的快速配置回到这个压缩包本身。如果你拿到的是一个已经编译好的 Windows 版本通常里面会包含 bin 目录可执行文件、include 目录头文件和 lib 目录库文件。使用起来很简单把 bin 目录加入系统 PATH 环境变量在命令行里就能直接调用 lasinfo、las2txt 这些工具。配置 PATH 的操作路径是右键此电脑→属性→高级系统设置→环境变量在系统变量里找到 Path编辑并新增一条记录指向你的 libLAS 的 bin 目录。配置完成后打开一个新的命令行窗口输入lasinfo --version如果能看到版本信息输出说明环境配置成功。我见过太多人在这一步翻车——改完环境变量不重开命令行窗口直接就用旧窗口执行命令结果提示不是内部或外部命令这不是配置问题纯粹是窗口没刷新。如果你拿到的包里是源码而不是编译好的可执行文件那就需要用 CMake 配合 Visual Studio 自己编译。流程也不复杂先安装 CMake 和 Visual Studio2015 以上版本即可然后在源码根目录执行mkdir build cd build cmake .. -DWITH_GDALOFF cmake --build . --config Release-DWITH_GDALOFF这个参数很关键。如果不显式关闭 GDALCMake 会在系统里找 GDAL 库找不到就报错找到了又可能出现版本不匹配的问题。对于没有坐标转换需求的用户直接关掉 GDAL 能让整个编译过程变得异常顺滑。3.2 Linux 环境下的编译安装Linux 用户就省心很多了。Ubuntu 和 Debian 系可以用 apt 直接安装sudo apt update sudo apt install liblas-c-dev liblas-bin装完以后lasinfo、las2txt这些命令直接就能用。如果你的源里没有 liblas 包或者你想自己编译最新版那就从 GitHub 拉源码git clone https://github.com/libLAS/libLAS.git cd libLAS mkdir build cd build cmake .. make -j4 sudo make install编译过程中如果报缺少 boost 头文件的错误需要先安装依赖sudo apt install libboost-dev libboost-filesystem-dev libboost-iostreams-devLinux 下编译 libLAS 还有一个隐藏福利编译完以后liblas-config这个脚本会被安装到系统路径下之后你在自己的 C 程序里用它来获取编译参数和链接参数非常方便liblas-config --cflags --libs输出内容大致是这样的-I/usr/local/include -I/usr/local/include/liblas -L/usr/local/lib -llas这下你就不用自己在 Makefile 里手动找头文件路径和库路径了。3.3 编译时常见参数的选择思路用 CMake 配置 libLAS 的时候有几个参数值得关注这里列出来供你参考参数可选值说明-DWITH_GDALON/OFF是否启用 GDAL 集成影响坐标参考系处理。不需要坐标系统转换时建议 OFF-DWITH_TESTSON/OFF是否编译测试代码。个人使用建议 OFF节省编译时间-DWITH_UTILITIESON/OFF是否编译命令行工具。默认 ON除非你只需要库本身-DCMAKE_INSTALL_PREFIX路径安装目录前缀默认/usr/local-DBUILD_SHARED_LIBSON/OFF编译动态库还是静态库默认动态库。部署到服务器建议静态库避免动态库路径问题这些参数不是拍脑袋乱设的每个选项背后都有具体的应用场景。比如WITH_GDAL这个开关如果你的数据主要来源是国内项目坐标系统大多是 CGCS2000 或者地方坐标系GDAL 的坐标系转换功能几乎派不上用场还增加编译负担关了反而省心。但如果你处理的是全球范围的多源数据涉及 WGS84、UTM 之间的互转那 GDAL 还是很有用的。4. 命令行工具实操几个高频场景的完整演示4.1 lasinfo数据质检第一步拿到一个 LAS 文件第一步永远是先看它是什么来头。lasinfo 就是干这个的。lasinfo input.las执行后输出大致如下部分省略Header Information File Source ID: 0 Version: 1.2 System Identifier: LASlib Generating Software: lasinfo File Creation Day/Year: 15/2014 Point Data Format: 3 Number of Point Records: 12345678 Number of Points by Return: 11111111 1111111 111111 11111 1111 Scale Factor X Y Z: 0.01 0.01 0.01 Offset X Y Z: 500000.00 4000000.00 0 Min X Y Z: 499999.99 3999999.99 10.11 Max X Y Z: 500100.00 4000100.00 88.52 ... Point Data Point Source ID: 12 Intensity: min0 max255 Classification: 2 (Ground) ...这里面有几个信息特别关键。Scale Factor是坐标缩放因子它决定了浮点坐标的精度如果它是 0.01那意味着坐标精度是 1 厘米Offset是坐标偏移量一般用于把大地坐标平移到一个合理范围内避免浮点精度损失。如果 min/max 坐标值出现异常比如某轴范围达到几百万公里那大概率是 scale factor 和 offset 设置错了。lasinfo 还有一个-histo参数可以按不同属性统计分布lasinfo input.las -histo intensity -histo classification这个功能在做数据质检的时候特别好用。比如你想快速判断一个点云文件里有没有异常的分类值直接看 classification 的直方图就行正常的分类值一般是 0~31如果出现 65 或者更高的值说明数据源有问题。4.2 las2txt把点云变成普通文本很多做算法的人不直接用 C 或 Python 库读 LAS而是先把 LAS 转成文本格式再用 pandas 或者 Matlab 处理。las2txt 就是做这个的。las2txt input.las -o output.txt -parse xyzintensity -sep comma这里-parse参数定义了输出的字段顺序xyzintensity表示输出 X、Y、Z、强度值四列。-sep comma指定分隔符为英文逗号方便导入 Excel 或者 Python。如果文件里有 RGB 颜色信息可以这样输出las2txt input.las -o output.csv -parse xyzrgb -sep comma注意一点转换大文件的时候输出文本的空间占用会远大于原始二进制文件。一个 3GB 的 LAS 文件转成 CSV 之后可能有 10GB 以上。如果你的磁盘空间不足建议用-stdout参数直接输出到管道配合 head 命令先看一眼前几行las2txt input.las -parse xyz -sep comma -stdout | head -20这样既不用生成大文件又能快速预览数据格式。4.3 lasmerge合并多个文件外业采集的数据经常分裂成很多个小块一个测区可能有几十个甚至上百个 LAS 文件。处理之前一般要先合并成一个完整文件。lasmerge -i block_*.las -o merged.las这个通配符写法对批量合并非常友好。合并的底层逻辑不复杂——读每个文件的头信息把全局坐标范围扩到包含所有文件的范围然后把每个点依序写入新文件。这本质上是对齐格式不涉及空间重采样或者抽稀所以不用担心合并过程中点的位置被改变。合并的时候有个小细节容易踩坑如果各分块文件的点格式不一致比如一部分是 Point Format 1带 GPS 时间一部分是 Point Format 3带 RGB 和时间lasmerge 会把所有点提升到更高级的格式再合并保持输出文件格式统一。这意味着输出文件的体积会比原始文件总和稍微大一些因为每个点记录的长度变大了。这是正常现象不用惊慌。4.4 las2las格式转换与坐标改写las2las 的功能比较多核心是格式转换和坐标改写。把 LAS 1.2 转成 LAS 1.0或者反过来就这么简单las2las -i input.las -o output.las -version 1.0还有一个常用的功能是重新设置缩放因子和偏移量。有时候你拿到的 LAS 文件 scale factor 是 0.001毫米级精度但实际数据只需要厘米级精度这种情况下文件体积会无谓地变大。用 las2las 把 scale factor 改成 0.01文件体积能缩小三分之一左右精度损失在可接受范围内las2las -i input.las -o output.las -scale_x 0.01 -scale_y 0.01 -scale_z 0.01这个操作的本质是改变每个坐标值的存储整数粒度把原来存 123.45678 变成存 123.46精度从毫米降到厘米换来的是压缩后的整数位数变少。对于那些只需要做可视化或宏观分析的数据这个减负策略很实用。5. C API 集成写一个自己的点云读取工具命令行工具适合交互式操作但在自动化流程里你大概率还是需要在自己的程序里直接调用 libLAS 的 API。这里给一个最小可用的 C 示例演示如何读取 LAS 文件里的点坐标和强度值。#include liblas/liblas.hpp #include fstream #include iostream int main(int argc, char** argv) { if (argc 2) { std::cerr Usage: read_las input.las std::endl; return 1; } std::ifstream ifs; ifs.open(argv[1], std::ios::in | std::ios::binary); if (!ifs.is_open()) { std::cerr Failed to open file. std::endl; return 1; } liblas::ReaderFactory f; liblas::Reader reader f.CreateWithStream(ifs); liblas::Header const header reader.GetHeader(); std::cout Number of points: header.GetPointRecordsCount() std::endl; std::cout Point format: header.GetDataFormatId() std::endl; long long count 0; while (reader.ReadNextPoint()) { liblas::Point const p reader.GetPoint(); double x p.GetX(); double y p.GetY(); double z p.GetZ(); int intensity p.GetIntensity(); if (count 5) { std::cout Point count : x , y , z intensity intensity std::endl; } count; } std::cout Total read: count points. std::endl; return 0; }用 g 编译的时候注意链接 liblas 和 boost 相关库g -o read_las read_las.cpp $(liblas-config --cflags --libs) -lboost_filesystem -lboost_iostreams这段代码做了三件事打开文件、遍历所有点、输出前五个点的坐标和强度。核心逻辑全都被 libLAS 封装好了你不需要关心二进制结构只需要调用ReadNextPoint()和GetPoint()这两个接口。有一个性能细节值得说libLAS 默认是逐点读取的对于上亿点的大文件逐点读取会比较慢。如果你想提升性能可以考虑用liblas::Reader的缓冲模式或者改用liblas::detail::LASReader这种更底层的接口但接口复杂度会高一些。对于大多数应用场景逐点读取配合 OpenMP 多线程分段处理已经能跑出不错的性能。6. 常见问题与排查技巧速查表6.1 高频错误与解决方案问题现象可能原因解决办法无法定位程序输入点错误DLL 版本冲突或缺少运行时库检查 PATH 里是否有多个 liblas 版本安装 VC RedistributableCould not open file路径中包含中文或特殊字符把文件路径改成纯英文libLAS 对 Windows 系统中文路径支持不佳Unknown file versionLAS 文件版本超过 1.2libLAS 1.8.1 不完全支持用 las2las 把版本降级或用 PDAL 读取高版本格式合并后的文件坐标出现明显偏移各文件的坐标 offset 不一致用 lasinfo 查看每个文件的 Offset用 las2las 统一后再合并cmake 报错找不到 Boost未安装 Boost 或版本不匹配Ubuntu 安装 libboost-devWindows 用 vcpkg 安装 boostlas2txt 转出来的文件缺列parse 参数书写错误检查-parse参数的字母顺序如xyzirgb表示坐标、强度、回波数、RGB坐标值异常大或异常小scale factor 或 offset 设置不正确用 lasinfo 查看头信息重新设置 scale 和 offset6.2 一个我踩过很久的坑中文路径问题必须单独拿出来说。libLAS 在 Windows 下用 std::ifstream 打开文件底层走的是 C 库的 fopen而 Windows 下的 fopen 默认不识别 UTF-8 编码的路径。如果你的数据放在D:\项目数据\2024年采集\这种目录下libLAS 打不开文件但命令行窗口报错信息让你根本想不到是路径问题因为文件明明存在。我后来整理了一套绕行方案在批处理脚本里先cd到数据目录然后用相对路径调用 lasinfo、las2txt绕开绝对路径里的中文。如果必须用绝对路径先给 Windows 开启 Beta 版 UTF-8 支持控制面板 → 区域 → 管理语言设置 → 更改系统区域设置 → 勾选Beta使用 Unicode UTF-8 提供全球语言支持重启后中文路径就能被 fopen 识别了。最稳妥的办法处理之前统一把文件复制到英文路径下。虽然粗暴但能彻底杜绝这类问题。6.3 大数据量处理时的内存与性能优化处理 5GB 以上的大文件时你的操作系统内存可能直接跑满。libLAS 的 Reader 是按流方式读取的本身不占用太多内存但是如果你在循环里把所有点都 push 进一个 vector 再处理内存就会爆。我的建议是能流式处理就流式处理需要统计的用增量方式比如算均值就维护 sum 和 count算范围就维护 min 和 max不要一次性把所有点加载进内存。如果确实需要对点集做随机访问请考虑用内存映射文件或者数据库。7. 另一个思路什么时候该换 PDALlibLAS 1.8.1 虽然稳定但如果你需要支持 LAS 1.4、LAZ 压缩效率更高、直接读取更多新型传感器格式那你是时候考虑迁移到 PDALPoint Data Abstraction Library了。PDAL 可以看成 libLAS 的现代替代品支持格式更多、插件体系更丰富、Python 绑定也更好用。我现在的很多新项目已经开始用 PDAL 了但它有一个缺点学习曲线稍陡概念多处理简单任务的时候反而觉得笨重。所以我的经验是如果只是做 LAS 读写和格式转换libLAS 更轻快顺手如果涉及点云处理流水线、滤波、配准、分类等复杂操作PDAL 更合适。两者并不互斥同一台机器上可以同时安装按场景选用。我自己目前的工作流是用 libLAS 做快速的数据预览和格式转换用 PDAL 做复杂的批处理流水线用 Python 的 laspy 做科研试验和模型训练前的数据加载。每样工具都有它的位置没有一种工具能包打天下。从第一次在 Windows 上笨拙地配置环境变量到现在熟练地在脚本里调用 libLAS 的各种功能这个小小的 rar 包确实陪着我走过了不少数据处理的日子。如果你手里也刚刚拿到这个压缩包不用多想装好就用把这些命令敲一遍你很快就会熟悉它。本文还有配套的精品资源点击获取
返回列表