From 0f07a40bb0f8edaa19b7f5e54b844731eb9eb990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Wed, 18 Feb 2026 22:13:30 +0100 Subject: [PATCH] Added logic for filtering based on PIAN accuracy Features with a "location by cadastral area" attribute are disabled by default. --- amcr_viewer/amcr_codelists.py | 3 +- amcr_viewer/amcr_dialog.py | 58 ++++++++++++++++++++++---------- amcr_viewer/amcr_tools.py | 6 +++- amcr_viewer/codelists/heslar.csv | 4 +++ 4 files changed, 52 insertions(+), 19 deletions(-) diff --git a/amcr_viewer/amcr_codelists.py b/amcr_viewer/amcr_codelists.py index 48e2461..17ec670 100644 --- a/amcr_viewer/amcr_codelists.py +++ b/amcr_viewer/amcr_codelists.py @@ -62,7 +62,7 @@ def load_all_data(): categorized_data = { 'obdobi': {}, 'typ_akce': {}, 'areal': {}, 'kraj': {}, 'organizace': {}, 'okres': {}, 'katastr': {}, - 'vedouci': {} + 'vedouci': {}, 'pian_presnost': {} } # Funkce pro roztřídění načteného slovníku (tohle je trochu redundance, ale pro zachování logiky) @@ -157,6 +157,7 @@ ORGANIZACE = _DATA['organizace'] OKRESY = _DATA['okres'] KATASTRY = _DATA['katastr'] VEDOUCI = _DATA['vedouci'] # Tady to bude zpočátku prázdné, pokud soubor neexistuje +PIAN_PRESNOST = _DATA['pian_presnost'] def refresh_vedouci_cache(): """ diff --git a/amcr_viewer/amcr_dialog.py b/amcr_viewer/amcr_dialog.py index 2e40c27..26de3fe 100644 --- a/amcr_viewer/amcr_dialog.py +++ b/amcr_viewer/amcr_dialog.py @@ -6,7 +6,7 @@ from qgis.PyQt.QtWidgets import (QDialog, QVBoxLayout, QFormLayout, QLabel, QMessageBox, QApplication, QWidget) from qgis.PyQt.QtCore import Qt from .amcr_codelists import (OBDOBI, TYP_AKCE, KRAJE, AREAL, ORGANIZACE, - OKRESY, KATASTRY, VEDOUCI, + OKRESY, KATASTRY, VEDOUCI, PIAN_PRESNOST, download_vedouci, refresh_vedouci_cache) class FilterableSelectionDialog(QDialog): @@ -37,16 +37,20 @@ class FilterableSelectionDialog(QDialog): item = QListWidgetItem(name) item.setData(Qt.UserRole, code) item.setFlags(item.flags() | Qt.ItemIsUserCheckable) - if code in self.preselected: item.setCheckState(Qt.Checked) - else: item.setCheckState(Qt.Unchecked) + if code in self.preselected: + item.setCheckState(Qt.Checked) + else: + item.setCheckState(Qt.Unchecked) self.list_widget.addItem(item) def filter_list(self, text): search_text = text.lower() for i in range(self.list_widget.count()): item = self.list_widget.item(i) - if search_text not in item.text().lower(): item.setHidden(True) - else: item.setHidden(False) + if search_text not in item.text().lower(): + item.setHidden(True) + else: + item.setHidden(False) def get_selected_codes(self): codes = [] @@ -69,7 +73,7 @@ class AmcrFilterDialog(QDialog): # Cache for filtering self.selection_cache = { 'organizace': [], 'kraj': [], 'obdobi': [], 'areal': [], - 'typ_akce': [], 'okres': [], 'katastr': [], 'vedouci': [] + 'typ_akce': [], 'okres': [], 'katastr': [], 'vedouci': [], 'pian_presnost': [] } layout = QVBoxLayout() @@ -103,9 +107,15 @@ class AmcrFilterDialog(QDialog): if dlg.exec_() == QDialog.Accepted: codes, labels = dlg.get_selected_codes() self.selection_cache[cache_key] = codes - if labels: display_field.setText(", ".join(labels)) - else: display_field.clear() + if labels: + display_field.setText(", ".join(labels)) + else: + display_field.clear() + if cache_key == 'pian_presnost': + display_field.setText("odchylka jednotky metrů, odchylka desítky metrů, odchylka stovky metrů") + self.selection_cache[cache_key] = ['HES-000861', 'HES-000862', 'HES-000863'] + btn.clicked.connect(open_dialog) row_layout.addWidget(display_field) @@ -146,6 +156,9 @@ class AmcrFilterDialog(QDialog): self.picker_typ = setup_picker("Typ výzkumu", 'typ_akce', TYP_AKCE) layout.addWidget(self.picker_typ) + self.picker_presnost = setup_picker("PIAN – přesnost", 'pian_presnost', PIAN_PRESNOST) + layout.addWidget(self.picker_presnost) + layout.addStretch(1) buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) @@ -175,16 +188,27 @@ class AmcrFilterDialog(QDialog): def get_filters(self): filters = {} - if self.chk_posevidence.isChecked(): filters['posevidence'] = 'true' + if self.chk_posevidence.isChecked(): + filters['posevidence'] = 'true' # Loading from cache - if self.selection_cache['organizace']: filters['f_organizace'] = self.selection_cache['organizace'] - if self.selection_cache['kraj']: filters['f_kraj'] = self.selection_cache['kraj'] - if self.selection_cache['okres']: filters['f_okres'] = self.selection_cache['okres'] - if self.selection_cache['katastr']: filters['f_katastr'] = self.selection_cache['katastr'] - if self.selection_cache['obdobi']: filters['f_obdobi'] = self.selection_cache['obdobi'] - if self.selection_cache['areal']: filters['f_areal'] = self.selection_cache['areal'] - if self.selection_cache['typ_akce']: filters['f_typ_vyzkumu'] = self.selection_cache['typ_akce'] - if self.selection_cache['vedouci']: filters['f_vedouci'] = self.selection_cache['vedouci'] + if self.selection_cache['organizace']: + filters['f_organizace'] = self.selection_cache['organizace'] + if self.selection_cache['kraj']: + filters['f_kraj'] = self.selection_cache['kraj'] + if self.selection_cache['okres']: + filters['f_okres'] = self.selection_cache['okres'] + if self.selection_cache['katastr']: + filters['f_katastr'] = self.selection_cache['katastr'] + if self.selection_cache['obdobi']: + filters['f_obdobi'] = self.selection_cache['obdobi'] + if self.selection_cache['areal']: + filters['f_areal'] = self.selection_cache['areal'] + if self.selection_cache['typ_akce']: + filters['f_typ_vyzkumu'] = self.selection_cache['typ_akce'] + if self.selection_cache['vedouci']: + filters['f_vedouci'] = self.selection_cache['vedouci'] + if self.selection_cache['pian_presnost']: + filters['f_pian_presnost'] = self.selection_cache['pian_presnost'] return filters \ No newline at end of file diff --git a/amcr_viewer/amcr_tools.py b/amcr_viewer/amcr_tools.py index 8a0e446..6e3d1c6 100644 --- a/amcr_viewer/amcr_tools.py +++ b/amcr_viewer/amcr_tools.py @@ -187,6 +187,7 @@ def load_amcr_data(canvas, bb, filters=None): for dj in djs: if filters and filters.get('posevidence') == 'true' and dj.get('dj_negativni_jednotka') is True: continue + dj_meta = meta.copy() dj_meta['dj_id'] = dj.get('ident_cely') dj_typ = dj.get('dj_typ') @@ -282,7 +283,7 @@ def load_amcr_data(canvas, bb, filters=None): pid = doc.get('ident_cely', '') if pid not in pian_lookup: continue - + meta = pian_lookup[pid] # Geometry processing @@ -301,6 +302,9 @@ def load_amcr_data(canvas, bb, filters=None): pian_presnost = tr_code(str(doc.get('pian_presnost', ''))) pian_typ = tr_code(str(doc.get('pian_typ', ''))) + if filters and filters.get('f_pian_presnost') and doc.get('pian_presnost') not in filters.get('f_pian_presnost'): + continue + if wkt: geom = QgsGeometry.fromWkt(wkt) if geom.isGeosValid(): diff --git a/amcr_viewer/codelists/heslar.csv b/amcr_viewer/codelists/heslar.csv index 0ed61cc..4da02d1 100644 --- a/amcr_viewer/codelists/heslar.csv +++ b/amcr_viewer/codelists/heslar.csv @@ -13614,3 +13614,7 @@ Zvotoky;Zvotoky;katastr Žumberk u Nových Hradů;Žumberk u Nových Hradů;katastr Županovice;Županovice;katastr Županovice u Dešné;Županovice u Dešné;katastr +odchylka jednotky metrů;HES-000861;pian_presnost +odchylka desítky metrů;HES-000862;pian_presnost +odchylka stovky metrů;HES-000863;pian_presnost +poloha podle katastru;HES-000864;pian_presnost \ No newline at end of file