Source code for satorbis_kit.visualization.layers
"""Layer management for STAC visualization."""
import json
from typing import Any, Dict, List, Optional
from .config import VisualizationConfig
[docs]
class STACLayerManager:
"""Manage layers on a STAC visualization map.
This class helps organize and control multiple STAC item layers
on a single map, including layer groups, visibility, and styling.
Attributes:
config: Visualization configuration
layers: Dictionary of managed layers
"""
def __init__(self, config: VisualizationConfig):
"""Initialize the layer manager.
Args:
config: Visualization configuration
"""
self.config = config
self.layers: Dict[str, Dict[str, Any]] = {}
self.layer_groups: Dict[str, List[str]] = {}
[docs]
def add_layer(
self,
layer_id: str,
item: Dict,
tile_url: str,
group: Optional[str] = None,
metadata: Optional[Dict] = None,
) -> None:
"""Add a layer to the manager.
Args:
layer_id: Unique layer identifier
item: STAC item dictionary
tile_url: TiTiler tile URL
group: Optional group name
metadata: Additional metadata
"""
self.layers[layer_id] = {
"item": item,
"tile_url": tile_url,
"group": group,
"metadata": metadata or {},
"visible": True,
}
if group:
if group not in self.layer_groups:
self.layer_groups[group] = []
self.layer_groups[group].append(layer_id)
[docs]
def remove_layer(self, layer_id: str) -> None:
"""Remove a layer from the manager.
Args:
layer_id: Layer identifier to remove
"""
if layer_id in self.layers:
layer = self.layers[layer_id]
if layer["group"]:
self.layer_groups[layer["group"]].remove(layer_id)
del self.layers[layer_id]
[docs]
def toggle_layer(self, layer_id: str) -> bool:
"""Toggle layer visibility.
Args:
layer_id: Layer identifier
Returns:
New visibility state
"""
if layer_id in self.layers:
self.layers[layer_id]["visible"] = not self.layers[layer_id]["visible"]
return self.layers[layer_id]["visible"]
return False
[docs]
def get_layer(self, layer_id: str) -> Optional[Dict]:
"""Get layer information.
Args:
layer_id: Layer identifier
Returns:
Layer dictionary or None
"""
return self.layers.get(layer_id)
[docs]
def get_layers_in_group(self, group: str) -> List[str]:
"""Get all layer IDs in a group.
Args:
group: Group name
Returns:
List of layer IDs
"""
return self.layer_groups.get(group, [])
[docs]
def toggle_group(self, group: str) -> None:
"""Toggle visibility of all layers in a group.
Args:
group: Group name
"""
for layer_id in self.get_layers_in_group(group):
self.toggle_layer(layer_id)
[docs]
def clear_all(self) -> None:
"""Clear all layers."""
self.layers.clear()
self.layer_groups.clear()
[docs]
def get_layer_summary(self) -> Dict[str, Any]:
"""Get summary of all layers.
Returns:
Dictionary with layer statistics
"""
return {
"total_layers": len(self.layers),
"groups": list(self.layer_groups.keys()),
"visible_layers": sum(1 for layer in self.layers.values() if layer["visible"]),
}