mirror of
https://github.com/ARUP-CAS/aiscr-qgis-amcr-viewer.git
synced 2026-06-19 04:12:55 +02:00
Added logic for filtering based on PIAN accuracy
Features with a "location by cadastral area" attribute are disabled by default.
This commit is contained in:
@@ -62,7 +62,7 @@ def load_all_data():
|
|||||||
categorized_data = {
|
categorized_data = {
|
||||||
'obdobi': {}, 'typ_akce': {}, 'areal': {},
|
'obdobi': {}, 'typ_akce': {}, 'areal': {},
|
||||||
'kraj': {}, 'organizace': {}, 'okres': {}, 'katastr': {},
|
'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)
|
# 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']
|
OKRESY = _DATA['okres']
|
||||||
KATASTRY = _DATA['katastr']
|
KATASTRY = _DATA['katastr']
|
||||||
VEDOUCI = _DATA['vedouci'] # Tady to bude zpočátku prázdné, pokud soubor neexistuje
|
VEDOUCI = _DATA['vedouci'] # Tady to bude zpočátku prázdné, pokud soubor neexistuje
|
||||||
|
PIAN_PRESNOST = _DATA['pian_presnost']
|
||||||
|
|
||||||
def refresh_vedouci_cache():
|
def refresh_vedouci_cache():
|
||||||
"""
|
"""
|
||||||
|
|||||||
+41
-17
@@ -6,7 +6,7 @@ from qgis.PyQt.QtWidgets import (QDialog, QVBoxLayout, QFormLayout,
|
|||||||
QLabel, QMessageBox, QApplication, QWidget)
|
QLabel, QMessageBox, QApplication, QWidget)
|
||||||
from qgis.PyQt.QtCore import Qt
|
from qgis.PyQt.QtCore import Qt
|
||||||
from .amcr_codelists import (OBDOBI, TYP_AKCE, KRAJE, AREAL, ORGANIZACE,
|
from .amcr_codelists import (OBDOBI, TYP_AKCE, KRAJE, AREAL, ORGANIZACE,
|
||||||
OKRESY, KATASTRY, VEDOUCI,
|
OKRESY, KATASTRY, VEDOUCI, PIAN_PRESNOST,
|
||||||
download_vedouci, refresh_vedouci_cache)
|
download_vedouci, refresh_vedouci_cache)
|
||||||
|
|
||||||
class FilterableSelectionDialog(QDialog):
|
class FilterableSelectionDialog(QDialog):
|
||||||
@@ -37,16 +37,20 @@ class FilterableSelectionDialog(QDialog):
|
|||||||
item = QListWidgetItem(name)
|
item = QListWidgetItem(name)
|
||||||
item.setData(Qt.UserRole, code)
|
item.setData(Qt.UserRole, code)
|
||||||
item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
|
item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
|
||||||
if code in self.preselected: item.setCheckState(Qt.Checked)
|
if code in self.preselected:
|
||||||
else: item.setCheckState(Qt.Unchecked)
|
item.setCheckState(Qt.Checked)
|
||||||
|
else:
|
||||||
|
item.setCheckState(Qt.Unchecked)
|
||||||
self.list_widget.addItem(item)
|
self.list_widget.addItem(item)
|
||||||
|
|
||||||
def filter_list(self, text):
|
def filter_list(self, text):
|
||||||
search_text = text.lower()
|
search_text = text.lower()
|
||||||
for i in range(self.list_widget.count()):
|
for i in range(self.list_widget.count()):
|
||||||
item = self.list_widget.item(i)
|
item = self.list_widget.item(i)
|
||||||
if search_text not in item.text().lower(): item.setHidden(True)
|
if search_text not in item.text().lower():
|
||||||
else: item.setHidden(False)
|
item.setHidden(True)
|
||||||
|
else:
|
||||||
|
item.setHidden(False)
|
||||||
|
|
||||||
def get_selected_codes(self):
|
def get_selected_codes(self):
|
||||||
codes = []
|
codes = []
|
||||||
@@ -69,7 +73,7 @@ class AmcrFilterDialog(QDialog):
|
|||||||
# Cache for filtering
|
# Cache for filtering
|
||||||
self.selection_cache = {
|
self.selection_cache = {
|
||||||
'organizace': [], 'kraj': [], 'obdobi': [], 'areal': [],
|
'organizace': [], 'kraj': [], 'obdobi': [], 'areal': [],
|
||||||
'typ_akce': [], 'okres': [], 'katastr': [], 'vedouci': []
|
'typ_akce': [], 'okres': [], 'katastr': [], 'vedouci': [], 'pian_presnost': []
|
||||||
}
|
}
|
||||||
|
|
||||||
layout = QVBoxLayout()
|
layout = QVBoxLayout()
|
||||||
@@ -103,9 +107,15 @@ class AmcrFilterDialog(QDialog):
|
|||||||
if dlg.exec_() == QDialog.Accepted:
|
if dlg.exec_() == QDialog.Accepted:
|
||||||
codes, labels = dlg.get_selected_codes()
|
codes, labels = dlg.get_selected_codes()
|
||||||
self.selection_cache[cache_key] = codes
|
self.selection_cache[cache_key] = codes
|
||||||
if labels: display_field.setText(", ".join(labels))
|
if labels:
|
||||||
else: display_field.clear()
|
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)
|
btn.clicked.connect(open_dialog)
|
||||||
|
|
||||||
row_layout.addWidget(display_field)
|
row_layout.addWidget(display_field)
|
||||||
@@ -146,6 +156,9 @@ class AmcrFilterDialog(QDialog):
|
|||||||
self.picker_typ = setup_picker("Typ výzkumu", 'typ_akce', TYP_AKCE)
|
self.picker_typ = setup_picker("Typ výzkumu", 'typ_akce', TYP_AKCE)
|
||||||
layout.addWidget(self.picker_typ)
|
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)
|
layout.addStretch(1)
|
||||||
|
|
||||||
buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
||||||
@@ -175,16 +188,27 @@ class AmcrFilterDialog(QDialog):
|
|||||||
|
|
||||||
def get_filters(self):
|
def get_filters(self):
|
||||||
filters = {}
|
filters = {}
|
||||||
if self.chk_posevidence.isChecked(): filters['posevidence'] = 'true'
|
if self.chk_posevidence.isChecked():
|
||||||
|
filters['posevidence'] = 'true'
|
||||||
|
|
||||||
# Loading from cache
|
# Loading from cache
|
||||||
if self.selection_cache['organizace']: filters['f_organizace'] = self.selection_cache['organizace']
|
if self.selection_cache['organizace']:
|
||||||
if self.selection_cache['kraj']: filters['f_kraj'] = self.selection_cache['kraj']
|
filters['f_organizace'] = self.selection_cache['organizace']
|
||||||
if self.selection_cache['okres']: filters['f_okres'] = self.selection_cache['okres']
|
if self.selection_cache['kraj']:
|
||||||
if self.selection_cache['katastr']: filters['f_katastr'] = self.selection_cache['katastr']
|
filters['f_kraj'] = self.selection_cache['kraj']
|
||||||
if self.selection_cache['obdobi']: filters['f_obdobi'] = self.selection_cache['obdobi']
|
if self.selection_cache['okres']:
|
||||||
if self.selection_cache['areal']: filters['f_areal'] = self.selection_cache['areal']
|
filters['f_okres'] = self.selection_cache['okres']
|
||||||
if self.selection_cache['typ_akce']: filters['f_typ_vyzkumu'] = self.selection_cache['typ_akce']
|
if self.selection_cache['katastr']:
|
||||||
if self.selection_cache['vedouci']: filters['f_vedouci'] = self.selection_cache['vedouci']
|
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
|
return filters
|
||||||
@@ -187,6 +187,7 @@ def load_amcr_data(canvas, bb, filters=None):
|
|||||||
for dj in djs:
|
for dj in djs:
|
||||||
if filters and filters.get('posevidence') == 'true' and dj.get('dj_negativni_jednotka') is True:
|
if filters and filters.get('posevidence') == 'true' and dj.get('dj_negativni_jednotka') is True:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
dj_meta = meta.copy()
|
dj_meta = meta.copy()
|
||||||
dj_meta['dj_id'] = dj.get('ident_cely')
|
dj_meta['dj_id'] = dj.get('ident_cely')
|
||||||
dj_typ = dj.get('dj_typ')
|
dj_typ = dj.get('dj_typ')
|
||||||
@@ -282,7 +283,7 @@ def load_amcr_data(canvas, bb, filters=None):
|
|||||||
pid = doc.get('ident_cely', '')
|
pid = doc.get('ident_cely', '')
|
||||||
if pid not in pian_lookup:
|
if pid not in pian_lookup:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
meta = pian_lookup[pid]
|
meta = pian_lookup[pid]
|
||||||
|
|
||||||
# Geometry processing
|
# Geometry processing
|
||||||
@@ -301,6 +302,9 @@ def load_amcr_data(canvas, bb, filters=None):
|
|||||||
pian_presnost = tr_code(str(doc.get('pian_presnost', '')))
|
pian_presnost = tr_code(str(doc.get('pian_presnost', '')))
|
||||||
pian_typ = tr_code(str(doc.get('pian_typ', '')))
|
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:
|
if wkt:
|
||||||
geom = QgsGeometry.fromWkt(wkt)
|
geom = QgsGeometry.fromWkt(wkt)
|
||||||
if geom.isGeosValid():
|
if geom.isGeosValid():
|
||||||
|
|||||||
@@ -13614,3 +13614,7 @@ Zvotoky;Zvotoky;katastr
|
|||||||
Žumberk u Nových Hradů;Žumberk u Nových Hradů;katastr
|
Žumberk u Nových Hradů;Žumberk u Nových Hradů;katastr
|
||||||
Županovice;Županovice;katastr
|
Županovice;Županovice;katastr
|
||||||
Županovice u Dešné;Županovice u Dešné;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
|
||||||
|
Reference in New Issue
Block a user