2026-01-08 17:13:51 +01:00
|
|
|
|
# sn_basis/functions/ly_metadata_wrapper.py
|
|
|
|
|
|
|
|
|
|
|
|
from typing import Optional, List
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LAYER_TYPE_VECTOR = "vector"
|
|
|
|
|
|
LAYER_TYPE_TABLE = "table"
|
2025-12-19 14:29:52 +01:00
|
|
|
|
|
|
|
|
|
|
|
2026-01-08 17:13:51 +01:00
|
|
|
|
def get_layer_type(layer) -> Optional[str]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Gibt den Layer-Typ zurück.
|
|
|
|
|
|
|
|
|
|
|
|
Rückgabewerte:
|
|
|
|
|
|
- "vector"
|
|
|
|
|
|
- "table"
|
|
|
|
|
|
- None (unbekannt / nicht bestimmbar)
|
|
|
|
|
|
"""
|
|
|
|
|
|
if layer is None:
|
|
|
|
|
|
return None
|
2025-12-19 14:29:52 +01:00
|
|
|
|
|
|
|
|
|
|
try:
|
2026-01-08 17:13:51 +01:00
|
|
|
|
is_spatial = getattr(layer, "isSpatial", None)
|
|
|
|
|
|
if callable(is_spatial):
|
|
|
|
|
|
return LAYER_TYPE_VECTOR if is_spatial() else LAYER_TYPE_TABLE
|
2025-12-19 14:29:52 +01:00
|
|
|
|
except Exception:
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
2026-01-08 17:13:51 +01:00
|
|
|
|
return None
|
2025-12-19 14:29:52 +01:00
|
|
|
|
|
|
|
|
|
|
|
2026-01-08 17:13:51 +01:00
|
|
|
|
def get_layer_crs(layer) -> Optional[str]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Gibt das CRS als AuthID zurück (z. B. 'EPSG:25833').
|
|
|
|
|
|
"""
|
2025-12-19 14:29:52 +01:00
|
|
|
|
if layer is None:
|
2026-01-08 17:13:51 +01:00
|
|
|
|
return None
|
2025-12-19 14:29:52 +01:00
|
|
|
|
|
|
|
|
|
|
try:
|
2026-01-08 17:13:51 +01:00
|
|
|
|
crs = layer.crs()
|
|
|
|
|
|
authid = getattr(crs, "authid", None)
|
2025-12-19 14:29:52 +01:00
|
|
|
|
if callable(authid):
|
|
|
|
|
|
value = authid()
|
|
|
|
|
|
if isinstance(value, str):
|
|
|
|
|
|
return value
|
|
|
|
|
|
except Exception:
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
2026-01-08 17:13:51 +01:00
|
|
|
|
return None
|
2025-12-19 14:29:52 +01:00
|
|
|
|
|
|
|
|
|
|
|
2026-01-08 17:13:51 +01:00
|
|
|
|
def get_layer_fields(layer) -> List[str]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Gibt die Feldnamen eines Layers zurück.
|
|
|
|
|
|
"""
|
2025-12-19 14:29:52 +01:00
|
|
|
|
if layer is None:
|
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
2026-01-08 17:13:51 +01:00
|
|
|
|
return list(layer.fields().names())
|
2025-12-19 14:29:52 +01:00
|
|
|
|
except Exception:
|
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-01-08 17:13:51 +01:00
|
|
|
|
def get_layer_source(layer) -> Optional[str]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Gibt die Datenquelle eines Layers zurück.
|
|
|
|
|
|
"""
|
|
|
|
|
|
if layer is None:
|
|
|
|
|
|
return None
|
2025-12-19 14:29:52 +01:00
|
|
|
|
|
|
|
|
|
|
try:
|
2026-01-08 17:13:51 +01:00
|
|
|
|
value = layer.source()
|
|
|
|
|
|
if isinstance(value, str) and value:
|
|
|
|
|
|
return value
|
2025-12-19 14:29:52 +01:00
|
|
|
|
except Exception:
|
2026-01-08 17:13:51 +01:00
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
return None
|
2025-12-19 14:29:52 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_layer_editable(layer) -> bool:
|
2026-01-08 17:13:51 +01:00
|
|
|
|
"""
|
|
|
|
|
|
Prüft, ob ein Layer editierbar ist.
|
|
|
|
|
|
"""
|
2025-12-19 14:29:52 +01:00
|
|
|
|
if layer is None:
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
is_editable = getattr(layer, "isEditable", None)
|
|
|
|
|
|
if callable(is_editable):
|
|
|
|
|
|
return bool(is_editable())
|
|
|
|
|
|
except Exception:
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
return False
|