use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "surtgis")]
#[command(author, version, about = "High-performance geospatial analysis", long_about = None)]
#[command(allow_negative_numbers = true)]
pub struct Cli {
#[arg(short, long, global = true)]
pub verbose: bool,
#[arg(long, global = true)]
pub compress: bool,
#[arg(long, global = true)]
pub streaming: bool,
#[arg(long, global = true)]
pub max_memory: Option<String>,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
Info {
input: PathBuf,
},
Terrain {
#[command(subcommand)]
algorithm: TerrainCommands,
},
Hydrology {
#[command(subcommand)]
algorithm: HydrologyCommands,
},
Imagery {
#[command(subcommand)]
algorithm: ImageryCommands,
},
Morphology {
#[command(subcommand)]
algorithm: MorphologyCommands,
},
Landscape {
#[command(subcommand)]
algorithm: LandscapeCommands,
},
Extract {
#[arg(long)]
features_dir: PathBuf,
#[arg(long)]
points: PathBuf,
#[arg(long)]
target: String,
output: PathBuf,
},
Clip {
input: PathBuf,
#[arg(long)]
polygon: Option<PathBuf>,
#[arg(long)]
bbox: Option<String>,
output: PathBuf,
},
Rasterize {
input: PathBuf,
output: PathBuf,
#[arg(long)]
reference: PathBuf,
#[arg(long)]
attribute: Option<String>,
},
Resample {
input: PathBuf,
output: PathBuf,
#[arg(long)]
reference: PathBuf,
#[arg(short, long, default_value = "bilinear")]
method: String,
},
Mosaic {
#[arg(short, long, required = true)]
input: Vec<PathBuf>,
output: PathBuf,
},
#[cfg(feature = "cloud")]
Cog {
#[command(subcommand)]
action: CogCommands,
},
#[cfg(feature = "cloud")]
Stac {
#[command(subcommand)]
action: StacCommands,
},
Pipeline {
#[command(subcommand)]
action: PipelineCommands,
},
Vector {
#[command(subcommand)]
action: VectorCommands,
},
Interpolation {
#[command(subcommand)]
action: InterpolationCommands,
},
Temporal {
#[command(subcommand)]
action: TemporalCommands,
},
Classification {
#[command(subcommand)]
algorithm: ClassificationCommands,
},
Texture {
#[command(subcommand)]
algorithm: TextureCommands,
},
Statistics {
#[command(subcommand)]
algorithm: StatisticsCommands,
},
#[cfg(feature = "ml")]
Ml {
#[command(subcommand)]
action: MlCommands,
},
}
#[derive(Subcommand)]
pub enum TerrainCommands {
Slope {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "degrees")]
units: String,
#[arg(short, long, default_value = "1.0")]
z_factor: f64,
},
Aspect {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "degrees")]
format: String,
},
Hillshade {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "315")]
azimuth: f64,
#[arg(short = 'l', long, default_value = "45")]
altitude: f64,
#[arg(short, long, default_value = "1.0")]
z_factor: f64,
},
Curvature {
input: PathBuf,
output: PathBuf,
#[arg(short = 't', long, default_value = "general")]
curvature_type: String,
#[arg(short, long, default_value = "1.0")]
z_factor: f64,
},
Tpi {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "1")]
radius: usize,
},
Tri {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "1")]
radius: usize,
},
Landform {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "3")]
small_radius: usize,
#[arg(long, default_value = "10")]
large_radius: usize,
#[arg(long, default_value = "1.0")]
threshold: f64,
#[arg(long, default_value = "6.0")]
slope_threshold: f64,
},
Geomorphons {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "10")]
radius: usize,
#[arg(short, long, default_value = "1.0")]
flatness: f64,
},
Northness {
input: PathBuf,
output: PathBuf,
},
Eastness {
input: PathBuf,
output: PathBuf,
},
OpennessPositive {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "10")]
radius: usize,
#[arg(short, long, default_value = "8")]
directions: usize,
},
OpennessNegative {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "10")]
radius: usize,
#[arg(short, long, default_value = "8")]
directions: usize,
},
Svf {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "10")]
radius: usize,
#[arg(short, long, default_value = "16")]
directions: usize,
},
Mrvbf {
input: PathBuf,
output: PathBuf,
#[arg(long)]
mrrtf_output: Option<PathBuf>,
},
Dev {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "10")]
radius: usize,
},
Vrm {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "1")]
radius: usize,
},
AdvancedCurvature {
input: PathBuf,
output: PathBuf,
#[arg(short = 't', long, default_value = "mean_h")]
curvature_type: String,
},
Viewshed {
input: PathBuf,
output: PathBuf,
#[arg(long)]
observer_row: usize,
#[arg(long)]
observer_col: usize,
#[arg(long, default_value = "1.8")]
observer_height: f64,
#[arg(long, default_value = "0.0")]
target_height: f64,
#[arg(long, default_value = "0")]
max_radius: usize,
},
Convergence {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "3")]
radius: usize,
},
MultiHillshade {
input: PathBuf,
output: PathBuf,
},
LsFactor {
#[arg(long)]
flow_acc: PathBuf,
#[arg(long)]
slope: PathBuf,
output: PathBuf,
#[arg(long, default_value = "1.0")]
cell_size: f64,
},
ValleyDepth {
input: PathBuf,
output: PathBuf,
},
RelativeSlopePosition {
#[arg(long)]
hand: PathBuf,
#[arg(long)]
valley_depth: PathBuf,
output: PathBuf,
},
SurfaceAreaRatio {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "1")]
radius: usize,
},
All {
input: PathBuf,
#[arg(short, long)]
outdir: PathBuf,
},
SolarRadiation {
input: PathBuf,
output: PathBuf,
#[arg(long)]
day: u32,
#[arg(long)]
hour: f64,
#[arg(long, allow_hyphen_values = true)]
latitude: f64,
},
SolarRadiationAnnual {
input: PathBuf,
output: PathBuf,
#[arg(long, allow_hyphen_values = true)]
latitude: f64,
},
ContourLines {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "100")]
interval: f64,
#[arg(long, default_value = "0")]
base: f64,
},
CostDistance {
input: PathBuf,
#[arg(long)]
sources: PathBuf,
output: PathBuf,
},
ShapeIndex {
input: PathBuf,
output: PathBuf,
},
Curvedness {
input: PathBuf,
output: PathBuf,
},
GaussianSmoothing {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "1.0")]
sigma: f64,
#[arg(long)]
radius: Option<usize>,
},
FeaturePreservingSmoothing {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "1.0")]
strength: f64,
#[arg(long, default_value = "3")]
iterations: usize,
},
WindExposure {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "270")]
direction: f64,
#[arg(long, default_value = "100")]
radius: usize,
},
HorizonAngle {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "180")]
azimuth: f64,
#[arg(long, default_value = "100")]
radius: usize,
},
AccumulationZones {
input: PathBuf,
output: PathBuf,
},
Spi {
#[arg(long)]
flow_acc: PathBuf,
#[arg(long)]
slope: PathBuf,
output: PathBuf,
},
Sti {
#[arg(long)]
flow_acc: PathBuf,
#[arg(long)]
slope: PathBuf,
output: PathBuf,
},
Twi {
#[arg(long)]
flow_acc: PathBuf,
#[arg(long)]
slope: PathBuf,
output: PathBuf,
},
LogTransform {
input: PathBuf,
output: PathBuf,
},
Uncertainty {
input: PathBuf,
#[arg(short, long)]
outdir: PathBuf,
#[arg(long, default_value = "1.0")]
error_std: f64,
#[arg(long, default_value = "100")]
n_simulations: usize,
},
ViewshedPderl {
input: PathBuf,
output: PathBuf,
#[arg(long)]
row: usize,
#[arg(long)]
col: usize,
#[arg(long, default_value = "1.7")]
height: f64,
},
ViewshedXdraw {
input: PathBuf,
output: PathBuf,
#[arg(long)]
row: usize,
#[arg(long)]
col: usize,
#[arg(long, default_value = "1.7")]
height: f64,
},
ViewshedMultiple {
input: PathBuf,
output: PathBuf,
#[arg(long)]
observers: String,
#[arg(long, default_value = "1.7")]
height: f64,
},
HypsometricHillshade {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "315")]
azimuth: f64,
#[arg(short = 'l', long, default_value = "45")]
altitude: f64,
#[arg(short, long, default_value = "1.0")]
z_factor: f64,
},
ElevRelative {
input: PathBuf,
output: PathBuf,
},
DiffFromMean {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "10")]
radius: usize,
},
PercentElevRange {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "10")]
radius: usize,
},
ElevAbovePit {
input: PathBuf,
output: PathBuf,
},
CircularVarianceAspect {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "3")]
radius: usize,
},
Neighbours {
input: PathBuf,
#[arg(short, long)]
output: PathBuf,
#[arg(long)]
stat: Option<String>,
},
Pennock {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "3.0")]
slope_threshold: f64,
#[arg(long, default_value = "0.1")]
curv_threshold: f64,
},
EdgeDensity {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "3")]
radius: usize,
#[arg(short, long, default_value = "0.5")]
threshold: f64,
},
RelativeAspect {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "50")]
sigma: f64,
},
NormalDeviation {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "3")]
radius: usize,
},
SphericalStdDev {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "3")]
radius: usize,
},
DirectionalRelief {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "10")]
radius: usize,
#[arg(short, long, default_value = "0")]
azimuth: f64,
},
DownslopeIndex {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "2.0")]
drop: f64,
},
MaxBranchLength {
input: PathBuf,
output: PathBuf,
},
}
#[derive(Subcommand)]
pub enum HydrologyCommands {
FillSinks {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "0.01")]
min_slope: f64,
},
FlowDirection {
input: PathBuf,
output: PathBuf,
},
FlowAccumulation {
input: PathBuf,
output: PathBuf,
},
Watershed {
input: PathBuf,
output: PathBuf,
#[arg(long)]
pour_points: String,
},
PriorityFlood {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "0.0001")]
epsilon: f64,
},
Breach {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "100.0")]
max_depth: f64,
#[arg(long, default_value = "1000")]
max_length: usize,
#[arg(long)]
fill_remaining: bool,
},
FlowDirectionDinf {
input: PathBuf,
output: PathBuf,
},
FlowAccumulationMfd {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "1.1")]
exponent: f64,
},
Twi {
input: PathBuf,
output: PathBuf,
},
Hand {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "1000")]
threshold: f64,
},
StreamNetwork {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "1000")]
threshold: f64,
},
DrainageDensity {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "10")]
radius: usize,
#[arg(long, default_value = "1.0")]
cell_size: f64,
},
HypsometricIntegral {
#[arg(long)]
dem: PathBuf,
#[arg(long)]
watersheds: PathBuf,
},
SedimentConnectivity {
#[arg(long)]
slope: PathBuf,
#[arg(long)]
flow_acc: PathBuf,
#[arg(long)]
flow_dir: PathBuf,
output: PathBuf,
#[arg(long, default_value = "1000")]
threshold: f64,
},
BasinMorphometry {
input: PathBuf,
#[arg(long, default_value = "1.0")]
cell_size: f64,
},
All {
input: PathBuf,
#[arg(short, long)]
outdir: PathBuf,
#[arg(long, default_value = "1000")]
threshold: f64,
},
}
#[derive(Subcommand)]
pub enum ImageryCommands {
Ndvi {
#[arg(long)]
nir: PathBuf,
#[arg(long)]
red: PathBuf,
output: PathBuf,
},
Ndwi {
#[arg(long)]
green: PathBuf,
#[arg(long)]
nir: PathBuf,
output: PathBuf,
},
Mndwi {
#[arg(long)]
green: PathBuf,
#[arg(long)]
swir: PathBuf,
output: PathBuf,
},
Nbr {
#[arg(long)]
nir: PathBuf,
#[arg(long)]
swir: PathBuf,
output: PathBuf,
},
Savi {
#[arg(long)]
nir: PathBuf,
#[arg(long)]
red: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "0.5")]
l_factor: f64,
},
Evi {
#[arg(long)]
nir: PathBuf,
#[arg(long)]
red: PathBuf,
#[arg(long)]
blue: PathBuf,
output: PathBuf,
},
Bsi {
#[arg(long)]
swir: PathBuf,
#[arg(long)]
red: PathBuf,
#[arg(long)]
nir: PathBuf,
#[arg(long)]
blue: PathBuf,
output: PathBuf,
},
BandMath {
#[arg(short)]
a: PathBuf,
#[arg(short)]
b: PathBuf,
output: PathBuf,
#[arg(long)]
op: String,
},
Calc {
#[arg(short, long)]
expression: String,
#[arg(short, long, value_name = "NAME=FILE")]
band: Vec<String>,
output: PathBuf,
},
Evi2 {
#[arg(long)]
nir: PathBuf,
#[arg(long)]
red: PathBuf,
output: PathBuf,
},
Gndvi {
#[arg(long)]
nir: PathBuf,
#[arg(long)]
green: PathBuf,
output: PathBuf,
},
Ngrdi {
#[arg(long)]
green: PathBuf,
#[arg(long)]
red: PathBuf,
output: PathBuf,
},
Reci {
#[arg(long)]
nir: PathBuf,
#[arg(long)]
red_edge: PathBuf,
output: PathBuf,
},
Ndre {
#[arg(long)]
nir: PathBuf,
#[arg(long)]
red_edge: PathBuf,
output: PathBuf,
},
Ndsi {
#[arg(long)]
green: PathBuf,
#[arg(long)]
swir: PathBuf,
output: PathBuf,
},
Ndmi {
#[arg(long)]
nir: PathBuf,
#[arg(long)]
swir: PathBuf,
output: PathBuf,
},
Ndbi {
#[arg(long)]
swir: PathBuf,
#[arg(long)]
nir: PathBuf,
output: PathBuf,
},
Msavi {
#[arg(long)]
nir: PathBuf,
#[arg(long)]
red: PathBuf,
output: PathBuf,
},
Reclassify {
input: PathBuf,
output: PathBuf,
#[arg(long, value_name = "MIN,MAX,VALUE")]
class: Vec<String>,
#[arg(long, default_value = "NaN")]
default: String,
},
MedianComposite {
#[arg(short, long)]
input: Vec<PathBuf>,
output: PathBuf,
},
Dnbr {
#[arg(long)]
pre_nir: PathBuf,
#[arg(long)]
pre_swir: PathBuf,
#[arg(long)]
post_nir: PathBuf,
#[arg(long)]
post_swir: PathBuf,
output: PathBuf,
#[arg(long)]
severity_output: Option<PathBuf>,
},
CloudMask {
input: PathBuf,
#[arg(long)]
scl: PathBuf,
output: PathBuf,
#[arg(long, default_value = "4,5,6,11")]
keep: String,
},
}
#[derive(Subcommand)]
pub enum MorphologyCommands {
Erode {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "square")]
shape: String,
#[arg(short, long, default_value = "1")]
radius: usize,
},
Dilate {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "square")]
shape: String,
#[arg(short, long, default_value = "1")]
radius: usize,
},
Opening {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "square")]
shape: String,
#[arg(short, long, default_value = "1")]
radius: usize,
},
Closing {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "square")]
shape: String,
#[arg(short, long, default_value = "1")]
radius: usize,
},
Gradient {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "square")]
shape: String,
#[arg(short, long, default_value = "1")]
radius: usize,
},
TopHat {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "square")]
shape: String,
#[arg(short, long, default_value = "1")]
radius: usize,
},
BlackHat {
input: PathBuf,
output: PathBuf,
#[arg(long, default_value = "square")]
shape: String,
#[arg(short, long, default_value = "1")]
radius: usize,
},
}
#[derive(Subcommand)]
pub enum LandscapeCommands {
LabelPatches {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "4")]
connectivity: u8,
},
PatchMetrics {
input: PathBuf,
#[arg(short, long)]
output: PathBuf,
#[arg(short, long, default_value = "4")]
connectivity: u8,
},
ClassMetrics {
input: PathBuf,
#[arg(short, long, default_value = "4")]
connectivity: u8,
},
LandscapeMetrics {
input: PathBuf,
},
Analyze {
input: PathBuf,
#[arg(long)]
output_labels: Option<PathBuf>,
#[arg(long)]
output_csv: Option<PathBuf>,
#[arg(short, long, default_value = "4")]
connectivity: u8,
},
}
#[cfg(feature = "cloud")]
#[derive(Subcommand)]
pub enum CogCommands {
Info {
url: String,
},
Fetch {
url: String,
output: PathBuf,
#[arg(long)]
bbox: String,
#[arg(long)]
overview: Option<usize>,
},
Slope {
url: String,
output: PathBuf,
#[arg(long)]
bbox: String,
#[arg(short, long, default_value = "degrees")]
units: String,
#[arg(short, long, default_value = "1.0")]
z_factor: f64,
},
Aspect {
url: String,
output: PathBuf,
#[arg(long)]
bbox: String,
#[arg(short, long, default_value = "degrees")]
format: String,
},
Hillshade {
url: String,
output: PathBuf,
#[arg(long)]
bbox: String,
#[arg(short, long, default_value = "315")]
azimuth: f64,
#[arg(short = 'l', long, default_value = "45")]
altitude: f64,
#[arg(short, long, default_value = "1.0")]
z_factor: f64,
},
Tpi {
url: String,
output: PathBuf,
#[arg(long)]
bbox: String,
#[arg(short, long, default_value = "1")]
radius: usize,
},
FillSinks {
url: String,
output: PathBuf,
#[arg(long)]
bbox: String,
#[arg(long, default_value = "0.01")]
min_slope: f64,
},
}
#[cfg(feature = "cloud")]
#[derive(Subcommand)]
pub enum StacCommands {
Search {
#[arg(long, default_value = "es")]
catalog: String,
#[arg(long)]
bbox: Option<String>,
#[arg(long)]
datetime: Option<String>,
#[arg(long)]
collections: Option<String>,
#[arg(long, default_value = "10")]
limit: u32,
},
Fetch {
#[arg(long, default_value = "es")]
catalog: String,
#[arg(long)]
bbox: String,
#[arg(long)]
collection: String,
#[arg(long)]
asset: Option<String>,
#[arg(long)]
datetime: Option<String>,
#[arg(long)]
variable: Option<String>,
#[arg(long, default_value = "first")]
time_step: String,
output: PathBuf,
},
FetchMosaic {
#[arg(long, default_value = "es")]
catalog: String,
#[arg(long)]
bbox: String,
#[arg(long)]
collection: String,
#[arg(long)]
asset: Option<String>,
#[arg(long)]
datetime: Option<String>,
#[arg(long, default_value = "20")]
max_items: u32,
output: PathBuf,
},
Composite {
#[arg(long, default_value = "es")]
catalog: String,
#[arg(long)]
bbox: String,
#[arg(long)]
collection: String,
#[arg(long)]
asset: String,
#[arg(long)]
datetime: String,
#[arg(long, default_value = "12")]
max_scenes: usize,
#[arg(long, default_value = "scl")]
scl_asset: String,
#[arg(long, default_value = "4,5,6,11")]
scl_keep: String,
#[arg(long)]
align_to: Option<PathBuf>,
#[arg(long, default_value = "prefix")]
naming: String,
#[arg(long)]
cache: bool,
#[arg(long, default_value = "512")]
strip_rows: usize,
output: PathBuf,
},
TimeSeries {
#[arg(long, default_value = "es")]
catalog: String,
#[arg(long)]
bbox: String,
#[arg(long)]
collection: String,
#[arg(long)]
asset: String,
#[arg(long)]
datetime: String,
#[arg(long, default_value = "monthly")]
interval: String,
#[arg(long, default_value = "scl")]
scl_asset: String,
#[arg(long, default_value = "8")]
max_scenes: usize,
#[arg(long)]
align_to: Option<PathBuf>,
output: PathBuf,
},
DownloadClimate {
#[arg(long, default_value = "pc")]
catalog: String,
#[arg(long)]
bbox: String,
#[arg(long)]
collection: String,
#[arg(long)]
variable: String,
#[arg(long)]
datetime: String,
#[arg(long, default_value = "monthly-mean")]
aggregate: String,
output: PathBuf,
},
ListCatalogs {
#[arg(long)]
search: Option<String>,
},
ListCollections {
#[arg(long, default_value = "pc")]
catalog: String,
},
}
#[derive(Subcommand)]
pub enum PipelineCommands {
Susceptibility {
#[arg(long)]
dem: String,
#[arg(long)]
s2: String,
#[arg(long)]
bbox: String,
#[arg(long)]
datetime: String,
#[arg(long)]
outdir: PathBuf,
#[arg(long, default_value = "12")]
max_scenes: usize,
#[arg(long, default_value = "4,5,6,11")]
scl_keep: String,
},
#[command(about = "Generate geomorphometric feature stack from DEM")]
Features {
input: PathBuf,
#[arg(short, long)]
outdir: PathBuf,
#[arg(long)]
skip_hydrology: bool,
#[arg(long)]
extras: bool,
},
#[cfg(feature = "cloud")]
Temporal {
#[arg(long, default_value = "es")]
catalog: String,
#[arg(long)]
bbox: String,
#[arg(long)]
collection: String,
#[arg(long)]
datetime: String,
#[arg(long, default_value = "monthly")]
interval: String,
#[arg(long)]
index: String,
#[arg(long)]
analysis: String,
#[arg(long, default_value = "linear")]
method: String,
#[arg(long, default_value = "0.5")]
threshold: f64,
#[arg(long, default_value = "5")]
smooth: usize,
#[arg(long, default_value = "mean,std,min,max,count")]
stats: String,
#[arg(long, default_value = "8")]
max_scenes: usize,
#[arg(long)]
outdir: PathBuf,
#[arg(long)]
keep_intermediates: bool,
#[arg(long)]
align_to: Option<PathBuf>,
},
}
#[derive(Subcommand)]
pub enum TemporalCommands {
Stats {
#[arg(short, long, required = true)]
input: Vec<PathBuf>,
#[arg(short, long)]
outdir: PathBuf,
#[arg(long, default_value = "mean,std,min,max,count")]
stats: String,
},
Trend {
#[arg(short, long, required = true)]
input: Vec<PathBuf>,
#[arg(short, long)]
outdir: PathBuf,
#[arg(long, default_value = "linear")]
method: String,
#[arg(long)]
times: Option<String>,
},
Change {
#[arg(long)]
before: PathBuf,
#[arg(long)]
after: PathBuf,
output: PathBuf,
#[arg(long, default_value = "-1.0")]
decrease_threshold: f64,
#[arg(long, default_value = "1.0")]
increase_threshold: f64,
},
Anomaly {
#[arg(long, required = true)]
reference: Vec<PathBuf>,
#[arg(long, required = true)]
target: Vec<PathBuf>,
#[arg(short, long)]
outdir: PathBuf,
#[arg(long, default_value = "zscore")]
method: String,
},
Phenology {
#[arg(short, long, required = true)]
input: Vec<PathBuf>,
#[arg(short, long)]
outdir: PathBuf,
#[arg(long)]
doys: Option<String>,
#[arg(long, default_value = "0.5")]
threshold: f64,
#[arg(long, default_value = "5")]
smooth: usize,
},
}
#[derive(Subcommand)]
pub enum VectorCommands {
Intersection {
input_a: PathBuf,
input_b: PathBuf,
output: PathBuf,
},
Union {
input_a: PathBuf,
input_b: PathBuf,
output: PathBuf,
},
Difference {
input_a: PathBuf,
input_b: PathBuf,
output: PathBuf,
},
SymDifference {
input_a: PathBuf,
input_b: PathBuf,
output: PathBuf,
},
Dissolve {
input: PathBuf,
output: PathBuf,
},
Buffer {
input: PathBuf,
#[arg(long)]
distance: f64,
#[arg(long, default_value = "8")]
segments: usize,
output: PathBuf,
},
}
#[derive(Subcommand)]
pub enum InterpolationCommands {
Variogram {
points: PathBuf,
#[arg(long)]
attribute: String,
#[arg(long, default_value = "15")]
bins: usize,
#[arg(long)]
max_lag: Option<f64>,
output: PathBuf,
},
Kriging {
points: PathBuf,
#[arg(long)]
attribute: String,
#[arg(long)]
reference: PathBuf,
#[arg(long, default_value = "spherical")]
model: String,
#[arg(long)]
range: Option<f64>,
#[arg(long)]
sill: Option<f64>,
#[arg(long, default_value = "0")]
nugget: f64,
#[arg(long, default_value = "16")]
max_neighbors: usize,
output: PathBuf,
},
UniversalKriging {
points: PathBuf,
#[arg(long)]
attribute: String,
#[arg(long)]
reference: PathBuf,
#[arg(long, default_value = "linear")]
drift: String,
#[arg(long, default_value = "spherical")]
model: String,
#[arg(long, default_value = "16")]
max_neighbors: usize,
output: PathBuf,
},
RegressionKriging {
points: PathBuf,
#[arg(long)]
attribute: String,
#[arg(long)]
features: PathBuf,
#[arg(long)]
reference: PathBuf,
#[arg(long, default_value = "spherical")]
model: String,
output: PathBuf,
},
Idw {
points: PathBuf,
#[arg(long)]
attribute: String,
#[arg(long)]
reference: PathBuf,
#[arg(long, default_value = "2.0")]
power: f64,
#[arg(long)]
max_radius: Option<f64>,
#[arg(long)]
max_points: Option<usize>,
output: PathBuf,
},
NearestNeighbor {
points: PathBuf,
#[arg(long)]
attribute: String,
#[arg(long)]
reference: PathBuf,
#[arg(long)]
max_radius: Option<f64>,
output: PathBuf,
},
NaturalNeighbor {
points: PathBuf,
#[arg(long)]
attribute: String,
#[arg(long)]
reference: PathBuf,
output: PathBuf,
},
Tps {
points: PathBuf,
#[arg(long)]
attribute: String,
#[arg(long)]
reference: PathBuf,
#[arg(long, default_value = "0.0")]
smoothing: f64,
output: PathBuf,
},
Tin {
points: PathBuf,
#[arg(long)]
attribute: String,
#[arg(long)]
reference: PathBuf,
output: PathBuf,
},
}
#[cfg(feature = "ml")]
#[derive(Subcommand)]
pub enum MlCommands {
ExtractSamples {
#[arg(long)]
features_dir: PathBuf,
#[arg(long)]
points: PathBuf,
#[arg(long)]
target: String,
output: PathBuf,
},
Train {
input: PathBuf,
#[arg(long)]
target: String,
#[arg(long, default_value = "rf")]
model: String,
#[arg(long, default_value = "100")]
n_estimators: usize,
#[arg(long, default_value = "5")]
folds: usize,
#[arg(long, default_value = "classification")]
task: String,
output: PathBuf,
},
Predict {
#[arg(long)]
model: PathBuf,
#[arg(long)]
features_dir: PathBuf,
output: PathBuf,
},
Benchmark {
input: PathBuf,
#[arg(long)]
target: String,
#[arg(long, default_value = "5")]
folds: usize,
#[arg(long, default_value = "classification")]
task: String,
},
}
#[derive(Subcommand)]
pub enum ClassificationCommands {
Kmeans {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "5")]
classes: usize,
#[arg(long, default_value = "100")]
max_iter: usize,
#[arg(long, default_value = "0.001")]
convergence: f64,
#[arg(long, default_value = "42")]
seed: u64,
},
Isodata {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "5")]
classes: usize,
#[arg(long, default_value = "2")]
min_classes: usize,
#[arg(long, default_value = "10")]
max_classes: usize,
#[arg(long, default_value = "50")]
max_iter: usize,
},
Pca {
#[arg(long)]
bands: String,
output: PathBuf,
#[arg(short, long)]
components: Option<usize>,
},
MinDistance {
input: PathBuf,
output: PathBuf,
#[arg(long)]
training: PathBuf,
},
MaxLikelihood {
input: PathBuf,
output: PathBuf,
#[arg(long)]
training: PathBuf,
},
}
#[derive(Subcommand)]
pub enum TextureCommands {
Glcm {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "contrast")]
texture: String,
#[arg(short, long, default_value = "3")]
radius: usize,
#[arg(long, default_value = "32")]
levels: usize,
},
Sobel {
input: PathBuf,
output: PathBuf,
},
Laplacian {
input: PathBuf,
output: PathBuf,
},
}
#[derive(Subcommand)]
pub enum StatisticsCommands {
Focal {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "mean")]
stat: String,
#[arg(short, long, default_value = "3")]
radius: usize,
#[arg(long)]
circular: bool,
},
Zonal {
input: PathBuf,
#[arg(long)]
zones: PathBuf,
output: PathBuf,
},
ZonalRaster {
input: PathBuf,
#[arg(long)]
zones: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "mean")]
stat: String,
},
MoransI {
input: PathBuf,
},
GetisOrd {
input: PathBuf,
output: PathBuf,
#[arg(short, long, default_value = "3")]
radius: usize,
},
}