use super::Extension;
pub use crate::{DataType, Statistics};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct Raster {
pub bands: Vec<Band>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct Band {
#[serde(skip_serializing_if = "Option::is_none")]
pub nodata: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling: Option<Sampling>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_type: Option<DataType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bits_per_sample: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spatial_resolution: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub statistics: Option<Statistics>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scale: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub histogram: Option<Histogram>,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Sampling {
Area,
Point,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Histogram {
pub count: u64,
pub min: f64,
pub max: f64,
pub buckets: Vec<u64>,
}
impl Extension for Raster {
const IDENTIFIER: &'static str = "https://stac-extensions.github.io/raster/v1.1.0/schema.json";
const PREFIX: &'static str = "raster";
}
impl Raster {
pub fn is_empty(&self) -> bool {
self.bands.is_empty()
}
}
#[cfg(feature = "gdal")]
impl From<gdal::raster::GdalDataType> for DataType {
fn from(value: gdal::raster::GdalDataType) -> Self {
use gdal::raster::GdalDataType;
match value {
GdalDataType::Unknown => DataType::Other,
#[cfg(gdal_has_int8)]
GdalDataType::Int8 => DataType::Int8,
GdalDataType::Int16 => DataType::Int16,
GdalDataType::Int32 => DataType::Int32,
#[cfg(gdal_has_int64)]
GdalDataType::Int64 => DataType::Int64,
GdalDataType::UInt8 => DataType::UInt8,
GdalDataType::UInt16 => DataType::UInt16,
GdalDataType::UInt32 => DataType::UInt32,
#[cfg(gdal_has_uint64)]
GdalDataType::UInt64 => DataType::UInt64,
GdalDataType::Float32 => DataType::Float32,
GdalDataType::Float64 => DataType::Float64,
}
}
}
#[cfg(feature = "gdal")]
impl From<gdal::raster::StatisticsAll> for Statistics {
fn from(value: gdal::raster::StatisticsAll) -> Self {
Statistics {
minimum: Some(value.min),
maximum: Some(value.max),
mean: Some(value.mean),
stddev: Some(value.std_dev),
valid_percent: None,
}
}
}