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]
@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()