use crate::{Error, Header, Result, Vlr};
use laz::{LazItemRecordBuilder, LazItemType, LazVlr};
use std::io::Cursor;
pub fn is_laszip_vlr(vlr: &Vlr) -> bool {
vlr.user_id == LazVlr::USER_ID && vlr.record_id == LazVlr::RECORD_ID
}
impl Header {
pub fn add_laz_vlr(&mut self) -> Result<()> {
let point_format = self.point_format();
let mut laz_items = LazItemRecordBuilder::new();
if !point_format.is_extended {
let _ = laz_items.add_item(LazItemType::Point10);
if point_format.has_gps_time {
let _ = laz_items.add_item(LazItemType::GpsTime);
}
if point_format.has_color {
let _ = laz_items.add_item(LazItemType::RGB12);
}
if point_format.extra_bytes > 0 {
let _ = laz_items.add_item(LazItemType::Byte(point_format.extra_bytes));
}
} else {
let _ = laz_items.add_item(LazItemType::Point14);
if point_format.has_color {
if point_format.has_nir {
let _ = laz_items.add_item(LazItemType::RGBNIR14);
} else {
let _ = laz_items.add_item(LazItemType::RGB14);
}
}
if point_format.extra_bytes > 0 {
let _ = laz_items.add_item(LazItemType::Byte14(point_format.extra_bytes));
}
}
let laz_vlr = LazVlr::from_laz_items(laz_items.build());
let mut cursor = Cursor::new(Vec::<u8>::new());
laz_vlr.write_to(&mut cursor)?;
let vlr = Vlr {
user_id: LazVlr::USER_ID.to_owned(),
record_id: LazVlr::RECORD_ID,
description: LazVlr::DESCRIPTION.to_owned(),
data: cursor.into_inner(),
};
self.vlrs.push(vlr);
Ok(())
}
pub fn laz_vlr(&self) -> Option<LazVlr> {
self.vlrs
.iter()
.find(|vlr| is_laszip_vlr(vlr))
.and_then(|vlr| vlr.try_into().ok())
}
}
impl TryFrom<&Vlr> for LazVlr {
type Error = Error;
fn try_from(vlr: &Vlr) -> Result<LazVlr> {
LazVlr::from_buffer(&vlr.data).map_err(Error::from)
}
}