Styles + CODE CLEAN po_modules

This commit is contained in:
Patrick Haßel 2025-09-28 14:12:00 +02:00
parent 99c5ac3144
commit 5476c512af
22 changed files with 1963 additions and 955 deletions

View File

@ -2,5 +2,3 @@
Beim Hinzufügen von Features fehlte das layer.updateFields() Beim Hinzufügen von Features fehlte das layer.updateFields()
Beim Hinzufügen von Features fehlte wurde versucht eine viel zu große Pegelonline 'number' in einen Int zu stecken. War schwierig zu entdecken => provider.errors() Beim Hinzufügen von Features fehlte wurde versucht eine viel zu große Pegelonline 'number' in einen Int zu stecken. War schwierig zu entdecken => provider.errors()
DockWidget wurde in der Höhe ziemlich voll → Weiteres Widget nur für Grafen DockWidget wurde in der Höhe ziemlich voll → Weiteres Widget nur für Grafen
eigene styles erzeugen!

View File

@ -46,10 +46,10 @@ WATERLEVELS_MAP_TIPS = "\
</tr>\ </tr>\
<tr>\ <tr>\
<th style='text-align: left'>MNW, MHW:</th>\ <th style='text-align: left'>MNW, MHW:</th>\
<td>[% \"stateMnwMhw\" %]</td>\ <td>[% \"mean\" %]</td>\
</tr>\ </tr>\
<tr>\ <tr>\
<th style='text-align: left'>NSW, HSW:</th>\ <th style='text-align: left'>NSW, HSW:</th>\
<td>[% \"stateNswHsw\" %]</td>\ <td>[% \"absolute\" %]</td>\
</tr>\ </tr>\
</table>" </table>"

View File

@ -64,7 +64,7 @@ extras: metadata.txt icon.png pegelonline_dockwidget_graph.ui
# Other directories to be deployed with the plugin. # Other directories to be deployed with the plugin.
# These must be subdirectories under the plugin directory # These must be subdirectories under the plugin directory
extra_dirs: pomodules basemap extra_dirs: po_modules basemap styles
# ISO code(s) for any locales (translations), separated by spaces. # ISO code(s) for any locales (translations), separated by spaces.
# Corresponding .ts files must exist in the i18n directory # Corresponding .ts files must exist in the i18n directory

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>280</width> <width>292</width>
<height>563</height> <height>681</height>
</rect> </rect>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
@ -21,15 +21,6 @@
</property> </property>
<widget class="QWidget" name="dockWidgetContents"> <widget class="QWidget" name="dockWidgetContents">
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="4" column="0">
<widget class="QGroupBox" name="gbWaterlevels">
<property name="title">
<string>Pegelstände:</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin"> <property name="leftMargin">
<number>5</number> <number>5</number>
</property> </property>
@ -42,110 +33,12 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>5</number> <number>5</number>
</property> </property>
<item> <property name="horizontalSpacing">
<widget class="QCheckBox" name="cbWaterlevelsVisible">
<property name="text">
<string>Anzeigen (Download von Pegelonline)</string>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gbWaterlevelsOptions">
<property name="title">
<string>Beschriftungen:</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<property name="leftMargin"> <property name="verticalSpacing">
<number>0</number> <number>2</number>
</property> </property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="cbWaterlevelsNumber">
<property name="text">
<string>Nummer</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsName">
<property name="text">
<string>Name</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsAgency">
<property name="text">
<string>Behörde</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsWater">
<property name="text">
<string>Gewässername</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="cbWaterlevelsTimestamp">
<property name="text">
<string>Zeitstempel</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsValue">
<property name="text">
<string>Aktueller Wert</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsMean">
<property name="text">
<string>MNW, MHW</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsAbsolute">
<property name="text">
<string>NSW, HSW</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QGroupBox" name="gbStations"> <widget class="QGroupBox" name="gbStations">
<property name="title"> <property name="title">
@ -153,7 +46,7 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing"> <property name="spacing">
<number>0</number> <number>2</number>
</property> </property>
<property name="leftMargin"> <property name="leftMargin">
<number>5</number> <number>5</number>
@ -227,6 +120,19 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -248,22 +154,110 @@
</property> </property>
</widget> </widget>
</item> </item>
</layout> <item>
</item> <spacer name="verticalSpacer_2">
</layout> <property name="orientation">
</widget> <enum>Qt::Vertical</enum>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="gbBasemap">
<property name="title">
<string>Basiskarte:</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout"> <property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Styles:</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QRadioButton" name="rbStationsStyleSimple">
<property name="text">
<string>Vorgabe</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">bgStationsStyle</string>
</attribute>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_12">
<item>
<widget class="QRadioButton" name="rbStationsStyleAgency">
<property name="text">
<string>Behörde</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">bgStationsStyle</string>
</attribute>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_13">
<item>
<widget class="QRadioButton" name="rbStationsStyleWater">
<property name="text">
<string>Gewässer</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">bgStationsStyle</string>
</attribute>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="0">
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<property name="spacing"> <property name="spacing">
<number>0</number> <number>6</number>
</property> </property>
<property name="leftMargin"> <property name="leftMargin">
<number>5</number> <number>5</number>
@ -278,19 +272,81 @@
<number>5</number> <number>5</number>
</property> </property>
<item> <item>
<widget class="QCheckBox" name="cbBasemapLines"> <widget class="QToolButton" name="btnSelectRectangle">
<property name="text"> <property name="text">
<string>Flüsse</string> <string>...</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="cbBasemapAreas"> <widget class="QToolButton" name="btnUnselectLayer">
<property name="text"> <property name="text">
<string>Flächen</string> <string>...</string>
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QToolButton" name="btnUnselectAll">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnZoomFullExtent">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnZoomToLayer">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnZoomToSelected">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnMapTips">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>161</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -301,7 +357,7 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_8"> <layout class="QVBoxLayout" name="verticalLayout_8">
<property name="spacing"> <property name="spacing">
<number>0</number> <number>2</number>
</property> </property>
<property name="leftMargin"> <property name="leftMargin">
<number>5</number> <number>5</number>
@ -440,20 +496,30 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<spacer name="verticalSpacer_6">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="0" column="0"> <item row="4" column="0">
<widget class="QFrame" name="frame"> <widget class="QGroupBox" name="gbWaterlevels">
<property name="frameShape"> <property name="title">
<enum>QFrame::StyledPanel</enum> <string>Pegelstände:</string>
</property> </property>
<property name="frameShadow"> <layout class="QVBoxLayout" name="verticalLayout_2">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<property name="spacing"> <property name="spacing">
<number>6</number> <number>2</number>
</property> </property>
<property name="leftMargin"> <property name="leftMargin">
<number>5</number> <number>5</number>
@ -468,82 +534,309 @@
<number>5</number> <number>5</number>
</property> </property>
<item> <item>
<widget class="QToolButton" name="btnSelectRectangle"> <widget class="QCheckBox" name="cbWaterlevelsVisible">
<property name="text"> <property name="text">
<string>...</string> <string>Anzeigen (Download von Pegelonline)</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QToolButton" name="btnUnselectLayer"> <widget class="QGroupBox" name="gbWaterlevelsOptions">
<property name="title">
<string>Beschriftungen:</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="cbWaterlevelsNumber">
<property name="text"> <property name="text">
<string>...</string> <string>Nummer</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QToolButton" name="btnUnselectAll"> <widget class="QCheckBox" name="cbWaterlevelsName">
<property name="text"> <property name="text">
<string>...</string> <string>Name</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="Line" name="line"> <widget class="QCheckBox" name="cbWaterlevelsAgency">
<property name="text">
<string>Behörde</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsWater">
<property name="text">
<string>Gewässername</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="cbWaterlevelsTimestamp">
<property name="text">
<string>Zeitstempel</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsValue">
<property name="text">
<string>Aktueller Wert</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsMean">
<property name="text">
<string>MNW, MHW</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbWaterlevelsAbsolute">
<property name="text">
<string>NSW, HSW</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Styles:</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QRadioButton" name="rbWaterlevelsStyleSimple">
<property name="text">
<string>Vorgabe</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">bgWaterlevelsStyle</string>
</attribute>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnZoomFullExtent">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnZoomToLayer">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnZoomToSelected">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnMapTips">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>161</width> <width>20</width>
<height>20</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_9">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QRadioButton" name="rbWaterlevelsStyleAgency">
<property name="text">
<string>Behörde</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bgWaterlevelsStyle</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbWaterlevelsStyleWater">
<property name="text">
<string>Gewässer</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">bgWaterlevelsStyle</string>
</attribute>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_10">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QRadioButton" name="rbWaterlevelsStyleMean">
<property name="text">
<string>MNW, MHW</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bgWaterlevelsStyle</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbWaterlevelsStyleAbsolute">
<property name="text">
<string>NSW, HSW</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bgWaterlevelsStyle</string>
</attribute>
</widget>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="gbBasemap">
<property name="title">
<string>Basiskarte:</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QCheckBox" name="cbBasemapLines">
<property name="text">
<string>Flüsse</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbBasemapAreas">
<property name="text">
<string>Flächen</string>
</property>
</widget>
</item>
</layout>
</widget> </widget>
</item> </item>
</layout> </layout>
@ -551,4 +844,8 @@
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
<buttongroups>
<buttongroup name="bgWaterlevelsStyle"/>
<buttongroup name="bgStationsStyle"/>
</buttongroups>
</ui> </ui>

View File

@ -4,18 +4,18 @@ from . import poBaseURL
from .urlreader import UrlReader from .urlreader import UrlReader
class PoHistory(UrlReader): class PoGraphReader(UrlReader):
def __init__(self, station: str, days: int): def __init__(self, station: str, days: int):
super().__init__(poBaseURL + 'stations/%s/W/measurements.png?start=P%dD' % (quote(station), days)) super().__init__(poBaseURL + 'stations/%s/W/measurements.png?start=P%dD' % (quote(station), days))
def download(self): def download(self):
print("download: Lade Bild herunter...") print("PoGraphReader::download: Lade Bild herunter...")
image_data = self.getDataResponse() image_data = self.getDataResponse()
if image_data is None or len(image_data) == 0: if image_data is None or len(image_data) == 0:
print("download: Fehler: Keine Daten erhalten") print("PoGraphReader::download: Fehler: Keine Daten erhalten")
return None return None
print("download: Vollständig") print("PoGraphReader::download: Vollständig")
return image_data return image_data

34
po_modules/po_station.py Normal file
View File

@ -0,0 +1,34 @@
from qgis._core import QgsFeature, QgsGeometry, QgsPointXY
class PoStation(object):
def __init__(self, json):
self.longitude = json['longitude'] if 'longitude' in json else None
self.latitude = json['latitude'] if 'latitude' in json else None
self.uuid = json['uuid']
self.number = json['number']
self.shortname = json['shortname']
self.longname = json['longname']
self.km = json['km'] if 'km' in json else None
self.agency = json['agency']
self.water = json['water']['longname']
def new_feature(self, fields) -> None | QgsFeature:
if self.longitude is None or self.latitude is None:
print("PoStation::new_feature: WARN: Station hat fehlende Koordinaten: %s" % (self.shortname,))
return None
feature = QgsFeature(fields)
feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(self.longitude, self.latitude)))
feature.setAttribute('uuid', self.uuid)
feature.setAttribute('number', self.number)
feature.setAttribute('shortname', self.shortname)
feature.setAttribute('longname', self.longname)
feature.setAttribute('km', self.km)
feature.setAttribute('agency', self.agency)
feature.setAttribute('water', self.water)
return feature

28
po_modules/po_stations.py Normal file
View File

@ -0,0 +1,28 @@
from . import poBaseURL
from .po_station import PoStation
from .urlreader import UrlReader
class PoStationReader(UrlReader):
def __init__(self):
super().__init__(poBaseURL + 'stations.json')
def get_stations(self):
print("PoStationReader::get_stations: Lade Stationen herunter...")
stations_json = self.getJsonResponse()
if stations_json is None or len(stations_json) == 0:
print("PoStationReader::get_stations: Keine Stationen erhalten")
return None
stations = []
for station_json in stations_json:
try:
stations.append(PoStation(station_json))
except Exception as e:
print("PoStationReader::get_stations: Fehler: error=%s, json=%s" % (e, station_json))
print("PoStationReader::get_stations: %d Stationen erhalten" % (len(stations),))
return stations

View File

@ -0,0 +1,40 @@
from PyQt5.QtCore import QVariant
from qgis._core import QgsCoordinateReferenceSystem
from qgis.core import QgsFields, QgsField
from .po_stations import PoStationReader
class PoStationReaderQgs(PoStationReader):
def __init__(self):
super().__init__()
self.fields = None
self.crs = QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.EpsgCrsId)
def get_features(self):
print("PoStationReaderQgs::get_features: Erzeuge Features...")
self.fields = QgsFields()
self.fields.append(QgsField('uuid', QVariant.String))
self.fields.append(QgsField('number', QVariant.LongLong))
self.fields.append(QgsField('shortname', QVariant.String))
self.fields.append(QgsField('longname', QVariant.String))
self.fields.append(QgsField('km', QVariant.Double))
self.fields.append(QgsField('agency', QVariant.String))
self.fields.append(QgsField('water', QVariant.String))
features = []
stations = self.get_stations()
if stations is None or len(stations) == 0:
print("PoStationReaderQgs::get_features: Fehler: Keine Stationen erhalten")
return None
for station in stations:
feature = station.new_feature(self.fields)
if feature is not None:
features.append(feature)
print("PoStationReaderQgs::get_features: %d Features erzeugt" % (len(features),))
return features

View File

@ -0,0 +1,39 @@
from qgis._core import QgsFeature, QgsGeometry, QgsPointXY
class PoWaterlevel(object):
def __init__(self, json):
self.longitude = json['longitude'] if 'longitude' in json else None
self.latitude = json['latitude'] if 'latitude' in json else None
self.uuid = json['uuid']
self.shortname = json['shortname']
self.number = json['number']
self.agency = json['agency']
self.unit = json['timeseries'][0]['unit']
self.timestamp = json['timeseries'][0]['currentMeasurement']['timestamp']
self.value = json['timeseries'][0]['currentMeasurement']['value']
self.mean = json['timeseries'][0]['currentMeasurement']['stateMnwMhw']
self.absolute = json['timeseries'][0]['currentMeasurement']['stateNswHsw']
self.water = json['water']['longname']
def new_feature(self, fields):
if self.longitude is None or self.latitude is None:
print("PoWaterlevel::new_feature: WARN: Station hat fehlende Koordinaten: %s" % (self.shortname,))
return None
feature = QgsFeature(fields)
feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(self.longitude, self.latitude)))
feature.setAttribute('shortname', self.shortname)
feature.setAttribute('number', self.number)
feature.setAttribute('agency', self.agency)
feature.setAttribute('timestamp', self.timestamp)
feature.setAttribute('value', self.value)
feature.setAttribute('unit', self.unit)
feature.setAttribute('mean', self.mean)
feature.setAttribute('absolute', self.absolute)
feature.setAttribute('water', self.water)
return feature

View File

@ -0,0 +1,25 @@
from . import poBaseURL
from .po_waterlevel import PoWaterlevel
from .urlreader import UrlReader
class PoWaterlevelReader(UrlReader):
def __init__(self):
super().__init__(poBaseURL + 'stations.json?timeseries=W&includeTimeseries=true&includeCurrentMeasurement=true')
def get_waterlevels(self):
print("PoWaterlevelReader::get_waterlevels: Lade Pegelstände herunter...")
stations_json = self.getJsonResponse()
if stations_json is None or len(stations_json) == 0:
print("PoWaterlevelReader::get_waterlevels: FEHLER: Keine Pegelstände erhalten")
return None
stations = []
for station_json in stations_json:
stations.append(PoWaterlevel(station_json))
print("PoWaterlevelReader::get_waterlevels: %d Pegelstände erhalten" % (len(stations),))
return stations

View File

@ -0,0 +1,41 @@
from PyQt5.QtCore import QVariant
from qgis._core import QgsCoordinateReferenceSystem
from qgis.core import QgsFields, QgsField
from .po_waterlevel_reader import PoWaterlevelReader
class PoWaterlevelReaderQgs(PoWaterlevelReader):
def __init__(self):
super().__init__()
self.fields = None
self.crs = QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.EpsgCrsId)
def get_features(self):
print("PoWaterlevelReaderQgs::get_features: Erzeuge Features...")
self.fields = QgsFields()
self.fields.append(QgsField('shortname', QVariant.String))
self.fields.append(QgsField('number', QVariant.LongLong))
self.fields.append(QgsField('agency', QVariant.String))
self.fields.append(QgsField('timestamp', QVariant.DateTime))
self.fields.append(QgsField('value', QVariant.Double))
self.fields.append(QgsField('unit', QVariant.String))
self.fields.append(QgsField('mean', QVariant.String))
self.fields.append(QgsField('absolute', QVariant.String))
self.fields.append(QgsField('water', QVariant.String))
features = []
waterlevels = self.get_waterlevels()
if waterlevels is None or len(waterlevels) == 0:
print("PoWaterlevelReaderQgs::get_features: Fehler: Keine Pegelstände erhalten")
return None
for waterlevel in waterlevels:
feature = waterlevel.new_feature(self.fields)
if feature is not None:
features.append(feature)
print("PoWaterlevelReaderQgs::get_features: %d Features erzeugt" % (len(features),))
return features

View File

@ -3,18 +3,17 @@ from typing import Callable
from PyQt5 import QtGui from PyQt5 import QtGui
from PyQt5.QtWidgets import QAction from PyQt5.QtWidgets import QAction
from qgis._core import QgsVectorLayer, QgsProject, QgsLayerTreeLayer, QgsPalLayerSettings, QgsVectorLayerSimpleLabeling from qgis._core import QgsVectorLayer, QgsProject, QgsLayerTreeLayer, QgsPalLayerSettings, QgsVectorLayerSimpleLabeling, QgsStyle, QgsSymbol, QgsRendererCategory, QgsCategorizedSymbolRenderer
from .map_tips import WATERLEVELS_MAP_TIPS, STATIONS_MAP_TIPS, BASEMAP_MAP_TIPS from .map_tips import WATERLEVELS_MAP_TIPS, STATIONS_MAP_TIPS, BASEMAP_MAP_TIPS
from .pegelonline_dockwidget import PegelonlineDockWidget from .pegelonline_dockwidget import PegelonlineDockWidget
from .pegelonline_dockwidget_graph import PegelonlineDockWidgetGraph from .pegelonline_dockwidget_graph import PegelonlineDockWidgetGraph
from .pomodules.po_history import PoHistory from .po_modules.po_graph_reader import PoGraphReader
from .pomodules.po_stations import PoStations from .po_modules.po_stations import PoStationReader
from .pomodules.po_stations_qgs import PoStationsQgs from .po_modules.po_stations_qgs import PoStationReaderQgs
from .pomodules.po_waterlevels_qgs import PoWaterlevelsQgs from .po_modules.po_waterlevels_reader_qgs import PoWaterlevelReaderQgs
# noinspection PyMethodMayBeStatic
class PoRunner(object): class PoRunner(object):
def __init__(self, ui: PegelonlineDockWidget, graph: PegelonlineDockWidgetGraph, iface): def __init__(self, ui: PegelonlineDockWidget, graph: PegelonlineDockWidgetGraph, iface):
@ -43,8 +42,8 @@ class PoRunner(object):
self.ui.btnMapTips.setDefaultAction(iface.actionMapTips()) self.ui.btnMapTips.setDefaultAction(iface.actionMapTips())
# Signale verbinden # Signale verbinden
self._connect_basemap_signals() self._basemap_connect_signals()
self._connect_stations_signals() self._stations_connect_signals()
self._waterlevels_connect_signals() self._waterlevels_connect_signals()
self._history_connect_signals() self._history_connect_signals()
@ -60,7 +59,6 @@ class PoRunner(object):
return None return None
# disconnect setzen # disconnect setzen
# noinspection PyUnresolvedReferences
basemap.willBeDeleted.connect(disconnect) basemap.willBeDeleted.connect(disconnect)
# map-tips setzen # map-tips setzen
@ -77,7 +75,7 @@ class PoRunner(object):
# basemap signals --------------------------------------------------------- # basemap signals ---------------------------------------------------------
def _connect_basemap_signals(self): def _basemap_connect_signals(self):
print("_connect_basemap_signals") print("_connect_basemap_signals")
self.ui.cbBasemapLines.toggled.connect(self._cbBasemapLines_toggled) self.ui.cbBasemapLines.toggled.connect(self._cbBasemapLines_toggled)
self.ui.cbBasemapAreas.toggled.connect(self._cbBasemapAreas_toggled) self.ui.cbBasemapAreas.toggled.connect(self._cbBasemapAreas_toggled)
@ -116,29 +114,57 @@ class PoRunner(object):
# stations ---------------------------------------------------------------- # stations ----------------------------------------------------------------
def _connect_stations_signals(self): def _stations_connect_signals(self):
print("_connect_stations_signals") print("_connect_stations_signals")
# noinspection DuplicatedCode
self.ui.cbStationsVisible.toggled.connect(self._cbStationsVisible_toggled) self.ui.cbStationsVisible.toggled.connect(self._cbStationsVisible_toggled)
self.ui.cbStationsName.toggled.connect(self._cbStationsName_toggled) self.ui.cbStationsName.toggled.connect(self._cbStationsName_toggled)
self.ui.cbStationsNumber.toggled.connect(self._cbStationsNumber_toggled) self.ui.cbStationsNumber.toggled.connect(self._cbStationsNumber_toggled)
self.ui.cbStationsAgency.toggled.connect(self._cbStationsAgency_toggled) self.ui.cbStationsAgency.toggled.connect(self._cbStationsAgency_toggled)
self.ui.cbStationsKm.toggled.connect(self._cbStationsKm_toggled) self.ui.cbStationsKm.toggled.connect(self._cbStationsKm_toggled)
self.ui.cbStationsWater.toggled.connect(self._cbStationsWater_toggled) self.ui.cbStationsWater.toggled.connect(self._cbStationsWater_toggled)
self.ui.bgStationsStyle.buttonClicked.connect(self._bgStationsStyle_clicked)
def _stations_apply_style(self):
button = self.ui.bgStationsStyle.checkedButton()
self._bgStationsStyle_clicked(button)
def _bgStationsStyle_clicked(self, button):
print("_bgStationsStyle_clicked: %s" % (button.objectName(),))
if self.stations is None:
return
file = "styles/stations.qml"
if self.ui.rbStationsStyleSimple == button:
self._layer_apply_style_from_file(self.stations, file)
return
elif self.ui.rbStationsStyleAgency == button:
field = "agency"
elif self.ui.rbStationsStyleWater == button:
field = "water"
else:
print("_bgStationsStyle_clicked: Style nicht implementiert: %s" % (button.objectName(),))
self._layer_apply_style_from_file(self.stations, file)
return
self._stations_update_labels()
self._layer_apply_style_per_category(self.stations, field, file)
def _cbStationsVisible_toggled(self): def _cbStationsVisible_toggled(self):
visible = self.ui.cbStationsVisible.isChecked() visible = self.ui.cbStationsVisible.isChecked()
print("_cbStationsVisible_toggled: %s" % (visible,)) print("_cbStationsVisible_toggled: %s" % (visible,))
if self.stations is None and visible: if self.stations is None and visible:
reader = PoStationsQgs() reader = PoStationReaderQgs()
features = reader.getStationsFeatures() features = reader.get_features()
self.stations = self._layer_create_from_reader(reader.fields, reader.crs, features, "Stationen", STATIONS_MAP_TIPS) self.stations = self._layer_create_from_reader(reader.fields, reader.crs, features, "Stationen", STATIONS_MAP_TIPS)
self._layer_add_to_instance(self.stations, "styles/label_stations.qml", self._stations_disconnect) self._layer_add_to_instance(self.stations, self._stations_disconnect)
if self.stations is not None: if self.stations is not None:
self._layer_set_visible(self.stations, visible) self._layer_set_visible(self.stations, visible)
self._stations_update_labels() if visible:
self._stations_apply_style()
def _cbStationsName_toggled(self): def _cbStationsName_toggled(self):
checked = self.ui.cbStationsName.isChecked() checked = self.ui.cbStationsName.isChecked()
@ -170,7 +196,6 @@ class PoRunner(object):
self.stations = None self.stations = None
self.ui.cbStationsVisible.setChecked(False) self.ui.cbStationsVisible.setChecked(False)
# noinspection DuplicatedCode
def _stations_update_labels(self): def _stations_update_labels(self):
print("_stations_update_labels") print("_stations_update_labels")
if self.stations is None: if self.stations is None:
@ -194,7 +219,6 @@ class PoRunner(object):
def _waterlevels_connect_signals(self): def _waterlevels_connect_signals(self):
print("_waterlevels_connect_signals") print("_waterlevels_connect_signals")
# noinspection DuplicatedCode
self.ui.cbWaterlevelsVisible.toggled.connect(self._cbWaterlevelsVisible_toggled) self.ui.cbWaterlevelsVisible.toggled.connect(self._cbWaterlevelsVisible_toggled)
self.ui.cbWaterlevelsName.toggled.connect(self._cbWaterlevelsName_toggled) self.ui.cbWaterlevelsName.toggled.connect(self._cbWaterlevelsName_toggled)
self.ui.cbWaterlevelsNumber.toggled.connect(self._cbWaterlevelsNumber_toggled) self.ui.cbWaterlevelsNumber.toggled.connect(self._cbWaterlevelsNumber_toggled)
@ -204,20 +228,52 @@ class PoRunner(object):
self.ui.cbWaterlevelsMean.toggled.connect(self._cbWaterlevelsMean_toggled) self.ui.cbWaterlevelsMean.toggled.connect(self._cbWaterlevelsMean_toggled)
self.ui.cbWaterlevelsAbsolute.toggled.connect(self._cbWaterlevelsAbsolute_toggled) self.ui.cbWaterlevelsAbsolute.toggled.connect(self._cbWaterlevelsAbsolute_toggled)
self.ui.cbWaterlevelsWater.toggled.connect(self._cbWaterlevelsWater_toggled) self.ui.cbWaterlevelsWater.toggled.connect(self._cbWaterlevelsWater_toggled)
self.ui.bgWaterlevelsStyle.buttonClicked.connect(self._bgWaterlevelsStyle_clicked)
def _waterlevels_apply_style(self):
button = self.ui.bgWaterlevelsStyle.checkedButton()
self._bgWaterlevelsStyle_clicked(button)
def _bgWaterlevelsStyle_clicked(self, button):
print("_bgWaterlevelsStyle_clicked: %s" % (button.objectName(),))
if self.waterlevels is None:
return
file = "styles/waterlevels.qml"
if self.ui.rbWaterlevelsStyleSimple == button:
self._layer_apply_style_from_file(self.waterlevels, file)
return
elif self.ui.rbWaterlevelsStyleAgency == button:
field = "agency"
elif self.ui.rbWaterlevelsStyleWater == button:
field = "water"
elif self.ui.rbWaterlevelsStyleMean == button:
field = "mean"
elif self.ui.rbWaterlevelsStyleAbsolute == button:
field = "absolute"
else:
print("_bgWaterlevelsStyle_clicked: Style nicht implementiert: %s" % (button.objectName(),))
self._layer_apply_style_from_file(self.waterlevels, file)
return
self._waterlevels_update_labels()
self._layer_apply_style_per_category(self.waterlevels, field, file)
def _cbWaterlevelsVisible_toggled(self): def _cbWaterlevelsVisible_toggled(self):
visible = self.ui.cbWaterlevelsVisible.isChecked() visible = self.ui.cbWaterlevelsVisible.isChecked()
print("_cbWaterlevelsVisible_toggled: %s" % (visible,)) print("_cbWaterlevelsVisible_toggled: %s" % (visible,))
if self.waterlevels is None and visible: if self.waterlevels is None and visible:
reader = PoWaterlevelsQgs() reader = PoWaterlevelReaderQgs()
features = reader.getWaterlevelsFeatures() features = reader.get_features()
self.waterlevels = self._layer_create_from_reader(reader.fields, reader.crs, features, "Pegelstände", WATERLEVELS_MAP_TIPS) self.waterlevels = self._layer_create_from_reader(reader.fields, reader.crs, features, "Pegelstände", WATERLEVELS_MAP_TIPS)
self._layer_add_to_instance(self.waterlevels, "styles/label_waterlevels.qml", self.waterlevels_disconnect) self._layer_add_to_instance(self.waterlevels, self.waterlevels_disconnect)
if self.waterlevels is not None: if self.waterlevels is not None:
self._layer_set_visible(self.waterlevels, visible) self._layer_set_visible(self.waterlevels, visible)
self._waterlevels_update_labels() if visible:
self._waterlevels_apply_style()
def _cbWaterlevelsName_toggled(self): def _cbWaterlevelsName_toggled(self):
checked = self.ui.cbWaterlevelsName.isChecked() checked = self.ui.cbWaterlevelsName.isChecked()
@ -264,7 +320,6 @@ class PoRunner(object):
self.waterlevels = None self.waterlevels = None
self.ui.cbWaterlevelsVisible.setChecked(False) self.ui.cbWaterlevelsVisible.setChecked(False)
# noinspection DuplicatedCode
def _waterlevels_update_labels(self): def _waterlevels_update_labels(self):
print("_waterlevels_update_labels") print("_waterlevels_update_labels")
if self.waterlevels is None: if self.waterlevels is None:
@ -284,9 +339,9 @@ class PoRunner(object):
if self.ui.cbWaterlevelsValue.isChecked(): if self.ui.cbWaterlevelsValue.isChecked():
fields.append('"value", \' \', "unit"') # 3 Teile anhängen: value, leerzeichen, unit fields.append('"value", \' \', "unit"') # 3 Teile anhängen: value, leerzeichen, unit
if self.ui.cbWaterlevelsMean.isChecked(): if self.ui.cbWaterlevelsMean.isChecked():
fields.append('\'MnwMhw=\', "stateMnwMhw"') fields.append('\'MnwMhw=\', "mean"')
if self.ui.cbWaterlevelsAbsolute.isChecked(): if self.ui.cbWaterlevelsAbsolute.isChecked():
fields.append('\'NswHsw=\', "stateNswHsw"') fields.append('\'NswHsw=\', "absolute"')
self._layer_update_labels(self.waterlevels, fields) self._layer_update_labels(self.waterlevels, fields)
# layers ------------------------------------------------------------------ # layers ------------------------------------------------------------------
@ -326,15 +381,12 @@ class PoRunner(object):
return None return None
def _layer_add_to_instance(self, layer: QgsVectorLayer, styles_path: str, disconnect: Callable[[], None]): def _layer_add_to_instance(self, layer: QgsVectorLayer, disconnect: Callable[[], None]):
print("_layer_add_to_instance") print("_layer_add_to_instance")
if layer is None: if layer is None:
print("_layer_add_to_instance: Fehler: Übergebener Layer ist None") print("_layer_add_to_instance: Fehler: Übergebener Layer ist None")
return return
# Styles laden
layer.loadNamedStyle(os.path.join(self.local_dir, styles_path))
# disconnect Signal verbinden # disconnect Signal verbinden
layer.willBeDeleted.connect(disconnect) layer.willBeDeleted.connect(disconnect)
layer.selectionChanged.connect(self._layer_selection_changed) layer.selectionChanged.connect(self._layer_selection_changed)
@ -358,7 +410,7 @@ class PoRunner(object):
self._history_load_stations() self._history_load_stations()
selected_shortname = selected[0].attribute("shortname") selected_shortname = selected[0].attribute("shortname")
print("_layer_selection_changed: Lade Pegelstandsverlauf zur Auswahl: %s" % (selected_shortname)) print("_layer_selection_changed: Lade Pegelstandsverlauf zur Auswahl: %s" % (selected_shortname,))
self._historyStation_set_by_shortname(selected_shortname) self._historyStation_set_by_shortname(selected_shortname)
else: else:
print("_layer_selection_changed: Anzahl ausgewählter Elemente ist NICHT 1, lade Pegelstandsverlauf NICHT!") print("_layer_selection_changed: Anzahl ausgewählter Elemente ist NICHT 1, lade Pegelstandsverlauf NICHT!")
@ -386,6 +438,42 @@ class PoRunner(object):
else: else:
self.iface.mapCanvas().refresh() self.iface.mapCanvas().refresh()
# layers styles -----------------------------------------------------------
def _layer_apply_style_per_category(self, layer, attribute_name, file):
print("_layer_apply_style_per_category: Erzeuge kategorisierte Farben...")
ramp = QgsStyle().defaultStyle().colorRamp("Turbo")
if ramp is None:
self._layer_apply_style_from_file(layer, file)
print("_layer_apply_style_per_category: Farbrampe nicht gefunden.")
return
idx = layer.fields().indexOf(attribute_name)
values = sorted(v for v in layer.uniqueValues(idx) if v is not None)
cats = []
for v in values:
sym = QgsSymbol.defaultSymbol(layer.geometryType())
if len(values) > 1:
t = values.index(v) / (len(values) - 1)
else:
t = 0.0
sym.setColor(ramp.color(t))
cats.append(QgsRendererCategory(v, sym, str(v)))
renderer = QgsCategorizedSymbolRenderer(attribute_name, cats)
layer.setRenderer(renderer)
self._layer_refresh(layer)
def _layer_apply_style_from_file(self, layer, file):
path = os.path.join(self.local_dir, file)
print("_layer_apply_style_from_file: Lade Style Datei: %s" % (path,))
res = layer.loadNamedStyle(path)
print("_layer_apply_style_from_file: result: %s" % (res,))
self._layer_refresh(layer)
# history signals --------------------------------------------------------- # history signals ---------------------------------------------------------
def _history_connect_signals(self): def _history_connect_signals(self):
@ -433,7 +521,7 @@ class PoRunner(object):
self.graph.lbHistory.setText("Bitte Tage [1, 30] wählen...") self.graph.lbHistory.setText("Bitte Tage [1, 30] wählen...")
return return
history = PoHistory(station, days) history = PoGraphReader(station, days)
image_data = history.download() image_data = history.download()
if image_data is None or len(image_data) == 0: if image_data is None or len(image_data) == 0:
@ -455,26 +543,20 @@ class PoRunner(object):
# behalte die aktuelle Station, um sie (mit eventuell neuem Index) wiederherzustellen # behalte die aktuelle Station, um sie (mit eventuell neuem Index) wiederherzustellen
current_station = self.ui.slHistoryStation.currentText() current_station = self.ui.slHistoryStation.currentText()
print("_history_load_stations: bisherige_station=%s" % current_station) print("_history_load_stations: bisherige_station=%s" % (current_station,))
self.ui.slHistoryStation.clear() self.ui.slHistoryStation.clear()
stations = PoStations().getStations() stations = PoStationReader().get_stations()
if stations is None or len(stations) == 0: if stations is None or len(stations) == 0:
print("_history_load_stations: Fehler: Keine Stationen erhalten") print("_history_load_stations: Fehler: Keine Stationen erhalten")
return return
index = 0
neuer_index = None
for station in stations: for station in stations:
shortname = station['attributes']['shortname'] self.ui.slHistoryStation.addItem(station.shortname)
if shortname == current_station:
neuer_index = index
self.ui.slHistoryStation.addItem(shortname)
index += 1
if self._historyStation_set_by_shortname(current_station): if self._historyStation_set_by_shortname(current_station):
print("_history_load_stations: Bisherige Station \"%s\" mit neuem index=%d wiederhergestellt" % (current_station, neuer_index)) print("_history_load_stations: Bisherige Station \"%s\" wiederhergestellt" % (current_station,))
else: else:
self.ui.slHistoryStation.setCurrentIndex(0) self.ui.slHistoryStation.setCurrentIndex(0)
station = self.ui.slHistoryStation.currentText() station = self.ui.slHistoryStation.currentText()

View File

@ -1,40 +0,0 @@
from . import poBaseURL
from .urlreader import UrlReader
class PoStations(UrlReader):
def __init__(self):
super().__init__(poBaseURL + 'stations.json')
def getStations(self):
print("getStations: Lade Stationen herunter...")
stations_json = self.getJsonResponse()
if stations_json is None or len(stations_json) == 0:
print("getStations: Keine Stationen erhalten")
return None
stations = []
for station_json in stations_json:
stations.append(
{
'geometry': {
'longitude': station_json['longitude'] if 'longitude' in station_json else None,
'latitude': station_json['latitude'] if 'latitude' in station_json else None,
},
'attributes': {
'uuid': station_json['uuid'],
'number': station_json['number'],
'shortname': station_json['shortname'],
'longname': station_json['longname'],
'km': station_json['km'] if 'km' in station_json else None,
'agency': station_json['agency'],
'water': station_json['water']['longname'],
},
}
)
print("getStations: %d Stationen erhalten" % (len(stations),))
return stations

View File

@ -1,62 +0,0 @@
from PyQt5.QtCore import QVariant
from qgis._core import QgsCoordinateReferenceSystem, QgsGeometry, QgsPointXY
from qgis.core import QgsFields, QgsFeature, QgsField
from .po_stations import PoStations
class PoStationsQgs(PoStations):
def __init__(self):
super().__init__()
self.fields = None
self.crs = QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.EpsgCrsId)
def getStationsFeatures(self):
print("getStationsFeatures: Erzeuge Features...")
self.fields = QgsFields()
self.fields.append(QgsField('uuid', QVariant.String))
self.fields.append(QgsField('number', QVariant.LongLong))
self.fields.append(QgsField('shortname', QVariant.String))
self.fields.append(QgsField('longname', QVariant.String))
self.fields.append(QgsField('km', QVariant.Double))
self.fields.append(QgsField('agency', QVariant.String))
self.fields.append(QgsField('water', QVariant.String))
features = []
stations = self.getStations()
if stations is None or len(stations) == 0:
print("getStationsFeatures: Fehler: Keine Stationen erhalten")
return None
for station in stations:
feature = self._getFeatureForStation(station)
if feature is not None:
features.append(feature)
print("getStationsFeatures: %d Features erzeugt" % (len(features),))
return features
def _getFeatureForStation(self, station) -> None | QgsFeature:
# noinspection DuplicatedCode
if station['geometry']['longitude'] is None or station['geometry']['latitude'] is None:
print("_getFeatureForStation: WARN: Station hat fehlende Koordinaten: %s" % (station['attributes']['shortname'],))
return None
feature = QgsFeature(self.fields)
longitude = station['geometry']['longitude']
latitude = station['geometry']['latitude']
feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(longitude, latitude)))
feature.setAttribute('uuid', station['attributes']['uuid'])
feature.setAttribute('number', station['attributes']['number'])
feature.setAttribute('shortname', station['attributes']['shortname'])
feature.setAttribute('longname', station['attributes']['longname'])
feature.setAttribute('km', station['attributes']['km'])
feature.setAttribute('agency', station['attributes']['agency'])
feature.setAttribute('water', station['attributes']['water'])
return feature

View File

@ -1,43 +0,0 @@
from . import poBaseURL
from .urlreader import UrlReader
class PoWaterlevels(UrlReader):
def __init__(self):
super().__init__(poBaseURL + 'stations.json?timeseries=W&includeTimeseries=true&includeCurrentMeasurement=true')
def getWaterlevels(self):
print("getWaterlevels: Lade Pegelstände herunter...")
stations_json = self.getJsonResponse()
if stations_json is None or len(stations_json) == 0:
print("getWaterlevels: FEHLER: Keine Pegelstände erhalten")
return None
stations = []
for station_json in stations_json:
stations.append(
{
'geometry': {
'longitude': station_json['longitude'] if 'longitude' in station_json else None,
'latitude': station_json['latitude'] if 'latitude' in station_json else None,
},
'attributes': {
'uuid': station_json['uuid'],
'shortname': station_json['shortname'],
'number': station_json['number'],
'agency': station_json['agency'],
'unit': station_json['timeseries'][0]['unit'],
'timestamp': station_json['timeseries'][0]['currentMeasurement']['timestamp'],
'value': station_json['timeseries'][0]['currentMeasurement']['value'],
'stateMnwMhw': station_json['timeseries'][0]['currentMeasurement']['stateMnwMhw'],
'stateNswHsw': station_json['timeseries'][0]['currentMeasurement']['stateNswHsw'],
'water': station_json['water']['longname'],
},
}
)
print("getWaterlevels: %d Pegelstände erhalten" % (len(stations),))
return stations

View File

@ -1,65 +0,0 @@
from PyQt5.QtCore import QVariant
from qgis._core import QgsCoordinateReferenceSystem, QgsGeometry, QgsPointXY
from qgis.core import QgsFields, QgsFeature, QgsField
from .po_waterlevels import PoWaterlevels
class PoWaterlevelsQgs(PoWaterlevels):
def __init__(self):
super().__init__()
self.fields = None
self.crs = QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.EpsgCrsId)
def getWaterlevelsFeatures(self):
print("getWaterlevelsFeatures: Erzeuge Features...")
self.fields = QgsFields()
self.fields.append(QgsField('shortname', QVariant.String))
self.fields.append(QgsField('number', QVariant.LongLong))
self.fields.append(QgsField('agency', QVariant.String))
self.fields.append(QgsField('timestamp', QVariant.DateTime))
self.fields.append(QgsField('value', QVariant.Double))
self.fields.append(QgsField('unit', QVariant.String))
self.fields.append(QgsField('stateMnwMhw', QVariant.String))
self.fields.append(QgsField('stateNswHsw', QVariant.String))
self.fields.append(QgsField('water', QVariant.String))
features = []
waterlevels = self.getWaterlevels()
if waterlevels is None or len(waterlevels) == 0:
print("getWaterlevelsFeatures: Fehler: Keine Pegelstände erhalten")
return None
for station in waterlevels:
feature = self._getFeatureForStation(station)
if feature is not None:
features.append(feature)
print("getWaterlevelsFeatures: %d Features erzeugt" % (len(features),))
return features
def _getFeatureForStation(self, station):
# noinspection DuplicatedCode
if station['geometry']['longitude'] is None or station['geometry']['latitude'] is None:
print("_getFeatureForStation: WARN: Station hat fehlende Koordinaten: %s" % (station['attributes']['shortname'],))
return None
feature = QgsFeature(self.fields)
longitude = station['geometry']['longitude']
latitude = station['geometry']['latitude']
feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(longitude, latitude)))
feature.setAttribute('shortname', station['attributes']['shortname'])
feature.setAttribute('number', station['attributes']['number'])
feature.setAttribute('agency', station['attributes']['agency'])
feature.setAttribute('timestamp', station['attributes']['timestamp'])
feature.setAttribute('value', station['attributes']['value'])
feature.setAttribute('unit', station['attributes']['unit'])
feature.setAttribute('stateMnwMhw', station['attributes']['stateMnwMhw'])
feature.setAttribute('stateNswHsw', station['attributes']['stateNswHsw'])
feature.setAttribute('water', station['attributes']['water'])
return feature

View File

@ -1,243 +0,0 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis maxScale="0" labelsEnabled="1" readOnly="0" hasScaleBasedVisibilityFlag="0" styleCategories="AllStyleCategories" simplifyLocal="1" minScale="1e+08" simplifyMaxScale="1" simplifyAlgorithm="0" version="3.4.6-Madeira" simplifyDrawingTol="1" simplifyDrawingHints="0">
<flags>
<Identifiable>1</Identifiable>
<Removable>1</Removable>
<Searchable>1</Searchable>
</flags>
<renderer-v2 symbollevels="0" enableorderby="0" forceraster="0" type="singleSymbol">
<symbols>
<symbol clip_to_extent="1" alpha="1" name="0" type="marker" force_rhr="0">
<layer enabled="1" pass="0" locked="0" class="SimpleMarker">
<prop v="0" k="angle"/>
<prop v="227,26,28,255" k="color"/>
<prop v="1" k="horizontal_anchor_point"/>
<prop v="bevel" k="joinstyle"/>
<prop v="circle" k="name"/>
<prop v="0,0" k="offset"/>
<prop v="3x:0,0,0,0,0,0" k="offset_map_unit_scale"/>
<prop v="MM" k="offset_unit"/>
<prop v="35,35,35,255" k="outline_color"/>
<prop v="solid" k="outline_style"/>
<prop v="0" k="outline_width"/>
<prop v="3x:0,0,0,0,0,0" k="outline_width_map_unit_scale"/>
<prop v="MM" k="outline_width_unit"/>
<prop v="diameter" k="scale_method"/>
<prop v="2" k="size"/>
<prop v="3x:0,0,0,0,0,0" k="size_map_unit_scale"/>
<prop v="MM" k="size_unit"/>
<prop v="1" k="vertical_anchor_point"/>
<data_defined_properties>
<Option type="Map">
<Option name="name" type="QString" value=""/>
<Option name="properties"/>
<Option name="type" type="QString" value="collection"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</symbols>
<rotation/>
<sizescale/>
</renderer-v2>
<labeling type="simple">
<settings>
<text-style namedStyle="Regular" fontUnderline="0" fontWordSpacing="0" fontStrikeout="0" fontWeight="25" fontSize="10" isExpression="0" blendMode="0" fontFamily="Calibri Light" fontLetterSpacing="0" textColor="0,0,0,255" previewBkgrdColor="#ffffff" fontSizeUnit="Point" multilineHeight="1" fieldName="shortname" fontSizeMapUnitScale="3x:0,0,0,0,0,0" textOpacity="1" fontCapitals="0" useSubstitutions="0" fontItalic="0">
<text-buffer bufferSize="1" bufferJoinStyle="128" bufferSizeMapUnitScale="3x:0,0,0,0,0,0" bufferColor="255,255,255,255" bufferDraw="1" bufferNoFill="1" bufferOpacity="1" bufferSizeUnits="MM" bufferBlendMode="0"/>
<background shapeRadiiY="0" shapeOffsetMapUnitScale="3x:0,0,0,0,0,0" shapeOpacity="1" shapeDraw="0" shapeType="0" shapeSVGFile="" shapeSizeY="0" shapeSizeUnit="MM" shapeOffsetUnit="MM" shapeRadiiMapUnitScale="3x:0,0,0,0,0,0" shapeOffsetX="0" shapeJoinStyle="64" shapeRotationType="0" shapeSizeX="0" shapeRotation="0" shapeBorderWidth="0" shapeBorderWidthMapUnitScale="3x:0,0,0,0,0,0" shapeBlendMode="0" shapeSizeMapUnitScale="3x:0,0,0,0,0,0" shapeOffsetY="0" shapeBorderColor="128,128,128,255" shapeRadiiUnit="MM" shapeSizeType="0" shapeFillColor="255,255,255,255" shapeBorderWidthUnit="MM" shapeRadiiX="0"/>
<shadow shadowRadius="1.5" shadowBlendMode="6" shadowRadiusMapUnitScale="3x:0,0,0,0,0,0" shadowOpacity="0.7" shadowDraw="0" shadowOffsetMapUnitScale="3x:0,0,0,0,0,0" shadowScale="100" shadowUnder="0" shadowRadiusAlphaOnly="0" shadowOffsetAngle="135" shadowOffsetUnit="MM" shadowRadiusUnit="MM" shadowOffsetDist="1" shadowOffsetGlobal="1" shadowColor="0,0,0,255"/>
<substitutions/>
</text-style>
<text-format addDirectionSymbol="0" placeDirectionSymbol="0" multilineAlign="3" plussign="0" leftDirectionSymbol="&lt;" rightDirectionSymbol=">" formatNumbers="0" reverseDirectionSymbol="0" decimals="3" autoWrapLength="0" wrapChar="" useMaxLineLengthForAutoWrap="1"/>
<placement repeatDistanceMapUnitScale="3x:0,0,0,0,0,0" fitInPolygonOnly="0" quadOffset="1" distUnits="MM" yOffset="0" priority="5" placement="1" repeatDistance="0" offsetType="0" preserveRotation="1" offsetUnits="MM" maxCurvedCharAngleOut="-25" rotationAngle="0" repeatDistanceUnits="MM" maxCurvedCharAngleIn="25" centroidWhole="0" dist="0" xOffset="0" placementFlags="10" predefinedPositionOrder="TR,TL,BR,BL,R,L,TSR,BSR" centroidInside="0" labelOffsetMapUnitScale="3x:0,0,0,0,0,0" distMapUnitScale="3x:0,0,0,0,0,0"/>
<rendering maxNumLabels="2000" obstacle="1" fontLimitPixelSize="0" obstacleFactor="1" minFeatureSize="0" drawLabels="1" scaleMin="0" upsidedownLabels="0" fontMaxPixelSize="10000" zIndex="0" obstacleType="0" fontMinPixelSize="3" scaleMax="0" limitNumLabels="0" displayAll="0" labelPerPart="0" scaleVisibility="0" mergeLines="0"/>
<dd_properties>
<Option type="Map">
<Option name="name" type="QString" value=""/>
<Option name="properties"/>
<Option name="type" type="QString" value="collection"/>
</Option>
</dd_properties>
</settings>
</labeling>
<customproperties>
<property key="embeddedWidgets/count" value="0"/>
<property key="variableNames"/>
<property key="variableValues"/>
</customproperties>
<blendMode>0</blendMode>
<featureBlendMode>0</featureBlendMode>
<layerOpacity>1</layerOpacity>
<SingleCategoryDiagramRenderer diagramType="Histogram" attributeLegend="1">
<DiagramCategory penAlpha="255" penColor="#000000" maxScaleDenominator="1e+08" sizeType="MM" backgroundAlpha="255" width="15" barWidth="5" penWidth="0" height="15" opacity="1" enabled="0" rotationOffset="270" scaleBasedVisibility="0" labelPlacementMethod="XHeight" minScaleDenominator="0" lineSizeType="MM" scaleDependency="Area" diagramOrientation="Up" sizeScale="3x:0,0,0,0,0,0" lineSizeScale="3x:0,0,0,0,0,0" minimumSize="0" backgroundColor="#ffffff">
<fontProperties style="" description="MS Shell Dlg 2,8.1,-1,5,50,0,0,0,0,0"/>
</DiagramCategory>
</SingleCategoryDiagramRenderer>
<DiagramLayerSettings showAll="1" priority="0" zIndex="0" obstacle="0" dist="0" placement="0" linePlacementFlags="18">
<properties>
<Option type="Map">
<Option name="name" type="QString" value=""/>
<Option name="properties"/>
<Option name="type" type="QString" value="collection"/>
</Option>
</properties>
</DiagramLayerSettings>
<geometryOptions removeDuplicateNodes="0" geometryPrecision="0">
<activeChecks/>
<checkConfiguration/>
</geometryOptions>
<fieldConfiguration>
<field name="uuid">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="number">
<editWidget type="Range">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="shortname">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="longname">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="km">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="agency">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="water">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
</fieldConfiguration>
<aliases>
<alias index="0" name="" field="uuid"/>
<alias index="1" name="" field="number"/>
<alias index="2" name="" field="shortname"/>
<alias index="3" name="" field="longname"/>
<alias index="4" name="" field="km"/>
<alias index="5" name="" field="agency"/>
<alias index="6" name="" field="water"/>
</aliases>
<excludeAttributesWMS/>
<excludeAttributesWFS/>
<defaults>
<default applyOnUpdate="0" field="uuid" expression=""/>
<default applyOnUpdate="0" field="number" expression=""/>
<default applyOnUpdate="0" field="shortname" expression=""/>
<default applyOnUpdate="0" field="longname" expression=""/>
<default applyOnUpdate="0" field="km" expression=""/>
<default applyOnUpdate="0" field="agency" expression=""/>
<default applyOnUpdate="0" field="water" expression=""/>
</defaults>
<constraints>
<constraint notnull_strength="0" exp_strength="0" field="uuid" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="number" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="shortname" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="longname" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="km" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="agency" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="water" unique_strength="0" constraints="0"/>
</constraints>
<constraintExpressions>
<constraint desc="" exp="" field="uuid"/>
<constraint desc="" exp="" field="number"/>
<constraint desc="" exp="" field="shortname"/>
<constraint desc="" exp="" field="longname"/>
<constraint desc="" exp="" field="km"/>
<constraint desc="" exp="" field="agency"/>
<constraint desc="" exp="" field="water"/>
</constraintExpressions>
<expressionfields/>
<attributeactions>
<defaultAction key="Canvas" value="{00000000-0000-0000-0000-000000000000}"/>
</attributeactions>
<attributetableconfig sortOrder="0" actionWidgetStyle="dropDown" sortExpression="">
<columns>
<column name="uuid" hidden="0" width="-1" type="field"/>
<column name="number" hidden="0" width="-1" type="field"/>
<column name="shortname" hidden="0" width="-1" type="field"/>
<column name="longname" hidden="0" width="-1" type="field"/>
<column name="km" hidden="0" width="-1" type="field"/>
<column name="agency" hidden="0" width="-1" type="field"/>
<column name="water" hidden="0" width="-1" type="field"/>
<column hidden="1" width="-1" type="actions"/>
</columns>
</attributetableconfig>
<conditionalstyles>
<rowstyles/>
<fieldstyles/>
</conditionalstyles>
<editform tolerant="1"></editform>
<editforminit/>
<editforminitcodesource>0</editforminitcodesource>
<editforminitfilepath></editforminitfilepath>
<editforminitcode><![CDATA[# -*- coding: utf-8 -*-
"""
QGIS forms can have a Python function that is called when the form is
opened.
Use this function to add extra logic to your forms.
Enter the name of the function in the "Python Init function"
field.
An example follows:
"""
from qgis.PyQt.QtWidgets import QWidget
def my_form_open(dialog, layer, feature):
geom = feature.geometry()
control = dialog.findChild(QWidget, "MyLineEdit")
]]></editforminitcode>
<featformsuppress>0</featformsuppress>
<editorlayout>generatedlayout</editorlayout>
<editable>
<field name="agency" editable="1"/>
<field name="km" editable="1"/>
<field name="longname" editable="1"/>
<field name="number" editable="1"/>
<field name="shortname" editable="1"/>
<field name="uuid" editable="1"/>
<field name="water" editable="1"/>
</editable>
<labelOnTop>
<field name="agency" labelOnTop="0"/>
<field name="km" labelOnTop="0"/>
<field name="longname" labelOnTop="0"/>
<field name="number" labelOnTop="0"/>
<field name="shortname" labelOnTop="0"/>
<field name="uuid" labelOnTop="0"/>
<field name="water" labelOnTop="0"/>
</labelOnTop>
<widgets/>
<previewExpression>uuid</previewExpression>
<mapTip></mapTip>
<layerGeometryType>0</layerGeometryType>
</qgis>

View File

@ -1,243 +0,0 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis maxScale="0" labelsEnabled="1" readOnly="0" hasScaleBasedVisibilityFlag="0" styleCategories="AllStyleCategories" simplifyLocal="1" minScale="1e+08" simplifyMaxScale="1" simplifyAlgorithm="0" version="3.4.6-Madeira" simplifyDrawingTol="1" simplifyDrawingHints="0">
<flags>
<Identifiable>1</Identifiable>
<Removable>1</Removable>
<Searchable>1</Searchable>
</flags>
<renderer-v2 symbollevels="0" enableorderby="0" forceraster="0" type="singleSymbol">
<symbols>
<symbol clip_to_extent="1" alpha="1" name="0" type="marker" force_rhr="0">
<layer enabled="1" pass="0" locked="0" class="SimpleMarker">
<prop v="0" k="angle"/>
<prop v="31,28,175,255" k="color"/>
<prop v="1" k="horizontal_anchor_point"/>
<prop v="bevel" k="joinstyle"/>
<prop v="circle" k="name"/>
<prop v="0,0" k="offset"/>
<prop v="3x:0,0,0,0,0,0" k="offset_map_unit_scale"/>
<prop v="MM" k="offset_unit"/>
<prop v="35,35,35,255" k="outline_color"/>
<prop v="solid" k="outline_style"/>
<prop v="0" k="outline_width"/>
<prop v="3x:0,0,0,0,0,0" k="outline_width_map_unit_scale"/>
<prop v="MM" k="outline_width_unit"/>
<prop v="diameter" k="scale_method"/>
<prop v="2" k="size"/>
<prop v="3x:0,0,0,0,0,0" k="size_map_unit_scale"/>
<prop v="MM" k="size_unit"/>
<prop v="1" k="vertical_anchor_point"/>
<data_defined_properties>
<Option type="Map">
<Option name="name" type="QString" value=""/>
<Option name="properties"/>
<Option name="type" type="QString" value="collection"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</symbols>
<rotation/>
<sizescale/>
</renderer-v2>
<labeling type="simple">
<settings>
<text-style namedStyle="Regular" fontUnderline="0" fontWordSpacing="0" fontStrikeout="0" fontWeight="25" fontSize="10" isExpression="0" blendMode="0" fontFamily="Calibri Light" fontLetterSpacing="0" textColor="0,0,0,255" previewBkgrdColor="#ffffff" fontSizeUnit="Point" multilineHeight="1" fieldName="shortname" fontSizeMapUnitScale="3x:0,0,0,0,0,0" textOpacity="1" fontCapitals="0" useSubstitutions="0" fontItalic="0">
<text-buffer bufferSize="1" bufferJoinStyle="128" bufferSizeMapUnitScale="3x:0,0,0,0,0,0" bufferColor="255,255,255,255" bufferDraw="1" bufferNoFill="1" bufferOpacity="1" bufferSizeUnits="MM" bufferBlendMode="0"/>
<background shapeRadiiY="0" shapeOffsetMapUnitScale="3x:0,0,0,0,0,0" shapeOpacity="1" shapeDraw="0" shapeType="0" shapeSVGFile="" shapeSizeY="0" shapeSizeUnit="MM" shapeOffsetUnit="MM" shapeRadiiMapUnitScale="3x:0,0,0,0,0,0" shapeOffsetX="0" shapeJoinStyle="64" shapeRotationType="0" shapeSizeX="0" shapeRotation="0" shapeBorderWidth="0" shapeBorderWidthMapUnitScale="3x:0,0,0,0,0,0" shapeBlendMode="0" shapeSizeMapUnitScale="3x:0,0,0,0,0,0" shapeOffsetY="0" shapeBorderColor="128,128,128,255" shapeRadiiUnit="MM" shapeSizeType="0" shapeFillColor="255,255,255,255" shapeBorderWidthUnit="MM" shapeRadiiX="0"/>
<shadow shadowRadius="1.5" shadowBlendMode="6" shadowRadiusMapUnitScale="3x:0,0,0,0,0,0" shadowOpacity="0.7" shadowDraw="0" shadowOffsetMapUnitScale="3x:0,0,0,0,0,0" shadowScale="100" shadowUnder="0" shadowRadiusAlphaOnly="0" shadowOffsetAngle="135" shadowOffsetUnit="MM" shadowRadiusUnit="MM" shadowOffsetDist="1" shadowOffsetGlobal="1" shadowColor="0,0,0,255"/>
<substitutions/>
</text-style>
<text-format addDirectionSymbol="0" placeDirectionSymbol="0" multilineAlign="3" plussign="0" leftDirectionSymbol="&lt;" rightDirectionSymbol=">" formatNumbers="0" reverseDirectionSymbol="0" decimals="3" autoWrapLength="0" wrapChar="" useMaxLineLengthForAutoWrap="1"/>
<placement repeatDistanceMapUnitScale="3x:0,0,0,0,0,0" fitInPolygonOnly="0" quadOffset="1" distUnits="MM" yOffset="0" priority="5" placement="1" repeatDistance="0" offsetType="0" preserveRotation="1" offsetUnits="MM" maxCurvedCharAngleOut="-25" rotationAngle="0" repeatDistanceUnits="MM" maxCurvedCharAngleIn="25" centroidWhole="0" dist="0" xOffset="0" placementFlags="10" predefinedPositionOrder="TR,TL,BR,BL,R,L,TSR,BSR" centroidInside="0" labelOffsetMapUnitScale="3x:0,0,0,0,0,0" distMapUnitScale="3x:0,0,0,0,0,0"/>
<rendering maxNumLabels="2000" obstacle="1" fontLimitPixelSize="0" obstacleFactor="1" minFeatureSize="0" drawLabels="1" scaleMin="0" upsidedownLabels="0" fontMaxPixelSize="10000" zIndex="0" obstacleType="0" fontMinPixelSize="3" scaleMax="0" limitNumLabels="0" displayAll="0" labelPerPart="0" scaleVisibility="0" mergeLines="0"/>
<dd_properties>
<Option type="Map">
<Option name="name" type="QString" value=""/>
<Option name="properties"/>
<Option name="type" type="QString" value="collection"/>
</Option>
</dd_properties>
</settings>
</labeling>
<customproperties>
<property key="embeddedWidgets/count" value="0"/>
<property key="variableNames"/>
<property key="variableValues"/>
</customproperties>
<blendMode>0</blendMode>
<featureBlendMode>0</featureBlendMode>
<layerOpacity>1</layerOpacity>
<SingleCategoryDiagramRenderer diagramType="Histogram" attributeLegend="1">
<DiagramCategory penAlpha="255" penColor="#000000" maxScaleDenominator="1e+08" sizeType="MM" backgroundAlpha="255" width="15" barWidth="5" penWidth="0" height="15" opacity="1" enabled="0" rotationOffset="270" scaleBasedVisibility="0" labelPlacementMethod="XHeight" minScaleDenominator="0" lineSizeType="MM" scaleDependency="Area" diagramOrientation="Up" sizeScale="3x:0,0,0,0,0,0" lineSizeScale="3x:0,0,0,0,0,0" minimumSize="0" backgroundColor="#ffffff">
<fontProperties style="" description="MS Shell Dlg 2,8.1,-1,5,50,0,0,0,0,0"/>
</DiagramCategory>
</SingleCategoryDiagramRenderer>
<DiagramLayerSettings showAll="1" priority="0" zIndex="0" obstacle="0" dist="0" placement="0" linePlacementFlags="18">
<properties>
<Option type="Map">
<Option name="name" type="QString" value=""/>
<Option name="properties"/>
<Option name="type" type="QString" value="collection"/>
</Option>
</properties>
</DiagramLayerSettings>
<geometryOptions removeDuplicateNodes="0" geometryPrecision="0">
<activeChecks/>
<checkConfiguration/>
</geometryOptions>
<fieldConfiguration>
<field name="uuid">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="shortname">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="timestamp">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="value">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="trend">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="stateMnwMhw">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field name="stateNswHsw">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
</fieldConfiguration>
<aliases>
<alias index="0" name="" field="uuid"/>
<alias index="1" name="" field="shortname"/>
<alias index="2" name="" field="timestamp"/>
<alias index="3" name="" field="value"/>
<alias index="4" name="" field="trend"/>
<alias index="5" name="" field="stateMnwMhw"/>
<alias index="6" name="" field="stateNswHsw"/>
</aliases>
<excludeAttributesWMS/>
<excludeAttributesWFS/>
<defaults>
<default applyOnUpdate="0" field="uuid" expression=""/>
<default applyOnUpdate="0" field="shortname" expression=""/>
<default applyOnUpdate="0" field="timestamp" expression=""/>
<default applyOnUpdate="0" field="value" expression=""/>
<default applyOnUpdate="0" field="trend" expression=""/>
<default applyOnUpdate="0" field="stateMnwMhw" expression=""/>
<default applyOnUpdate="0" field="stateNswHsw" expression=""/>
</defaults>
<constraints>
<constraint notnull_strength="0" exp_strength="0" field="uuid" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="shortname" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="timestamp" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="value" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="trend" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="stateMnwMhw" unique_strength="0" constraints="0"/>
<constraint notnull_strength="0" exp_strength="0" field="stateNswHsw" unique_strength="0" constraints="0"/>
</constraints>
<constraintExpressions>
<constraint desc="" exp="" field="uuid"/>
<constraint desc="" exp="" field="shortname"/>
<constraint desc="" exp="" field="timestamp"/>
<constraint desc="" exp="" field="value"/>
<constraint desc="" exp="" field="trend"/>
<constraint desc="" exp="" field="stateMnwMhw"/>
<constraint desc="" exp="" field="stateNswHsw"/>
</constraintExpressions>
<expressionfields/>
<attributeactions>
<defaultAction key="Canvas" value="{00000000-0000-0000-0000-000000000000}"/>
</attributeactions>
<attributetableconfig sortOrder="0" actionWidgetStyle="dropDown" sortExpression="">
<columns>
<column name="uuid" hidden="0" width="-1" type="field"/>
<column name="shortname" hidden="0" width="-1" type="field"/>
<column name="timestamp" hidden="0" width="-1" type="field"/>
<column name="value" hidden="0" width="-1" type="field"/>
<column name="trend" hidden="0" width="-1" type="field"/>
<column name="stateMnwMhw" hidden="0" width="-1" type="field"/>
<column name="stateNswHsw" hidden="0" width="-1" type="field"/>
<column hidden="1" width="-1" type="actions"/>
</columns>
</attributetableconfig>
<conditionalstyles>
<rowstyles/>
<fieldstyles/>
</conditionalstyles>
<editform tolerant="1"></editform>
<editforminit/>
<editforminitcodesource>0</editforminitcodesource>
<editforminitfilepath></editforminitfilepath>
<editforminitcode><![CDATA[# -*- coding: utf-8 -*-
"""
QGIS forms can have a Python function that is called when the form is
opened.
Use this function to add extra logic to your forms.
Enter the name of the function in the "Python Init function"
field.
An example follows:
"""
from qgis.PyQt.QtWidgets import QWidget
def my_form_open(dialog, layer, feature):
geom = feature.geometry()
control = dialog.findChild(QWidget, "MyLineEdit")
]]></editforminitcode>
<featformsuppress>0</featformsuppress>
<editorlayout>generatedlayout</editorlayout>
<editable>
<field name="shortname" editable="1"/>
<field name="stateMnwMhw" editable="1"/>
<field name="stateNswHsw" editable="1"/>
<field name="timestamp" editable="1"/>
<field name="trend" editable="1"/>
<field name="uuid" editable="1"/>
<field name="value" editable="1"/>
</editable>
<labelOnTop>
<field name="shortname" labelOnTop="0"/>
<field name="stateMnwMhw" labelOnTop="0"/>
<field name="stateNswHsw" labelOnTop="0"/>
<field name="timestamp" labelOnTop="0"/>
<field name="trend" labelOnTop="0"/>
<field name="uuid" labelOnTop="0"/>
<field name="value" labelOnTop="0"/>
</labelOnTop>
<widgets/>
<previewExpression>uuid</previewExpression>
<mapTip></mapTip>
<layerGeometryType>0</layerGeometryType>
</qgis>

545
styles/stations.qml Normal file
View File

@ -0,0 +1,545 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis autoRefreshMode="Disabled" labelsEnabled="1" simplifyDrawingTol="1" simplifyMaxScale="1" version="3.44.3-Solothurn" styleCategories="AllStyleCategories" readOnly="0" maxScale="0" autoRefreshTime="0" simplifyDrawingHints="0" symbologyReferenceScale="-1" simplifyAlgorithm="0" hasScaleBasedVisibilityFlag="0" minScale="100000000" simplifyLocal="1">
<flags>
<Identifiable>1</Identifiable>
<Removable>1</Removable>
<Searchable>1</Searchable>
<Private>0</Private>
</flags>
<temporal mode="0" startField="" endExpression="" endField="" durationUnit="min" enabled="0" startExpression="" accumulate="0" durationField="number" limitMode="0" fixedDuration="0">
<fixedRange>
<start></start>
<end></end>
</fixedRange>
</temporal>
<elevation extrusionEnabled="0" customToleranceEnabled="0" binding="Centroid" symbology="Line" respectLayerSymbol="1" zscale="1" extrusion="0" showMarkerSymbolInSurfacePlots="0" type="IndividualFeatures" clamping="Terrain" zoffset="0">
<data-defined-properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data-defined-properties>
<profileLineSymbol>
<symbol force_rhr="0" clip_to_extent="1" name="" alpha="1" type="line" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleLine" pass="0" id="{76ea39a9-58dc-4293-9c0a-708289975213}">
<Option type="Map">
<Option value="0" name="align_dash_pattern" type="QString"/>
<Option value="square" name="capstyle" type="QString"/>
<Option value="5;2" name="customdash" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="customdash_map_unit_scale" type="QString"/>
<Option value="MM" name="customdash_unit" type="QString"/>
<Option value="0" name="dash_pattern_offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="dash_pattern_offset_map_unit_scale" type="QString"/>
<Option value="MM" name="dash_pattern_offset_unit" type="QString"/>
<Option value="0" name="draw_inside_polygon" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="164,113,88,255,rgb:0.6431373,0.4431373,0.345098,1" name="line_color" type="QString"/>
<Option value="solid" name="line_style" type="QString"/>
<Option value="0.6" name="line_width" type="QString"/>
<Option value="MM" name="line_width_unit" type="QString"/>
<Option value="0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="0" name="ring_filter" type="QString"/>
<Option value="0" name="trim_distance_end" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="trim_distance_end_map_unit_scale" type="QString"/>
<Option value="MM" name="trim_distance_end_unit" type="QString"/>
<Option value="0" name="trim_distance_start" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="trim_distance_start_map_unit_scale" type="QString"/>
<Option value="MM" name="trim_distance_start_unit" type="QString"/>
<Option value="0" name="tweak_dash_pattern_on_corners" type="QString"/>
<Option value="0" name="use_custom_dash" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="width_map_unit_scale" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</profileLineSymbol>
<profileFillSymbol>
<symbol force_rhr="0" clip_to_extent="1" name="" alpha="1" type="fill" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleFill" pass="0" id="{884cf21d-620b-4d32-8432-b75a2eee9d3c}">
<Option type="Map">
<Option value="3x:0,0,0,0,0,0" name="border_width_map_unit_scale" type="QString"/>
<Option value="164,113,88,255,rgb:0.6431373,0.4431373,0.345098,1" name="color" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="117,81,63,255,rgb:0.4593729,0.3165332,0.2464942,1" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0.2" name="outline_width" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="solid" name="style" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</profileFillSymbol>
<profileMarkerSymbol>
<symbol force_rhr="0" clip_to_extent="1" name="" alpha="1" type="marker" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleMarker" pass="0" id="{8536a04d-f7f7-4fb4-97fd-29d00b9109b6}">
<Option type="Map">
<Option value="0" name="angle" type="QString"/>
<Option value="square" name="cap_style" type="QString"/>
<Option value="164,113,88,255,rgb:0.6431373,0.4431373,0.345098,1" name="color" type="QString"/>
<Option value="1" name="horizontal_anchor_point" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="diamond" name="name" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="117,81,63,255,rgb:0.4593729,0.3165332,0.2464942,1" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0.2" name="outline_width" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="outline_width_map_unit_scale" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="diameter" name="scale_method" type="QString"/>
<Option value="3" name="size" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="size_map_unit_scale" type="QString"/>
<Option value="MM" name="size_unit" type="QString"/>
<Option value="1" name="vertical_anchor_point" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</profileMarkerSymbol>
</elevation>
<renderer-v2 forceraster="0" enableorderby="0" type="singleSymbol" referencescale="-1" symbollevels="0">
<symbols>
<symbol force_rhr="0" clip_to_extent="1" name="0" alpha="1" type="marker" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleMarker" pass="0" id="{6e27ccd0-7148-464a-bf2e-3c79e8b865fa}">
<Option type="Map">
<Option value="0" name="angle" type="QString"/>
<Option value="square" name="cap_style" type="QString"/>
<Option value="219,30,42,255,rgb:0.8588235,0.1176471,0.1647059,1" name="color" type="QString"/>
<Option value="1" name="horizontal_anchor_point" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="triangle" name="name" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="128,17,25,255,rgb:0.5019608,0.0666667,0.0980392,1" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0.4" name="outline_width" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="outline_width_map_unit_scale" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="diameter" name="scale_method" type="QString"/>
<Option value="4" name="size" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="size_map_unit_scale" type="QString"/>
<Option value="MM" name="size_unit" type="QString"/>
<Option value="1" name="vertical_anchor_point" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</symbols>
<rotation/>
<sizescale/>
<data-defined-properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data-defined-properties>
</renderer-v2>
<selection mode="Default">
<selectionColor invalid="1"/>
<selectionSymbol>
<symbol force_rhr="0" clip_to_extent="1" name="" alpha="1" type="marker" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleMarker" pass="0" id="{85d39adc-e056-4b00-b3b7-1101a233cae4}">
<Option type="Map">
<Option value="0" name="angle" type="QString"/>
<Option value="square" name="cap_style" type="QString"/>
<Option value="255,0,0,255,rgb:1,0,0,1" name="color" type="QString"/>
<Option value="1" name="horizontal_anchor_point" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="circle" name="name" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="35,35,35,255,rgb:0.1372549,0.1372549,0.1372549,1" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0" name="outline_width" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="outline_width_map_unit_scale" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="diameter" name="scale_method" type="QString"/>
<Option value="2" name="size" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="size_map_unit_scale" type="QString"/>
<Option value="MM" name="size_unit" type="QString"/>
<Option value="1" name="vertical_anchor_point" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</selectionSymbol>
</selection>
<labeling type="simple">
<settings calloutType="simple">
<text-style textColor="255,50,50,255,rgb:1,0.1960784,0.1960784,1" fontItalic="0" forcedItalic="0" fieldName="concat(&quot;shortname&quot;)" tabStopDistanceUnit="Point" legendString="Aa" fontSize="10" multilineHeight="1" multilineHeightUnit="Percentage" isExpression="1" fontFamily="Open Sans" previewBkgrdColor="255,255,255,255,rgb:1,1,1,1" fontSizeUnit="Point" tabStopDistance="80" forcedBold="0" textOpacity="1" fontUnderline="0" blendMode="0" useSubstitutions="0" fontSizeMapUnitScale="3x:0,0,0,0,0,0" textOrientation="horizontal" allowHtml="0" capitalization="0" fontWeight="50" fontStrikeout="0" fontKerning="1" fontLetterSpacing="0" namedStyle="Regular" tabStopDistanceMapUnitScale="3x:0,0,0,0,0,0" fontWordSpacing="0">
<families/>
<text-buffer bufferNoFill="1" bufferBlendMode="0" bufferJoinStyle="128" bufferSizeUnits="MM" bufferDraw="1" bufferSize="1" bufferSizeMapUnitScale="3x:0,0,0,0,0,0" bufferOpacity="1" bufferColor="250,250,250,255,rgb:0.9803922,0.9803922,0.9803922,1"/>
<text-mask maskEnabled="0" maskSize2="1.5" maskOpacity="1" maskSize="1.5" maskedSymbolLayers="" maskSizeUnits="MM" maskType="0" maskSizeMapUnitScale="3x:0,0,0,0,0,0" maskJoinStyle="128"/>
<background shapeOffsetMapUnitScale="3x:0,0,0,0,0,0" shapeBorderWidthUnit="Point" shapeRotationType="0" shapeOffsetY="0" shapeOpacity="1" shapeSizeX="0" shapeRadiiX="0" shapeFillColor="255,255,255,255,rgb:1,1,1,1" shapeBorderColor="128,128,128,255,rgb:0.5019608,0.5019608,0.5019608,1" shapeBorderWidthMapUnitScale="3x:0,0,0,0,0,0" shapeRotation="0" shapeRadiiUnit="Point" shapeRadiiMapUnitScale="3x:0,0,0,0,0,0" shapeSizeUnit="Point" shapeSizeType="0" shapeRadiiY="0" shapeBorderWidth="0" shapeType="0" shapeSizeY="0" shapeDraw="0" shapeOffsetUnit="Point" shapeOffsetX="0" shapeSizeMapUnitScale="3x:0,0,0,0,0,0" shapeBlendMode="0" shapeJoinStyle="64" shapeSVGFile="">
<symbol force_rhr="0" clip_to_extent="1" name="markerSymbol" alpha="1" type="marker" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleMarker" pass="0" id="">
<Option type="Map">
<Option value="0" name="angle" type="QString"/>
<Option value="square" name="cap_style" type="QString"/>
<Option value="114,155,111,255,rgb:0.4470588,0.6078431,0.4352941,1" name="color" type="QString"/>
<Option value="1" name="horizontal_anchor_point" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="circle" name="name" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="35,35,35,255,rgb:0.1372549,0.1372549,0.1372549,1" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0" name="outline_width" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="outline_width_map_unit_scale" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="diameter" name="scale_method" type="QString"/>
<Option value="2" name="size" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="size_map_unit_scale" type="QString"/>
<Option value="MM" name="size_unit" type="QString"/>
<Option value="1" name="vertical_anchor_point" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
<symbol force_rhr="0" clip_to_extent="1" name="fillSymbol" alpha="1" type="fill" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleFill" pass="0" id="">
<Option type="Map">
<Option value="3x:0,0,0,0,0,0" name="border_width_map_unit_scale" type="QString"/>
<Option value="255,255,255,255,rgb:1,1,1,1" name="color" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="128,128,128,255,rgb:0.5019608,0.5019608,0.5019608,1" name="outline_color" type="QString"/>
<Option value="no" name="outline_style" type="QString"/>
<Option value="0" name="outline_width" type="QString"/>
<Option value="Point" name="outline_width_unit" type="QString"/>
<Option value="solid" name="style" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</background>
<shadow shadowOffsetUnit="MM" shadowDraw="0" shadowOffsetDist="1" shadowOffsetMapUnitScale="3x:0,0,0,0,0,0" shadowScale="100" shadowColor="0,0,0,255,rgb:0,0,0,1" shadowOffsetGlobal="1" shadowRadius="1.5" shadowOffsetAngle="135" shadowRadiusAlphaOnly="0" shadowOpacity="0.69999999999999996" shadowRadiusMapUnitScale="3x:0,0,0,0,0,0" shadowBlendMode="6" shadowUnder="0" shadowRadiusUnit="MM"/>
<dd_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</dd_properties>
<substitutions/>
</text-style>
<text-format reverseDirectionSymbol="0" autoWrapLength="0" useMaxLineLengthForAutoWrap="1" decimals="3" wrapChar="" addDirectionSymbol="0" formatNumbers="0" plussign="0" leftDirectionSymbol="&lt;" rightDirectionSymbol=">" multilineAlign="3" placeDirectionSymbol="0"/>
<placement lineAnchorPercent="0.5" preserveRotation="1" prioritization="PreferCloser" dist="0" placement="0" repeatDistance="0" polygonPlacementFlags="2" overrunDistanceUnit="MM" maximumDistance="0" rotationAngle="0" centroidInside="0" maximumDistanceUnit="MM" maxCurvedCharAngleIn="25" offsetType="0" lineAnchorTextPoint="FollowPlacement" repeatDistanceUnits="MM" yOffset="0" centroidWhole="0" geometryGeneratorType="PointGeometry" geometryGeneratorEnabled="0" fitInPolygonOnly="0" predefinedPositionOrder="TR,TL,BR,BL,R,L,TSR,BSR" distUnits="MM" maxCurvedCharAngleOut="-25" offsetUnits="MM" repeatDistanceMapUnitScale="3x:0,0,0,0,0,0" distMapUnitScale="3x:0,0,0,0,0,0" rotationUnit="AngleDegrees" layerType="PointGeometry" overrunDistanceMapUnitScale="3x:0,0,0,0,0,0" overlapHandling="PreventOverlap" priority="5" lineAnchorClipping="0" quadOffset="4" geometryGenerator="" overrunDistance="0" maximumDistanceMapUnitScale="3x:0,0,0,0,0,0" allowDegraded="0" placementFlags="10" labelOffsetMapUnitScale="3x:0,0,0,0,0,0" lineAnchorType="0" xOffset="0"/>
<rendering mergeLines="0" scaleMin="0" maxNumLabels="2000" zIndex="0" scaleVisibility="0" limitNumLabels="0" obstacleType="1" obstacle="1" fontMinPixelSize="3" minFeatureSize="0" upsidedownLabels="0" obstacleFactor="1" fontLimitPixelSize="0" drawLabels="1" unplacedVisibility="0" fontMaxPixelSize="10000" labelPerPart="0" scaleMax="0"/>
<dd_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</dd_properties>
<callout type="simple">
<Option type="Map">
<Option value="pole_of_inaccessibility" name="anchorPoint" type="QString"/>
<Option value="0" name="blendMode" type="int"/>
<Option name="ddProperties" type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
<Option value="false" name="drawToAllParts" type="bool"/>
<Option value="0" name="enabled" type="QString"/>
<Option value="point_on_exterior" name="labelAnchorPoint" type="QString"/>
<Option value="&lt;symbol force_rhr=&quot;0&quot; clip_to_extent=&quot;1&quot; name=&quot;symbol&quot; alpha=&quot;1&quot; type=&quot;line&quot; is_animated=&quot;0&quot; frame_rate=&quot;10&quot;>&lt;data_defined_properties>&lt;Option type=&quot;Map&quot;>&lt;Option value=&quot;&quot; name=&quot;name&quot; type=&quot;QString&quot;/>&lt;Option name=&quot;properties&quot;/>&lt;Option value=&quot;collection&quot; name=&quot;type&quot; type=&quot;QString&quot;/>&lt;/Option>&lt;/data_defined_properties>&lt;layer locked=&quot;0&quot; enabled=&quot;1&quot; class=&quot;SimpleLine&quot; pass=&quot;0&quot; id=&quot;{842d5687-ab2d-4032-a3a1-8be39fed6707}&quot;>&lt;Option type=&quot;Map&quot;>&lt;Option value=&quot;0&quot; name=&quot;align_dash_pattern&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;square&quot; name=&quot;capstyle&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;5;2&quot; name=&quot;customdash&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;customdash_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;customdash_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;dash_pattern_offset&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;dash_pattern_offset_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;dash_pattern_offset_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;draw_inside_polygon&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;bevel&quot; name=&quot;joinstyle&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;60,60,60,255,rgb:0.2352941,0.2352941,0.2352941,1&quot; name=&quot;line_color&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;solid&quot; name=&quot;line_style&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0.3&quot; name=&quot;line_width&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;line_width_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;offset&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;offset_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;offset_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;ring_filter&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;trim_distance_end&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;trim_distance_end_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;trim_distance_end_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;trim_distance_start&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;trim_distance_start_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;trim_distance_start_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;tweak_dash_pattern_on_corners&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;use_custom_dash&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;width_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;/Option>&lt;data_defined_properties>&lt;Option type=&quot;Map&quot;>&lt;Option value=&quot;&quot; name=&quot;name&quot; type=&quot;QString&quot;/>&lt;Option name=&quot;properties&quot;/>&lt;Option value=&quot;collection&quot; name=&quot;type&quot; type=&quot;QString&quot;/>&lt;/Option>&lt;/data_defined_properties>&lt;/layer>&lt;/symbol>" name="lineSymbol" type="QString"/>
<Option value="0" name="minLength" type="double"/>
<Option value="3x:0,0,0,0,0,0" name="minLengthMapUnitScale" type="QString"/>
<Option value="MM" name="minLengthUnit" type="QString"/>
<Option value="0" name="offsetFromAnchor" type="double"/>
<Option value="3x:0,0,0,0,0,0" name="offsetFromAnchorMapUnitScale" type="QString"/>
<Option value="MM" name="offsetFromAnchorUnit" type="QString"/>
<Option value="0" name="offsetFromLabel" type="double"/>
<Option value="3x:0,0,0,0,0,0" name="offsetFromLabelMapUnitScale" type="QString"/>
<Option value="MM" name="offsetFromLabelUnit" type="QString"/>
</Option>
</callout>
</settings>
</labeling>
<customproperties>
<Option type="Map">
<Option value="0" name="embeddedWidgets/count" type="int"/>
<Option name="variableNames"/>
<Option name="variableValues"/>
</Option>
</customproperties>
<blendMode>0</blendMode>
<featureBlendMode>0</featureBlendMode>
<layerOpacity>1</layerOpacity>
<geometryOptions removeDuplicateNodes="0" geometryPrecision="0">
<activeChecks/>
<checkConfiguration/>
</geometryOptions>
<legend type="default-vector" showLabelLegend="0"/>
<referencedLayers/>
<referencingLayers/>
<fieldConfiguration>
<field configurationFlags="NoFlag" name="uuid">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="number">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="shortname">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="longname">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="km">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="agency">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="water">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
</fieldConfiguration>
<aliases>
<alias index="0" name="" field="uuid"/>
<alias index="1" name="" field="number"/>
<alias index="2" name="" field="shortname"/>
<alias index="3" name="" field="longname"/>
<alias index="4" name="" field="km"/>
<alias index="5" name="" field="agency"/>
<alias index="6" name="" field="water"/>
</aliases>
<defaults>
<default expression="" applyOnUpdate="0" field="uuid"/>
<default expression="" applyOnUpdate="0" field="number"/>
<default expression="" applyOnUpdate="0" field="shortname"/>
<default expression="" applyOnUpdate="0" field="longname"/>
<default expression="" applyOnUpdate="0" field="km"/>
<default expression="" applyOnUpdate="0" field="agency"/>
<default expression="" applyOnUpdate="0" field="water"/>
</defaults>
<constraints>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="uuid"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="number"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="shortname"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="longname"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="km"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="agency"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="water"/>
</constraints>
<constraintExpressions>
<constraint exp="" desc="" field="uuid"/>
<constraint exp="" desc="" field="number"/>
<constraint exp="" desc="" field="shortname"/>
<constraint exp="" desc="" field="longname"/>
<constraint exp="" desc="" field="km"/>
<constraint exp="" desc="" field="agency"/>
<constraint exp="" desc="" field="water"/>
</constraintExpressions>
<expressionfields/>
<attributeactions>
<defaultAction value="{00000000-0000-0000-0000-000000000000}" key="Canvas"/>
</attributeactions>
<attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
<columns>
<column hidden="0" name="uuid" type="field" width="-1"/>
<column hidden="0" name="number" type="field" width="-1"/>
<column hidden="0" name="shortname" type="field" width="-1"/>
<column hidden="0" name="longname" type="field" width="-1"/>
<column hidden="0" name="km" type="field" width="-1"/>
<column hidden="0" name="agency" type="field" width="-1"/>
<column hidden="0" name="water" type="field" width="-1"/>
<column hidden="1" type="actions" width="-1"/>
</columns>
</attributetableconfig>
<conditionalstyles>
<rowstyles/>
<fieldstyles/>
</conditionalstyles>
<storedexpressions/>
<editform tolerant="1"></editform>
<editforminit/>
<editforminitcodesource>0</editforminitcodesource>
<editforminitfilepath></editforminitfilepath>
<editforminitcode><![CDATA[# -*- coding: utf-8 -*-
"""
QGIS-Formulare können eine Python-Funktion haben,, die aufgerufen wird, wenn sich das Formular öffnet
Diese Funktion kann verwendet werden um dem Formular Extralogik hinzuzufügen.
Der Name der Funktion wird im Feld "Python Init-Function" angegeben
Ein Beispiel folgt:
"""
from qgis.PyQt.QtWidgets import QWidget
def my_form_open(dialog, layer, feature):
geom = feature.geometry()
control = dialog.findChild(QWidget, "MyLineEdit")
]]></editforminitcode>
<featformsuppress>0</featformsuppress>
<editorlayout>generatedlayout</editorlayout>
<editable>
<field editable="1" name="agency"/>
<field editable="1" name="km"/>
<field editable="1" name="longname"/>
<field editable="1" name="number"/>
<field editable="1" name="shortname"/>
<field editable="1" name="uuid"/>
<field editable="1" name="water"/>
</editable>
<labelOnTop>
<field name="agency" labelOnTop="0"/>
<field name="km" labelOnTop="0"/>
<field name="longname" labelOnTop="0"/>
<field name="number" labelOnTop="0"/>
<field name="shortname" labelOnTop="0"/>
<field name="uuid" labelOnTop="0"/>
<field name="water" labelOnTop="0"/>
</labelOnTop>
<reuseLastValue>
<field reuseLastValue="0" name="agency"/>
<field reuseLastValue="0" name="km"/>
<field reuseLastValue="0" name="longname"/>
<field reuseLastValue="0" name="number"/>
<field reuseLastValue="0" name="shortname"/>
<field reuseLastValue="0" name="uuid"/>
<field reuseLastValue="0" name="water"/>
</reuseLastValue>
<dataDefinedFieldProperties/>
<widgets/>
<previewExpression>"shortname"</previewExpression>
<mapTip enabled="1"></mapTip>
<layerGeometryType>0</layerGeometryType>
</qgis>

575
styles/waterlevels.qml Normal file
View File

@ -0,0 +1,575 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis autoRefreshMode="Disabled" labelsEnabled="1" simplifyDrawingTol="1" simplifyMaxScale="1" version="3.44.3-Solothurn" styleCategories="AllStyleCategories" readOnly="0" maxScale="0" autoRefreshTime="0" simplifyDrawingHints="0" symbologyReferenceScale="-1" simplifyAlgorithm="0" hasScaleBasedVisibilityFlag="0" minScale="100000000" simplifyLocal="1">
<flags>
<Identifiable>1</Identifiable>
<Removable>1</Removable>
<Searchable>1</Searchable>
<Private>0</Private>
</flags>
<temporal mode="0" startField="timestamp" endExpression="" endField="" durationUnit="min" enabled="0" startExpression="" accumulate="0" durationField="number" limitMode="0" fixedDuration="0">
<fixedRange>
<start></start>
<end></end>
</fixedRange>
</temporal>
<elevation extrusionEnabled="0" customToleranceEnabled="0" binding="Centroid" symbology="Line" respectLayerSymbol="1" zscale="1" extrusion="0" showMarkerSymbolInSurfacePlots="0" type="IndividualFeatures" clamping="Terrain" zoffset="0">
<data-defined-properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data-defined-properties>
<profileLineSymbol>
<symbol force_rhr="0" clip_to_extent="1" name="" alpha="1" type="line" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleLine" pass="0" id="{22c3818c-762f-4ad6-af1d-7e890d25c2ff}">
<Option type="Map">
<Option value="0" name="align_dash_pattern" type="QString"/>
<Option value="square" name="capstyle" type="QString"/>
<Option value="5;2" name="customdash" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="customdash_map_unit_scale" type="QString"/>
<Option value="MM" name="customdash_unit" type="QString"/>
<Option value="0" name="dash_pattern_offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="dash_pattern_offset_map_unit_scale" type="QString"/>
<Option value="MM" name="dash_pattern_offset_unit" type="QString"/>
<Option value="0" name="draw_inside_polygon" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="141,90,153,255,rgb:0.5529412,0.3529412,0.6,1" name="line_color" type="QString"/>
<Option value="solid" name="line_style" type="QString"/>
<Option value="0.6" name="line_width" type="QString"/>
<Option value="MM" name="line_width_unit" type="QString"/>
<Option value="0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="0" name="ring_filter" type="QString"/>
<Option value="0" name="trim_distance_end" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="trim_distance_end_map_unit_scale" type="QString"/>
<Option value="MM" name="trim_distance_end_unit" type="QString"/>
<Option value="0" name="trim_distance_start" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="trim_distance_start_map_unit_scale" type="QString"/>
<Option value="MM" name="trim_distance_start_unit" type="QString"/>
<Option value="0" name="tweak_dash_pattern_on_corners" type="QString"/>
<Option value="0" name="use_custom_dash" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="width_map_unit_scale" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</profileLineSymbol>
<profileFillSymbol>
<symbol force_rhr="0" clip_to_extent="1" name="" alpha="1" type="fill" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleFill" pass="0" id="{f6e93f4c-4732-46bf-9b82-1b7798ea9584}">
<Option type="Map">
<Option value="3x:0,0,0,0,0,0" name="border_width_map_unit_scale" type="QString"/>
<Option value="141,90,153,255,rgb:0.5529412,0.3529412,0.6,1" name="color" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="101,64,109,255,rgb:0.3949493,0.2520943,0.4285649,1" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0.2" name="outline_width" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="solid" name="style" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</profileFillSymbol>
<profileMarkerSymbol>
<symbol force_rhr="0" clip_to_extent="1" name="" alpha="1" type="marker" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleMarker" pass="0" id="{c0a279d3-1571-48e9-9ecd-ef0f2743e2fc}">
<Option type="Map">
<Option value="0" name="angle" type="QString"/>
<Option value="square" name="cap_style" type="QString"/>
<Option value="141,90,153,255,rgb:0.5529412,0.3529412,0.6,1" name="color" type="QString"/>
<Option value="1" name="horizontal_anchor_point" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="diamond" name="name" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="101,64,109,255,rgb:0.3949493,0.2520943,0.4285649,1" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0.2" name="outline_width" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="outline_width_map_unit_scale" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="diameter" name="scale_method" type="QString"/>
<Option value="3" name="size" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="size_map_unit_scale" type="QString"/>
<Option value="MM" name="size_unit" type="QString"/>
<Option value="1" name="vertical_anchor_point" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</profileMarkerSymbol>
</elevation>
<renderer-v2 forceraster="0" enableorderby="0" type="singleSymbol" referencescale="-1" symbollevels="0">
<symbols>
<symbol force_rhr="0" clip_to_extent="1" name="0" alpha="1" type="marker" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleMarker" pass="0" id="{9b537c92-5129-49e2-bd68-adcb414d704c}">
<Option type="Map">
<Option value="0" name="angle" type="QString"/>
<Option value="square" name="cap_style" type="QString"/>
<Option value="72,123,182,255,rgb:0.2823529,0.4823529,0.7137255,1" name="color" type="QString"/>
<Option value="1" name="horizontal_anchor_point" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="diamond" name="name" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="50,87,128,255,rgb:0.1960784,0.3411765,0.5019608,1" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0.4" name="outline_width" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="outline_width_map_unit_scale" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="diameter" name="scale_method" type="QString"/>
<Option value="4.4" name="size" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="size_map_unit_scale" type="QString"/>
<Option value="MM" name="size_unit" type="QString"/>
<Option value="1" name="vertical_anchor_point" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</symbols>
<rotation/>
<sizescale/>
<data-defined-properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data-defined-properties>
</renderer-v2>
<selection mode="Default">
<selectionColor invalid="1"/>
<selectionSymbol>
<symbol force_rhr="0" clip_to_extent="1" name="" alpha="1" type="marker" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleMarker" pass="0" id="{5466e585-1a97-4124-b9c1-6f3cb8cb9470}">
<Option type="Map">
<Option value="0" name="angle" type="QString"/>
<Option value="square" name="cap_style" type="QString"/>
<Option value="255,0,0,255,rgb:1,0,0,1" name="color" type="QString"/>
<Option value="1" name="horizontal_anchor_point" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="circle" name="name" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="35,35,35,255,rgb:0.1372549,0.1372549,0.1372549,1" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0" name="outline_width" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="outline_width_map_unit_scale" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="diameter" name="scale_method" type="QString"/>
<Option value="2" name="size" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="size_map_unit_scale" type="QString"/>
<Option value="MM" name="size_unit" type="QString"/>
<Option value="1" name="vertical_anchor_point" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</selectionSymbol>
</selection>
<labeling type="simple">
<settings calloutType="simple">
<text-style textColor="50,50,255,255,rgb:0.1960784,0.1960784,1,1" fontItalic="0" forcedItalic="0" fieldName="concat(&quot;shortname&quot;, ' / ', &quot;value&quot;, ' ', &quot;unit&quot;)" tabStopDistanceUnit="Point" legendString="Aa" fontSize="10" multilineHeight="1" multilineHeightUnit="Percentage" isExpression="1" fontFamily="Open Sans" previewBkgrdColor="255,255,255,255,rgb:1,1,1,1" fontSizeUnit="Point" tabStopDistance="80" forcedBold="0" textOpacity="1" fontUnderline="0" blendMode="0" useSubstitutions="0" fontSizeMapUnitScale="3x:0,0,0,0,0,0" textOrientation="horizontal" allowHtml="0" capitalization="0" fontWeight="50" fontStrikeout="0" fontKerning="1" fontLetterSpacing="0" namedStyle="Regular" tabStopDistanceMapUnitScale="3x:0,0,0,0,0,0" fontWordSpacing="0">
<families/>
<text-buffer bufferNoFill="1" bufferBlendMode="0" bufferJoinStyle="128" bufferSizeUnits="MM" bufferDraw="1" bufferSize="1" bufferSizeMapUnitScale="3x:0,0,0,0,0,0" bufferOpacity="1" bufferColor="255,255,255,255,hsv:0,0,1,1"/>
<text-mask maskEnabled="0" maskSize2="1.5" maskOpacity="1" maskSize="1.5" maskedSymbolLayers="" maskSizeUnits="MM" maskType="0" maskSizeMapUnitScale="3x:0,0,0,0,0,0" maskJoinStyle="128"/>
<background shapeOffsetMapUnitScale="3x:0,0,0,0,0,0" shapeBorderWidthUnit="Point" shapeRotationType="0" shapeOffsetY="0" shapeOpacity="1" shapeSizeX="0" shapeRadiiX="0" shapeFillColor="255,255,255,255,rgb:1,1,1,1" shapeBorderColor="128,128,128,255,rgb:0.5019608,0.5019608,0.5019608,1" shapeBorderWidthMapUnitScale="3x:0,0,0,0,0,0" shapeRotation="0" shapeRadiiUnit="Point" shapeRadiiMapUnitScale="3x:0,0,0,0,0,0" shapeSizeUnit="Point" shapeSizeType="0" shapeRadiiY="0" shapeBorderWidth="0" shapeType="0" shapeSizeY="0" shapeDraw="0" shapeOffsetUnit="Point" shapeOffsetX="0" shapeSizeMapUnitScale="3x:0,0,0,0,0,0" shapeBlendMode="0" shapeJoinStyle="64" shapeSVGFile="">
<symbol force_rhr="0" clip_to_extent="1" name="markerSymbol" alpha="1" type="marker" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleMarker" pass="0" id="">
<Option type="Map">
<Option value="0" name="angle" type="QString"/>
<Option value="square" name="cap_style" type="QString"/>
<Option value="125,139,143,255,rgb:0.4901961,0.545098,0.5607843,1" name="color" type="QString"/>
<Option value="1" name="horizontal_anchor_point" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="circle" name="name" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="35,35,35,255,rgb:0.1372549,0.1372549,0.1372549,1" name="outline_color" type="QString"/>
<Option value="solid" name="outline_style" type="QString"/>
<Option value="0" name="outline_width" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="outline_width_map_unit_scale" type="QString"/>
<Option value="MM" name="outline_width_unit" type="QString"/>
<Option value="diameter" name="scale_method" type="QString"/>
<Option value="2" name="size" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="size_map_unit_scale" type="QString"/>
<Option value="MM" name="size_unit" type="QString"/>
<Option value="1" name="vertical_anchor_point" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
<symbol force_rhr="0" clip_to_extent="1" name="fillSymbol" alpha="1" type="fill" is_animated="0" frame_rate="10">
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
<layer locked="0" enabled="1" class="SimpleFill" pass="0" id="">
<Option type="Map">
<Option value="3x:0,0,0,0,0,0" name="border_width_map_unit_scale" type="QString"/>
<Option value="255,255,255,255,rgb:1,1,1,1" name="color" type="QString"/>
<Option value="bevel" name="joinstyle" type="QString"/>
<Option value="0,0" name="offset" type="QString"/>
<Option value="3x:0,0,0,0,0,0" name="offset_map_unit_scale" type="QString"/>
<Option value="MM" name="offset_unit" type="QString"/>
<Option value="128,128,128,255,rgb:0.5019608,0.5019608,0.5019608,1" name="outline_color" type="QString"/>
<Option value="no" name="outline_style" type="QString"/>
<Option value="0" name="outline_width" type="QString"/>
<Option value="Point" name="outline_width_unit" type="QString"/>
<Option value="solid" name="style" type="QString"/>
</Option>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</background>
<shadow shadowOffsetUnit="MM" shadowDraw="0" shadowOffsetDist="1" shadowOffsetMapUnitScale="3x:0,0,0,0,0,0" shadowScale="100" shadowColor="0,0,0,255,rgb:0,0,0,1" shadowOffsetGlobal="1" shadowRadius="1.5" shadowOffsetAngle="135" shadowRadiusAlphaOnly="0" shadowOpacity="0.69999999999999996" shadowRadiusMapUnitScale="3x:0,0,0,0,0,0" shadowBlendMode="6" shadowUnder="0" shadowRadiusUnit="MM"/>
<dd_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</dd_properties>
<substitutions/>
</text-style>
<text-format reverseDirectionSymbol="0" autoWrapLength="0" useMaxLineLengthForAutoWrap="1" decimals="3" wrapChar="" addDirectionSymbol="0" formatNumbers="0" plussign="0" leftDirectionSymbol="&lt;" rightDirectionSymbol=">" multilineAlign="3" placeDirectionSymbol="0"/>
<placement lineAnchorPercent="0.5" preserveRotation="1" prioritization="PreferCloser" dist="0" placement="0" repeatDistance="0" polygonPlacementFlags="2" overrunDistanceUnit="MM" maximumDistance="0" rotationAngle="0" centroidInside="0" maximumDistanceUnit="MM" maxCurvedCharAngleIn="25" offsetType="0" lineAnchorTextPoint="FollowPlacement" repeatDistanceUnits="MM" yOffset="0" centroidWhole="0" geometryGeneratorType="PointGeometry" geometryGeneratorEnabled="0" fitInPolygonOnly="0" predefinedPositionOrder="TR,TL,BR,BL,R,L,TSR,BSR" distUnits="MM" maxCurvedCharAngleOut="-25" offsetUnits="MM" repeatDistanceMapUnitScale="3x:0,0,0,0,0,0" distMapUnitScale="3x:0,0,0,0,0,0" rotationUnit="AngleDegrees" layerType="PointGeometry" overrunDistanceMapUnitScale="3x:0,0,0,0,0,0" overlapHandling="PreventOverlap" priority="5" lineAnchorClipping="0" quadOffset="4" geometryGenerator="" overrunDistance="0" maximumDistanceMapUnitScale="3x:0,0,0,0,0,0" allowDegraded="0" placementFlags="10" labelOffsetMapUnitScale="3x:0,0,0,0,0,0" lineAnchorType="0" xOffset="0"/>
<rendering mergeLines="0" scaleMin="0" maxNumLabels="2000" zIndex="0" scaleVisibility="0" limitNumLabels="0" obstacleType="1" obstacle="1" fontMinPixelSize="3" minFeatureSize="0" upsidedownLabels="0" obstacleFactor="1" fontLimitPixelSize="0" drawLabels="1" unplacedVisibility="0" fontMaxPixelSize="10000" labelPerPart="0" scaleMax="0"/>
<dd_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</dd_properties>
<callout type="simple">
<Option type="Map">
<Option value="pole_of_inaccessibility" name="anchorPoint" type="QString"/>
<Option value="0" name="blendMode" type="int"/>
<Option name="ddProperties" type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
<Option value="false" name="drawToAllParts" type="bool"/>
<Option value="0" name="enabled" type="QString"/>
<Option value="point_on_exterior" name="labelAnchorPoint" type="QString"/>
<Option value="&lt;symbol force_rhr=&quot;0&quot; clip_to_extent=&quot;1&quot; name=&quot;symbol&quot; alpha=&quot;1&quot; type=&quot;line&quot; is_animated=&quot;0&quot; frame_rate=&quot;10&quot;>&lt;data_defined_properties>&lt;Option type=&quot;Map&quot;>&lt;Option value=&quot;&quot; name=&quot;name&quot; type=&quot;QString&quot;/>&lt;Option name=&quot;properties&quot;/>&lt;Option value=&quot;collection&quot; name=&quot;type&quot; type=&quot;QString&quot;/>&lt;/Option>&lt;/data_defined_properties>&lt;layer locked=&quot;0&quot; enabled=&quot;1&quot; class=&quot;SimpleLine&quot; pass=&quot;0&quot; id=&quot;{0a30b836-1767-4ca1-b70d-a1412d7bd21e}&quot;>&lt;Option type=&quot;Map&quot;>&lt;Option value=&quot;0&quot; name=&quot;align_dash_pattern&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;square&quot; name=&quot;capstyle&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;5;2&quot; name=&quot;customdash&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;customdash_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;customdash_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;dash_pattern_offset&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;dash_pattern_offset_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;dash_pattern_offset_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;draw_inside_polygon&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;bevel&quot; name=&quot;joinstyle&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;60,60,60,255,rgb:0.2352941,0.2352941,0.2352941,1&quot; name=&quot;line_color&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;solid&quot; name=&quot;line_style&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0.3&quot; name=&quot;line_width&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;line_width_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;offset&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;offset_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;offset_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;ring_filter&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;trim_distance_end&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;trim_distance_end_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;trim_distance_end_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;trim_distance_start&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;trim_distance_start_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;MM&quot; name=&quot;trim_distance_start_unit&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;tweak_dash_pattern_on_corners&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;0&quot; name=&quot;use_custom_dash&quot; type=&quot;QString&quot;/>&lt;Option value=&quot;3x:0,0,0,0,0,0&quot; name=&quot;width_map_unit_scale&quot; type=&quot;QString&quot;/>&lt;/Option>&lt;data_defined_properties>&lt;Option type=&quot;Map&quot;>&lt;Option value=&quot;&quot; name=&quot;name&quot; type=&quot;QString&quot;/>&lt;Option name=&quot;properties&quot;/>&lt;Option value=&quot;collection&quot; name=&quot;type&quot; type=&quot;QString&quot;/>&lt;/Option>&lt;/data_defined_properties>&lt;/layer>&lt;/symbol>" name="lineSymbol" type="QString"/>
<Option value="0" name="minLength" type="double"/>
<Option value="3x:0,0,0,0,0,0" name="minLengthMapUnitScale" type="QString"/>
<Option value="MM" name="minLengthUnit" type="QString"/>
<Option value="0" name="offsetFromAnchor" type="double"/>
<Option value="3x:0,0,0,0,0,0" name="offsetFromAnchorMapUnitScale" type="QString"/>
<Option value="MM" name="offsetFromAnchorUnit" type="QString"/>
<Option value="0" name="offsetFromLabel" type="double"/>
<Option value="3x:0,0,0,0,0,0" name="offsetFromLabelMapUnitScale" type="QString"/>
<Option value="MM" name="offsetFromLabelUnit" type="QString"/>
</Option>
</callout>
</settings>
</labeling>
<customproperties>
<Option type="Map">
<Option value="0" name="embeddedWidgets/count" type="int"/>
<Option name="variableNames"/>
<Option name="variableValues"/>
</Option>
</customproperties>
<blendMode>0</blendMode>
<featureBlendMode>0</featureBlendMode>
<layerOpacity>1</layerOpacity>
<geometryOptions removeDuplicateNodes="0" geometryPrecision="0">
<activeChecks/>
<checkConfiguration/>
</geometryOptions>
<legend type="default-vector" showLabelLegend="0"/>
<referencedLayers/>
<referencingLayers/>
<fieldConfiguration>
<field configurationFlags="NoFlag" name="shortname">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="number">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="agency">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="timestamp">
<editWidget type="DateTime">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="value">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="unit">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="mean">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="absolute">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
<field configurationFlags="NoFlag" name="water">
<editWidget type="TextEdit">
<config>
<Option/>
</config>
</editWidget>
</field>
</fieldConfiguration>
<aliases>
<alias index="0" name="" field="shortname"/>
<alias index="1" name="" field="number"/>
<alias index="2" name="" field="agency"/>
<alias index="3" name="" field="timestamp"/>
<alias index="4" name="" field="value"/>
<alias index="5" name="" field="unit"/>
<alias index="6" name="" field="mean"/>
<alias index="7" name="" field="absolute"/>
<alias index="8" name="" field="water"/>
</aliases>
<defaults>
<default expression="" applyOnUpdate="0" field="shortname"/>
<default expression="" applyOnUpdate="0" field="number"/>
<default expression="" applyOnUpdate="0" field="agency"/>
<default expression="" applyOnUpdate="0" field="timestamp"/>
<default expression="" applyOnUpdate="0" field="value"/>
<default expression="" applyOnUpdate="0" field="unit"/>
<default expression="" applyOnUpdate="0" field="mean"/>
<default expression="" applyOnUpdate="0" field="absolute"/>
<default expression="" applyOnUpdate="0" field="water"/>
</defaults>
<constraints>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="shortname"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="number"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="agency"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="timestamp"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="value"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="unit"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="mean"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="absolute"/>
<constraint exp_strength="0" constraints="0" unique_strength="0" notnull_strength="0" field="water"/>
</constraints>
<constraintExpressions>
<constraint exp="" desc="" field="shortname"/>
<constraint exp="" desc="" field="number"/>
<constraint exp="" desc="" field="agency"/>
<constraint exp="" desc="" field="timestamp"/>
<constraint exp="" desc="" field="value"/>
<constraint exp="" desc="" field="unit"/>
<constraint exp="" desc="" field="mean"/>
<constraint exp="" desc="" field="absolute"/>
<constraint exp="" desc="" field="water"/>
</constraintExpressions>
<expressionfields/>
<attributeactions>
<defaultAction value="{00000000-0000-0000-0000-000000000000}" key="Canvas"/>
</attributeactions>
<attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
<columns>
<column hidden="0" name="shortname" type="field" width="-1"/>
<column hidden="0" name="number" type="field" width="-1"/>
<column hidden="0" name="agency" type="field" width="-1"/>
<column hidden="0" name="timestamp" type="field" width="-1"/>
<column hidden="0" name="value" type="field" width="-1"/>
<column hidden="0" name="unit" type="field" width="-1"/>
<column hidden="0" name="mean" type="field" width="-1"/>
<column hidden="0" name="absolute" type="field" width="-1"/>
<column hidden="0" name="water" type="field" width="-1"/>
<column hidden="1" type="actions" width="-1"/>
</columns>
</attributetableconfig>
<conditionalstyles>
<rowstyles/>
<fieldstyles/>
</conditionalstyles>
<storedexpressions/>
<editform tolerant="1"></editform>
<editforminit/>
<editforminitcodesource>0</editforminitcodesource>
<editforminitfilepath></editforminitfilepath>
<editforminitcode><![CDATA[# -*- coding: utf-8 -*-
"""
QGIS-Formulare können eine Python-Funktion haben,, die aufgerufen wird, wenn sich das Formular öffnet
Diese Funktion kann verwendet werden um dem Formular Extralogik hinzuzufügen.
Der Name der Funktion wird im Feld "Python Init-Function" angegeben
Ein Beispiel folgt:
"""
from qgis.PyQt.QtWidgets import QWidget
def my_form_open(dialog, layer, feature):
geom = feature.geometry()
control = dialog.findChild(QWidget, "MyLineEdit")
]]></editforminitcode>
<featformsuppress>0</featformsuppress>
<editorlayout>generatedlayout</editorlayout>
<editable>
<field editable="1" name="agency"/>
<field editable="1" name="number"/>
<field editable="1" name="shortname"/>
<field editable="1" name="mean"/>
<field editable="1" name="absolute"/>
<field editable="1" name="timestamp"/>
<field editable="1" name="unit"/>
<field editable="1" name="value"/>
<field editable="1" name="water"/>
</editable>
<labelOnTop>
<field name="agency" labelOnTop="0"/>
<field name="number" labelOnTop="0"/>
<field name="shortname" labelOnTop="0"/>
<field name="mean" labelOnTop="0"/>
<field name="absolute" labelOnTop="0"/>
<field name="timestamp" labelOnTop="0"/>
<field name="unit" labelOnTop="0"/>
<field name="value" labelOnTop="0"/>
<field name="water" labelOnTop="0"/>
</labelOnTop>
<reuseLastValue>
<field reuseLastValue="0" name="agency"/>
<field reuseLastValue="0" name="number"/>
<field reuseLastValue="0" name="shortname"/>
<field reuseLastValue="0" name="mean"/>
<field reuseLastValue="0" name="absolute"/>
<field reuseLastValue="0" name="timestamp"/>
<field reuseLastValue="0" name="unit"/>
<field reuseLastValue="0" name="value"/>
<field reuseLastValue="0" name="water"/>
</reuseLastValue>
<dataDefinedFieldProperties/>
<widgets/>
<previewExpression>"shortname"</previewExpression>
<mapTip enabled="1"> &lt;h1>[% "shortname" %]&lt;/h1> &lt;table> &lt;tr> &lt;th style='text-align: left'>Nummer:&lt;/th> &lt;td>#[% "number" %]&lt;/td> &lt;/tr> &lt;tr> &lt;th style='text-align: left'>Behörde:&lt;/th> &lt;td>[% "agency" %]&lt;/td> &lt;/tr> &lt;tr> &lt;th style='text-align: left'>Gewässer:&lt;/th> &lt;td>[% "water" %]&lt;/td> &lt;/tr> &lt;tr> &lt;th style='text-align: left'>Zeitstempel:&lt;/th> &lt;td>[% "timestamp" %]&lt;/td> &lt;/tr> &lt;tr> &lt;th style='text-align: left'>Aktueller Pegel:&lt;/th> &lt;td>[% "value" %] [% "unit" %]&lt;/td> &lt;/tr> &lt;tr> &lt;th style='text-align: left'>MNW, MHW:&lt;/th> &lt;td>[% "mean" %]&lt;/td> &lt;/tr> &lt;tr> &lt;th style='text-align: left'>NSW, HSW:&lt;/th> &lt;td>[% "absolute" %]&lt;/td> &lt;/tr> &lt;/table></mapTip>
<layerGeometryType>0</layerGeometryType>
</qgis>