202 lines
7.6 KiB
Python
202 lines
7.6 KiB
Python
import os.path
|
|
from typing import Callable
|
|
|
|
from qgis._core import QgsVectorLayer, QgsProject, QgsLayerTreeLayer
|
|
|
|
from .pegelonline_dockwidget import PegelonlineDockWidget
|
|
from .pomodules.poqgscurrentw import PoQgsCurrentW
|
|
from .pomodules.poqgsstations import PoQgsStations
|
|
|
|
|
|
# noinspection PyMethodMayBeStatic
|
|
class PoRunner(object):
|
|
|
|
def __init__(self, ui: PegelonlineDockWidget, iface):
|
|
self.ui: PegelonlineDockWidget = ui
|
|
self.iface = iface
|
|
self.local_dir = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
# Layer Variablen
|
|
self.layer_stations = None
|
|
self.layer_waterlevels = None
|
|
self.basemap_lines = None
|
|
self.basemap_areas = None
|
|
|
|
# connect ui signals
|
|
self.ui.cbStationsVisible.toggled.connect(self.cbStationsVisibleToggled)
|
|
self.ui.cbWaterlevelsVisible.toggled.connect(self.cbWaterlevelsVisibleToggled)
|
|
self.ui.cbBasemapLinesVisible.toggled.connect(self.cbBasemapLinesVisibleToggled)
|
|
self.ui.cbBasemapAreasVisible.toggled.connect(self.cbBasemapAreasVisibleToggled)
|
|
self.ui.cbWaterlevelsLabelsVisible.toggled.connect(self.cbWaterlevelsLabelsVisibleToggled)
|
|
self.ui.rbValue.buttonClicked.connect(self.rbValueChanged)
|
|
|
|
def loadStations(self):
|
|
print("loadStations")
|
|
reader = PoQgsStations()
|
|
self.layer_stations = self._layerFromReader(reader.fields, reader.crs, reader.getStationsFeatures(), "Stationen")
|
|
self._layerShow(self.layer_stations, "styles/label_stations.qml", self.disconnectStations)
|
|
|
|
def loadWaterlevels(self):
|
|
print("loadWaterlevels")
|
|
reader = PoQgsCurrentW()
|
|
self.layer_waterlevels = self._layerFromReader(reader.fields, reader.crs, reader.getCurrentWFeatures(), "Wasserstandinformationen")
|
|
self._layerShow(self.layer_waterlevels, "styles/label_currentw.qml", self.disconnectWaterlevels)
|
|
|
|
def _layerFromReader(self, fields, crs, features, title) -> None | QgsVectorLayer:
|
|
print("_layerFromReader")
|
|
if features is None:
|
|
return None
|
|
|
|
layer_path = "Point?crs=%s" % (crs.authid(),)
|
|
print("layer_path: " + layer_path)
|
|
|
|
layer = QgsVectorLayer(layer_path, title, "memory")
|
|
layer.updateFields()
|
|
layer.updateExtents()
|
|
layer.commitChanges()
|
|
|
|
provider = layer.dataProvider()
|
|
provider.addAttributes(fields)
|
|
provider.addFeatures(features)
|
|
|
|
if layer.isValid():
|
|
return layer
|
|
|
|
return None
|
|
|
|
def _layerShow(self, layer: QgsVectorLayer, styles_path: str, disconnect: Callable[[], None]):
|
|
print("_layerShow")
|
|
if layer is None:
|
|
print("_layerShow: Übergebener Layer ist None")
|
|
return
|
|
|
|
# Styles laden
|
|
layer.loadNamedStyle(os.path.join(self.local_dir, styles_path))
|
|
|
|
# disconnect setzen
|
|
layer.willBeDeleted.connect(disconnect)
|
|
|
|
# zur Instanz hinzufügen
|
|
QgsProject.instance().addMapLayer(layer, False)
|
|
|
|
# zum LayerTree hinzufügen
|
|
layer_tree = self.iface.layerTreeCanvasBridge().rootGroup()
|
|
layer_tree.insertChildNode(0, QgsLayerTreeLayer(layer))
|
|
|
|
self._layerSetVisible(layer, True)
|
|
self._layerRefresh(layer)
|
|
|
|
def _layerRefresh(self, layer):
|
|
print("_layerRefresh")
|
|
if self.iface.mapCanvas().isCachingEnabled():
|
|
layer.triggerRepaint()
|
|
else:
|
|
self.iface.mapCanvas().refresh()
|
|
|
|
def cbBasemapLinesVisibleToggled(self):
|
|
checked = self.ui.cbBasemapLinesVisible.isChecked()
|
|
print("cbBasemapLinesVisibleToggled: %s" % (checked,))
|
|
|
|
if self.basemap_lines is None and checked:
|
|
self.basemap_lines = self._basemapCreate("waters.gpkg|layername=water_l", "Flüsse", self.disconnectBasemapLines)
|
|
|
|
if self.basemap_lines is not None:
|
|
self._layerSetVisible(self.basemap_lines, checked)
|
|
|
|
def cbBasemapAreasVisibleToggled(self):
|
|
checked = self.ui.cbBasemapAreasVisible.isChecked()
|
|
print("cbBasemapAreasVisibleToggled: %s" % (checked,))
|
|
|
|
if self.basemap_areas is None and checked:
|
|
self.basemap_areas = self._basemapCreate("waters.gpkg|layername=water_f", "Flächen", self.disconnectBasemapAreas)
|
|
|
|
if self.basemap_areas is not None:
|
|
self._layerSetVisible(self.basemap_areas, checked)
|
|
|
|
def _basemapCreate(self, path, name, disconnect: Callable[[], None]) -> None | QgsVectorLayer:
|
|
print("_basemapCreate: %s" % (name,))
|
|
path = os.path.join(self.local_dir, "basemap", path)
|
|
basemap = QgsVectorLayer(path, name, "ogr")
|
|
|
|
if not basemap.isValid():
|
|
print("_basemapCreate: QgsVectorLayer nicht gültig: path=%s, name=%s" % (path, name))
|
|
return None
|
|
|
|
# disconnect setzen
|
|
basemap.willBeDeleted.connect(disconnect)
|
|
|
|
# zur Instanz hinzufügen
|
|
QgsProject.instance().addMapLayer(basemap, False)
|
|
|
|
# zum LayerTree hinzufügen
|
|
layer_tree = self.iface.layerTreeCanvasBridge().rootGroup()
|
|
layer_tree.insertChildNode(-1, QgsLayerTreeLayer(basemap))
|
|
|
|
return basemap
|
|
|
|
def _layerSetVisible(self, basemap: QgsVectorLayer, visible):
|
|
print("_layerSetVisible: %s => %s" % (basemap.name, visible))
|
|
layer_tree = QgsProject.instance().layerTreeRoot().findLayer(basemap.id())
|
|
layer_tree.setItemVisibilityChecked(visible)
|
|
self._layerRefresh(basemap)
|
|
|
|
def cbStationsVisibleToggled(self):
|
|
visible = self.ui.cbStationsVisible.isChecked()
|
|
print("cbStationsVisibleToggled: %s" % (visible,))
|
|
|
|
if self.layer_stations is None and visible:
|
|
self.loadStations()
|
|
|
|
if self.layer_stations is not None:
|
|
self.layer_stations.setLabelsEnabled(visible)
|
|
self._layerSetVisible(self.layer_stations, visible)
|
|
self._layerRefresh(self.layer_stations)
|
|
|
|
def cbWaterlevelsVisibleToggled(self):
|
|
visible = self.ui.cbWaterlevelsVisible.isChecked()
|
|
print("cbWaterlevelsVisibleToggled: %s" % (visible,))
|
|
|
|
if self.layer_waterlevels is None:
|
|
self.loadWaterlevels()
|
|
|
|
if self.layer_waterlevels is not None:
|
|
self.layer_waterlevels.setLabelsEnabled(visible)
|
|
self._layerSetVisible(self.layer_waterlevels, visible)
|
|
self._layerRefresh(self.layer_waterlevels)
|
|
|
|
def cbWaterlevelsLabelsVisibleToggled(self):
|
|
print("cbWaterlevelsLabelsVisibleToggled: %s" % (self.ui.cbWaterlevelsVisible.isChecked(),))
|
|
# TODO
|
|
|
|
def rbValueChanged(self, button):
|
|
print("rbValueChanged")
|
|
if self.layer_waterlevels is None:
|
|
self.loadWaterlevels()
|
|
|
|
if button.objectName() == "rbShowTrend":
|
|
self.layer_waterlevels.loadNamedStyle(os.path.join(self.local_dir, "styles/label_currentw_trend.qml"))
|
|
elif button.objectName() == "rbShowAbsValues":
|
|
self.layer_waterlevels.loadNamedStyle(os.path.join(self.local_dir, "styles/label_currentw_absvalue.qml"))
|
|
|
|
self.cbWaterlevelsVisibleToggled()
|
|
|
|
def disconnectStations(self):
|
|
print("disconnectStations")
|
|
self.layer_stations = None
|
|
self.ui.cbStationsVisible.setChecked(False)
|
|
|
|
def disconnectWaterlevels(self):
|
|
print("disconnectWaterlevels")
|
|
self.layer_waterlevels = None
|
|
self.ui.cbWaterlevelsVisible.setChecked(False)
|
|
|
|
def disconnectBasemapLines(self):
|
|
print("disconnectBasemapLines")
|
|
self.basemap_lines = None
|
|
self.ui.cbBasemapLinesVisible.setChecked(False)
|
|
|
|
def disconnectBasemapAreas(self):
|
|
print("disconnectBasemapAreas")
|
|
self.basemap_areas = None
|
|
self.ui.cbBasemapAreasVisible.setChecked(False)
|