use std::num::NonZeroUsize;
use crate::cpl::CslStringList;
use crate::errors;
use crate::raster::processing::dem::options::common_dem_options;
use super::options::CommonOptions;
#[derive(Debug, Clone, Default)]
pub struct TriOptions {
common_options: CommonOptions,
algorithm: Option<DemTriAlg>,
}
impl TriOptions {
pub fn new() -> Self {
Default::default()
}
common_dem_options!();
pub fn with_algorithm(&mut self, algorithm: DemTriAlg) -> &mut Self {
self.algorithm = Some(algorithm);
self
}
pub fn to_options_list(&self) -> errors::Result<CslStringList> {
let mut opts = CslStringList::default();
self.store_common_options_to(&mut opts)?;
if let Some(alg) = self.algorithm {
opts.add_string("-alg")?;
opts.add_string(alg.to_gdal_option())?;
}
Ok(opts)
}
}
#[derive(Debug, Clone, Copy)]
pub enum DemTriAlg {
Wilson,
Riley,
}
impl DemTriAlg {
#[allow(dead_code)]
fn to_gdal_option(self) -> &'static str {
match self {
DemTriAlg::Wilson => "Wilson",
DemTriAlg::Riley => "Riley",
}
}
}
#[cfg(test)]
mod tests {
use crate::assert_near;
use crate::errors::Result;
use crate::raster::processing::dem::terrain_ruggedness_index;
use crate::raster::StatisticsAll;
use crate::test_utils::{fixture, InMemoryFixture};
use crate::Dataset;
use super::*;
#[test]
fn test_options() -> Result<()> {
use crate::cpl::CslStringList;
let mut opts = TriOptions::new();
opts.with_input_band(2.try_into().unwrap())
.with_compute_edges(true)
.with_algorithm(DemTriAlg::Wilson)
.with_output_format("GTiff")
.with_additional_options("CPL_DEBUG=ON".parse()?);
let expected: CslStringList =
"-compute_edges -b 2 -of GTiff CPL_DEBUG=ON -alg Wilson".parse()?;
assert_eq!(expected.to_string(), opts.to_options_list()?.to_string());
Ok(())
}
#[test]
fn test_tri() -> Result<()> {
let mut opts = TriOptions::new();
opts.with_algorithm(DemTriAlg::Wilson);
let ds = Dataset::open(fixture("dem-hills.tiff"))?;
let output = InMemoryFixture::new("dem-hills-tri.tiff");
let tri = terrain_ruggedness_index(&ds, output.path(), &opts)?;
let stats = tri.rasterband(1)?.get_statistics(true, false)?.unwrap();
let expected = StatisticsAll {
min: 0.0,
max: 4.9836235046387,
mean: 0.49063101456532,
std_dev: 0.67193563366948,
};
assert_near!(StatisticsAll, stats, expected, epsilon = 1e-10);
Ok(())
}
}