use clap::ValueEnum;
use serde::{Deserialize, Serialize};
#[derive(PartialEq, Debug, Clone, Copy)]
pub struct RasterDataShape {
pub times: usize,
pub layers: usize,
pub rows: usize,
pub cols: usize,
}
#[derive(Debug, std::cmp::PartialEq, Clone, Copy, Default)]
pub enum Dimension {
#[default]
Layer,
Time,
}
#[derive(Debug, Default, PartialEq, Clone, Copy)]
pub struct ImageResolution {
pub x: f64,
pub y: f64,
}
#[derive(Default, Debug, PartialEq, Clone, Copy)]
pub struct ImageSize {
pub rows: usize,
pub cols: usize,
}
#[derive(PartialEq, Debug, Clone, Copy)]
pub struct Offset {
pub rows: isize,
pub cols: isize,
}
#[derive(PartialEq, Debug, Clone, Copy)]
pub struct Size {
pub rows: isize,
pub cols: isize,
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub struct BlockSize {
pub rows: usize,
pub cols: usize,
}
impl Default for BlockSize {
fn default() -> Self {
BlockSize {
rows: 1024,
cols: 1024,
}
}
}
#[derive(Default, Debug, PartialEq, Clone, Copy)]
pub struct GeoTransform {
pub x_ul: f64,
pub x_res: f64,
pub x_rot: f64,
pub y_ul: f64,
pub y_rot: f64,
pub y_res: f64,
}
impl GeoTransform {
pub fn to_array(&self) -> [f64; 6] {
let array: [f64; 6] = [
self.x_ul, self.x_res, self.x_rot, self.y_ul, self.y_rot, self.y_res,
];
array
}
}
#[derive(PartialEq, Debug, Clone, Copy)]
pub struct ReadWindow {
pub offset: Offset,
pub size: Size,
}
#[derive(Debug, PartialEq, Clone, Copy, Default)]
pub struct Overlap {
pub left: usize,
pub top: usize,
pub right: usize,
pub bottom: usize,
}
#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize, ValueEnum)]
pub enum SamplingMethod {
Value,
Mode,
Min,
StdDev,
Avg,
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct Index2d {
pub col: usize,
pub row: usize,
}
#[derive(Default, Debug, PartialEq, Clone, Copy)]
pub struct Coordinates {
pub(crate) x: f64,
pub(crate) y: f64,
}
#[derive(Debug, Copy, Clone)]
pub struct Rectangle {
pub left: usize,
pub top: usize,
pub right: usize,
pub bottom: usize,
}
#[derive(Debug, PartialEq)]
pub enum CoordType {
EInt(i64),
EFloat(f32),
EString(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, strum::EnumString)]
#[strum(ascii_case_insensitive)]
pub enum OutputFormat {
#[default]
#[strum(serialize = "geotiff")]
GeoTiff,
#[strum(serialize = "geotiff-overviews", serialize = "geotiff_overviews")]
GeoTiffOverviews,
#[strum(serialize = "cog")]
COG,
}
#[derive(Debug, Clone)]
pub struct OutputConfig {
pub format: OutputFormat,
pub compression: String,
pub overview_resampling: String,
pub overview_levels: Vec<i32>,
}
impl Default for OutputConfig {
fn default() -> Self {
Self {
format: OutputFormat::GeoTiff,
compression: "LZW".to_string(),
overview_resampling: "CUBIC".to_string(),
overview_levels: vec![2, 4, 8, 16, 32],
}
}
}