--- name: imagery-provider-adaptation description: "Imagery provider adaptation skill for HASTE. Encapsulates provider-specific logic for satellite imagery sources (Planet, Vantor, Airbus, etc.). Use when: 'new imagery provider', 'add source type', 'satellite provider', 'Planet', 'Vantor', 'Airbus', 'Pleiades', 'WorldView', 'SkySat', 'imagery ingestion', 'provider adapter'." source: "HASTE imagery processing pipeline, satellite provider documentation" domain: "geospatial" level: "advanced" agents: ["gis", "backend-dev"] created_date: "2026-04-27" last_validated: "" validated_by: "" status: "draft" --- # Imagery Provider Adaptation ## Overview Structured process for adding new satellite imagery providers to HASTE. Each provider has different data formats, coordinate systems, APIs, band configurations, and delivery methods. This skill encapsulates the provider-specific logic needed to adapt a new source. ## Key Concepts ### Current Providers | Provider | Satellites | Format | Bands | Delivery | |----------|-----------|--------|-------|----------| | Vantor | WorldView-2/3/4, GeoEye-1 | GeoTIFF | 4-8 bands (BGRN + extras) | S3, STAC, Direct URL | | Planet | PlanetScope, SkySat | GeoTIFF, COG | 4 bands (BGRN) | Planet API, S3 | | Airbus | Pleiades, Pleiades Neo, SPOT | GeoTIFF, DIMAP | 4 bands (BGRN) | OneAtlas, S3 | ### Provider Adapter Components Each new provider requires: 1. **Source Type Definition** — Model configuration in `hastegeo.core.models` 2. **Download Handler** — Provider-specific authentication and download logic 3. **Band Mapping** — Map provider bands to HASTE's expected band order 4. **Metadata Parser** — Extract spatial metadata from provider-specific formats 5. **Preprocessing Rules** — Resolution normalization, radiometric correction 6. **Tests** — Integration tests with sample provider data ## Patterns & Techniques ### Adding a New Provider: Step-by-Step **Step 1: Define source type** Add to the source type configuration in `hastegeo.core.models`: ```python # New source type with provider-specific configuration class NewProviderConfig(BaseModel): provider_name: str api_url: str band_order: list[str] # e.g., ["B", "G", "R", "NIR"] default_crs: str # e.g., "EPSG:4326" tile_size: int # e.g., 256 ``` **Step 2: Implement download handler** In `hastegeo.core.processors.imagery`: ```python # Handle provider-specific authentication and URL patterns # Use requests with proper auth (API key, OAuth, etc.) # Stream large files to avoid memory issues # Validate downloaded file integrity ``` **Step 3: Implement band mapping** ```python # Map provider bands to HASTE standard order # HASTE expects: [Blue, Green, Red, NIR] for 4-band # Handle extra bands (e.g., coastal, red-edge, SWIR) # Handle missing bands (e.g., panchromatic only) ``` **Step 4: Implement preprocessing** ```python # 1. Validate CRS — reproject if needed # 2. Normalize resolution — resample to target GSD # 3. Apply radiometric correction if needed # 4. Generate COG with internal tiling and overviews # 5. Validate output with rasterio ``` **Step 5: Add to imagery processor** Update `ImageryPreProcessor` to route to the new handler based on source type. **Step 6: Write tests** ```python # Test with real sample data (small AOI, public data preferred) # Verify CRS preservation # Verify band order mapping # Verify COG compliance # Verify metadata extraction ``` ### Provider-Specific Gotchas | Provider | Gotcha | Mitigation | |----------|--------|------------| | Vantor | Multiple UTM zones in a single order | Check CRS per file, reproject to consistent zone | | Planet | UDM2 quality masks delivered separately | Download and apply quality mask before processing | | Airbus | DIMAP format metadata | Parse XML metadata alongside GeoTIFF | | All | Different nodata conventions | Standardize nodata to 0 or NaN during preprocessing | ## Decision Framework | Scenario | Approach | |----------|----------| | Provider uses standard GeoTIFF | Minimal adapter — mostly URL/auth handling | | Provider uses proprietary format | Full adapter — format conversion + metadata extraction | | Provider delivers via STAC | Use existing STAC client, add provider-specific auth | | Provider requires API key | Store in Config, never hardcode | | Provider delivers in tiles | Implement tile stitching before COG generation | ## Quick Reference: COG Output Standard ``` Format: Cloud Optimized GeoTIFF Tiling: 256x256 or 512x512 internal tiles Overviews: Nearest power of 2, down to 256px Compression: LZW or DEFLATE CRS: Preserve source CRS (typically UTM or EPSG:4326) Nodata: 0 for uint8/uint16, NaN for float Bands: Blue, Green, Red, NIR (minimum) ``` ## Common Pitfalls - **Assuming all providers use the same band order** — Always check and map explicitly - **Hardcoding provider URLs/keys** — Use `Config` class - **Ignoring quality masks** — Bad pixels contaminate training data - **Not testing with edge cases** — Antimeridian crossing, polar regions, dateline - **Downloading entire scenes when only a small AOI is needed** — Use provider APIs to clip