Rust与点云1-2
Rust 与点云
本节分享如何读取las的点部分。根据上一篇文章内容,las文件主要分为三部分,而其中最后一部分就是点数据记录(Point Data Record)模块
1. 点存储方式
点数据记录模块并不是直接存储点,而是通过一下方式计算得到:
真实坐标 = 整数值 × 缩放因子 + 偏移量
这样存储的好处是省空间,效率更高。例如坐标是815220.2719,设置缩放因子为0.0001,偏移量是800000,那么只需要存储152202719,而直接存储浮点数,必须要dobule float,这需要8字节。
2.读取方式(一)
分享第一种简单的方式,直接读取,适合中小型las文件。
fn main() {
let path = "assets//Block.las";
let mut reader = Reader::from_path(&path).expect("Failed to open LAS file");
let pd = reader.read_all().unwrap();
let min_x = pd.x().fold(f64::INFINITY, f64::min);
let max_x = pd.x().fold(f64::NEG_INFINITY, f64::max);
let length = pd.x().map(|v| v > 500000_f64).count();
println!(
"最小的x坐标是:{:?},最大的x坐标是:{:?},其中x坐标大于500000的点有:{:?}个",
min_x, max_x, length
);
}
使用read_all()直接往内存中读取点坐标
3.流式读取
一种对内存更友好的方式,利用 PointDataBuilder::new().for_header(&header).build()根据头文件中的信息,构建一个PointData对象,然后使用fill_points()函数向其中根据CHUNK大小写入点数据,实现读取。
const CHUNK: u64 = 500000;
let mut reader = Reader::from_path(&path).expect("Failed to open LAS file");
let header = reader.header().clone();
let mut pd = PointDataBuilder::new().for_header(&header).build();
loop {
let n = reader.fill_points(CHUNK, &mut pd).expect("read chunk");
if n == 0 {
break;
}
let min_x = pd.x().fold(f64::INFINITY, f64::min);
let max_x = pd.x().fold(f64::NEG_INFINITY, f64::max);
let length = pd.x().map(|v| v > 500000_f64).count();
println!(
"最小的x坐标是:{:?},最大的x坐标是:{:?},其中x坐标大于500000的点有:{:?}个",
min_x, max_x, length
);
}
其中pd.x()需要注意,它返回的是一个迭代器。
总结
本文分享了两种读取点的方式,一种是直接全部读取,另一种是采用流式,按照设定点的数量一次读取,对内存更友好。

使用las库,并采用两种方法读取las文件中的点数据
浙公网安备 33010602011771号