use las::{PointDataBuilder, Reader, Writer};
use std::{env, io::Write as _};
const CHUNK: u64 = 500_000;
fn print_progress(seen: u64, total: u64) {
let pct = if total > 0 {
(seen as f64 / total as f64) * 100.0
} else {
100.0
};
eprint!("\rprocessed {seen} / {total} points ({pct:.1}%)");
let _ = std::io::stderr().flush();
}
fn main() {
let mut args = env::args().skip(1);
let input = args
.next()
.expect("usage: convert_streaming <input> <output>");
let output = args
.next()
.expect("usage: convert_streaming <input> <output>");
let mut reader = Reader::from_path(&input).expect("open input");
let header = reader.header().clone();
let total = header.number_of_points();
let mut pd = PointDataBuilder::new().for_header(&header).build();
let mut writer = Writer::from_path(&output, header).expect("open output");
let mut seen = 0u64;
loop {
let n = reader.fill_points(CHUNK, &mut pd).expect("read chunk");
if n == 0 {
break;
}
seen += n;
writer.write_points(&pd).expect("write chunk");
print_progress(seen, total);
}
eprintln!();
writer.close().expect("close writer");
println!("Wrote {seen} points to {output}");
}