Aperture / app /config.py
KSvend
refactor: rename "indicators" to "EO products" throughout
df6bf75
"""Centralized configuration for Aperture."""
from __future__ import annotations
import os
# Per-product native resolutions (meters)
NDVI_RESOLUTION_M: int = 10
WATER_RESOLUTION_M: int = 20
SAR_RESOLUTION_M: int = 10
BUILDUP_RESOLUTION_M: int = 20
TRUECOLOR_RESOLUTION_M: int = 10
# Minimum std thresholds to cap z-scores (avoid division-by-near-zero)
MIN_STD_NDVI: float = 0.02
MIN_STD_WATER: float = 0.01
MIN_STD_SAR: float = 0.5 # dB
MIN_STD_BUILDUP: float = 0.01
# Z-score threshold for significant anomaly
ZSCORE_THRESHOLD: float = 2.0
# Minimum hotspot cluster size in pixels
MIN_CLUSTER_PIXELS: int = 4
# Maximum AOI size in km². Soft limit to prevent excessive processing.
MAX_AOI_KM2: int = int(os.environ.get("APERTURE_MAX_AOI_KM2", "500"))
# openEO backend URL.
OPENEO_BACKEND: str = os.environ.get(
"OPENEO_BACKEND", "openeo.dataspace.copernicus.eu"
)
# CDSE OAuth2 credentials (set as secrets in HF Spaces).
OPENEO_CLIENT_ID: str | None = os.environ.get("OPENEO_CLIENT_ID")
OPENEO_CLIENT_SECRET: str | None = os.environ.get("OPENEO_CLIENT_SECRET")
# Anthropic API key for AOI advisor (Claude-powered region insight).
ANTHROPIC_API_KEY: str | None = os.environ.get("ANTHROPIC_API_KEY")
# Expert weights for the visual overview composite score.
# Normalized to 1.0. Products not selected or skipped are excluded
# and weights are re-normalized.
OVERVIEW_WEIGHTS: dict[str, float] = {
"ndvi": 0.30,
"sar": 0.25,
"water": 0.25,
"buildup": 0.20,
}