1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
use crate::las::file::SimpleReader;
use crate::las::laszip::{LasZipCompressor, LasZipDecompressor, LazItem, LazVlr};
use std::fs::File;
use std::io::{BufReader, Cursor, Read, Seek};

pub fn check_decompression<R1: Read + Seek + Send, R2: Read + Seek + Send>(
    laz_src: R1,
    las_src: R2,
) {
    let mut laz_reader = SimpleReader::new(laz_src).unwrap();
    let mut las_reader = SimpleReader::new(las_src).unwrap();

    assert_eq!(laz_reader.header.num_points, las_reader.header.num_points);
    assert_eq!(
        laz_reader.header.point_format_id,
        las_reader.header.point_format_id
    );

    while let (Some(laz_pts), Some(las_pts)) = (laz_reader.read_next(), las_reader.read_next()) {
        let laz_pts = laz_pts.unwrap();
        let las_pts = las_pts.unwrap();

        assert_eq!(laz_pts, las_pts);
    }
}

pub struct LasChecker<'a> {
    reader: crate::las::file::SimpleReader<'a>,
}

impl<'a> LasChecker<'a> {
    pub fn new<R: Read + Seek + Send + 'a>(src: R) -> crate::Result<Self> {
        Ok(Self {
            reader: crate::las::file::SimpleReader::new(src)?,
        })
    }

    pub fn from_path(las_path: &str) -> crate::Result<Self> {
        Ok(Self {
            reader: crate::las::file::SimpleReader::new(BufReader::new(File::open(las_path)?))?,
        })
    }

    pub fn check(&mut self, points: &[u8]) {
        assert_eq!(points.len() % self.reader.header.point_size as usize, 0);

        for point in points.chunks_exact(self.reader.header.point_size as usize) {
            assert_eq!(point, self.reader.read_next().unwrap().unwrap());
        }
    }
}

pub fn check_that_we_can_decompress_what_we_compressed<R: Read + Seek + Send>(
    las_src: R,
    laz_items: Vec<LazItem>,
) {
    let mut las_reader = SimpleReader::new(las_src).unwrap();
    let laz_vlr = LazVlr::from_laz_items(laz_items);
    assert_eq!(
        laz_vlr.items_size() as usize,
        las_reader.header.point_size as usize
    );
    let mut compressor = LasZipCompressor::new(Cursor::new(Vec::<u8>::new()), laz_vlr).unwrap();

    while let Some(point_buf) = las_reader.read_next() {
        let point_buf = point_buf.unwrap();
        compressor.compress_one(point_buf).unwrap()
    }
    compressor.done().unwrap();

    let vlr = compressor.vlr().clone();
    let mut compression_output = compressor.into_inner();
    compression_output.set_position(0);

    let mut decompressor = LasZipDecompressor::new(compression_output, vlr).unwrap();

    let mut decompressed_point = vec![0u8; las_reader.header.point_size as usize];
    while let Some(point_buf) = las_reader.read_next() {
        let point_buf = point_buf.unwrap();
        decompressor
            .decompress_one(&mut decompressed_point)
            .unwrap();
        assert_eq!(decompressed_point.as_slice(), point_buf);
    }
}