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()需要注意,它返回的是一个迭代器。

总结

本文分享了两种读取点的方式,一种是直接全部读取,另一种是采用流式,按照设定点的数量一次读取,对内存更友好。

posted @ 2026-09-07 10:59  BufferXiu  阅读(6)  评论(0)    收藏  举报