Source code for satorbis_kit.visualization.config

"""Configuration classes for STAC visualization."""

from dataclasses import dataclass, field
from typing import Dict, List, Optional


[docs] @dataclass class TiTilerConfig: """Configuration for TiTiler-pgSTAC endpoint. Attributes: endpoint: Base URL of the TiTiler-pgSTAC server (e.g., 'https://dev.rs.satsure.co/titiler') api_key: Optional API key for authentication timeout: Request timeout in seconds tile_matrix_set: Tile matrix set (default: WebMercatorQuad) Example: >>> config = TiTilerConfig( ... endpoint='https://dev.rs.satsure.co/titiler', ... api_key='your-api-key' ... ) """ endpoint: str = "https://dev.rs.satsure.co/titiler" api_key: Optional[str] = None timeout: int = 30 tile_matrix_set: str = "WebMercatorQuad"
[docs] def get_tile_url(self, collection: str, item_id: str) -> str: """Get the tile URL for a STAC item. Returns URL pattern: /collections/{collection}/items/{item_id}/tiles/WebMercatorQuad/{z}/{x}/{y} Args: collection: STAC collection ID item_id: STAC item ID Returns: Tile URL template """ return ( f"{self.endpoint.rstrip('/')}/collections/{collection}/items/{item_id}/" f"tiles/{self.tile_matrix_set}/{{z}}/{{x}}/{{y}}" )
[docs] def get_headers(self) -> Dict[str, str]: """Get headers for API requests.""" headers = {"Content-Type": "application/json"} if self.api_key: headers["Authorization"] = f"Bearer {self.api_key}" return headers
[docs] @dataclass class VisualizationConfig: """Configuration for STAC visualization. Attributes: titiler: TiTiler-pgSTAC server configuration stac_api_url: STAC API base URL default_center: Default map center [lat, lon] default_zoom: Default map zoom level basemap: Default basemap show_bounds: Show item bounds on map show_metadata: Show metadata popups opacity: Default layer opacity (0-1) Example: >>> config = VisualizationConfig( ... titiler=TiTilerConfig(endpoint='https://dev.rs.satsure.co/titiler'), ... stac_api_url='http://localhost:8080', ... default_zoom=10 ... ) """ titiler: TiTilerConfig = field(default_factory=TiTilerConfig) stac_api_url: Optional[str] = None # Optional - only for collection search default_center: List[float] = field(default_factory=lambda: [0, 0]) default_zoom: int = 4 basemap: str = "OpenStreetMap" show_bounds: bool = False show_metadata: bool = True opacity: float = 0.8 # Common visualization presets PRESETS = { "rgb": { "assets": "red,green,blue", "rescale": "0,3000", "color_formula": "Gamma RGB 3.5 Saturation 1.7 Sigmoidal RGB 15 0.35", }, "ndvi": { "assets": "nir,red", "expression": "(nir-red)/(nir+red)", "rescale": "-1,1", "colormap_name": "rdylgn", }, "ndwi": { "assets": "green,nir", "expression": "(green-nir)/(green+nir)", "rescale": "-1,1", "colormap_name": "blues", }, "false_color": { "assets": "nir,red,green", "rescale": "0,3000", "color_formula": "Gamma RGB 2.5", }, }
[docs] def get_preset(self, name: str) -> Dict[str, str]: """Get a visualization preset by name. Args: name: Preset name ('rgb', 'ndvi', 'ndwi', 'false_color') Returns: Dictionary of TiTiler parameters Raises: KeyError: If preset name doesn't exist """ if name not in self.PRESETS: raise KeyError(f"Unknown preset '{name}'. Available: {list(self.PRESETS.keys())}") return self.PRESETS[name].copy()