stahování komponent

This commit is contained in:
2026-03-10 20:02:58 +01:00
parent f9bfe02597
commit 6b39a05207
3 changed files with 80 additions and 8 deletions
+6 -2
View File
@@ -190,9 +190,10 @@ class AmcrFilterDialog(QDialog):
self.picker_areal = setup_picker("Areál", 'areal', AREAL) self.picker_areal = setup_picker("Areál", 'areal', AREAL)
layout.addWidget(self.picker_areal) layout.addWidget(self.picker_areal)
self.chk_komponenty = QCheckBox("Načíst komponenty")
layout.addWidget(self.chk_komponenty)
layout.addStretch(1) layout.addStretch(1)
buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
@@ -220,6 +221,9 @@ class AmcrFilterDialog(QDialog):
def get_bbox(self): def get_bbox(self):
return "true" if self.chk_bbox.isChecked() else "false" return "true" if self.chk_bbox.isChecked() else "false"
def get_komponenty(self):
return "true" if self.chk_komponenty.isChecked() else "false"
def get_filters(self): def get_filters(self):
filters = {} filters = {}
+72 -5
View File
@@ -2,7 +2,7 @@
from qgis.gui import QgsMapToolIdentifyFeature from qgis.gui import QgsMapToolIdentifyFeature
from qgis.core import (QgsProject, QgsVectorLayer, QgsFeature, QgsGeometry, from qgis.core import (QgsProject, QgsVectorLayer, QgsFeature, QgsGeometry,
QgsField, QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsField, QgsCoordinateReferenceSystem, QgsCoordinateTransform,
QgsWkbTypes) QgsWkbTypes, QgsRelation, QgsEditorWidgetSetup)
from qgis.utils import iface from qgis.utils import iface
from qgis.PyQt.QtCore import QVariant, Qt from qgis.PyQt.QtCore import QVariant, Qt
from qgis.PyQt.QtWidgets import QMessageBox, QApplication from qgis.PyQt.QtWidgets import QMessageBox, QApplication
@@ -33,7 +33,7 @@ def tr_code(code):
return "" return ""
return TRANSLATIONS.get(code, code) return TRANSLATIONS.get(code, code)
def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"): def load_amcr_data(canvas, bb, filters=None, typ_dat="akce", komponenty="false"):
load_translations() load_translations()
# 1. Bounding box # 1. Bounding box
@@ -78,6 +78,7 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
current_page = 0 current_page = 0
BATCH_DOCS = 500 BATCH_DOCS = 500
MAX_LIMIT = 20000 MAX_LIMIT = 20000
feats_k = []
seen_ids = set() seen_ids = set()
target_pian_ids_count = 0 target_pian_ids_count = 0
@@ -206,7 +207,8 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
continue continue
dj_meta = meta.copy() dj_meta = meta.copy()
dj_meta['dj_id'] = dj.get('ident_cely') dj_id = dj.get('ident_cely')
dj_meta['dj_id'] = dj_id
dj_typ = dj.get('dj_typ') dj_typ = dj.get('dj_typ')
dj_meta['dj_typ_value'] = dj_typ.get('value') if dj_typ else "" dj_meta['dj_typ_value'] = dj_typ.get('value') if dj_typ else ""
dj_meta['dj_negativni'] = "Negativní" if dj.get('dj_negativni_jednotka') is True else "Pozitivní" dj_meta['dj_negativni'] = "Negativní" if dj.get('dj_negativni_jednotka') is True else "Pozitivní"
@@ -220,6 +222,20 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
pian_lookup[dj_pian_value] = [] pian_lookup[dj_pian_value] = []
pian_lookup[dj_pian_value].append(dj_meta) pian_lookup[dj_pian_value].append(dj_meta)
if komponenty == "true":
komps = dj.get('dj_komponenta', [])
for komp in komps:
feat = QgsFeature()
atributy = [
komp.get('ident_cely', ""),
dj_id,
# komponenta_aktivita ..?,
komp.get('komponenta_areal', {}).get('value', ""),
komp.get('komponenta_obdobi', {}).get('value', "")
]
feat.setAttributes(atributy)
feats_k.append(feat)
if not target_pian_ids: if not target_pian_ids:
iface.messageBar().pushMessage("AMCR", f"Nalezeno {len(docs)} záznamů, ale žádný nemá geometrii.", level=1) iface.messageBar().pushMessage("AMCR", f"Nalezeno {len(docs)} záznamů, ale žádný nemá geometrii.", level=1)
return return
@@ -310,6 +326,23 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
cols.append(QgsField("Přístupnost", QVariant.String)) cols.append(QgsField("Přístupnost", QVariant.String))
if komponenty == "true":
vl_komponenty = QgsVectorLayer("None", "AMCR Komponenty", "memory")
pr = vl_komponenty.dataProvider()
komponenty_cols = [
QgsField("komponenta", QVariant.String), # ident_cely
QgsField("dj_id", QVariant.String),
# potenciálně QgsField("komponenta_aktivita", QVariant.String),
QgsField("komponenta_areal", QVariant.String),
QgsField("komponenta_obdobi", QVariant.String)
]
pr.addAttributes(komponenty_cols)
vl_komponenty.updateFields()
idx_dj_id = vl_komponenty.fields().indexOf("dj_id")
text_setup = QgsEditorWidgetSetup("TextEdit", {})
vl_komponenty.setEditorWidgetSetup(idx_dj_id, text_setup)
for vl in layers: for vl in layers:
vl.dataProvider().addAttributes(cols) vl.dataProvider().addAttributes(cols)
vl.updateFields() vl.updateFields()
@@ -403,16 +436,50 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
proj = QgsProject.instance() proj = QgsProject.instance()
added = 0 added = 0
for f, l, n in [(feats_p, vl_poly, "Plochy"), (feats_l, vl_line, "Linie"), (feats_pt, vl_point, "Body")]: layers_to_process = [
(feats_p, vl_poly, "Plochy"),
(feats_l, vl_line, "Linie"),
(feats_pt, vl_point, "Body"),
]
if komponenty == "true":
layers_to_process.append((feats_k, vl_komponenty, "Komponenty"))
for f, l, n in layers_to_process:
if f: if f:
l.dataProvider().addFeatures(f) l.dataProvider().addFeatures(f)
l.updateExtents() l.updateExtents()
l.setName(f"AMČR {n} (Filtrováno)") l.setName(f"AMČR {n} (Filtrováno)")
proj.addMapLayer(l) proj.addMapLayer(l)
added += len(f) if n != "Komponenty":
added += len(f)
if added > 0: if added > 0:
iface.messageBar().pushMessage("AMCR", f"Hotovo. Záznamů: {len(docs)} (s geom: {actions_with_geom}). Vykresleno: {added} prvků.", level=0) iface.messageBar().pushMessage("AMCR", f"Hotovo. Záznamů: {len(docs)} (s geom: {actions_with_geom}). Vykresleno: {added} prvků.", level=0)
# Relation
if komponenty == "true":
parent_layers = [
(vl_poly, "Plochy"),
(vl_line, "Linie"),
(vl_point, "Body")
]
rel_manager = proj.relationManager()
for parent_layer, label in parent_layers:
rel = QgsRelation()
#rel_id = f"rel_{parent_layer.id()}_komponenty"
rel_name = f"Komponenty pro {label}"
#rel.setId(rel_id)
rel.setName(rel_name)
rel.setReferencingLayer(vl_komponenty.id())
rel.setReferencedLayer(parent_layer.id())
rel.addFieldPair("dj_id", "Dokumentační jednotka") # Upravit název parent sloupce po změně názvů sloupců u vrstev akcí/lokalit
rel.generateId()
if rel.isValid():
rel_manager.addRelation(rel)
else:
print(f"Relace pro {label} není validní!")
else: else:
iface.messageBar().pushMessage("AMCR", "Žádná data k zobrazení.", level=1) iface.messageBar().pushMessage("AMCR", "Žádná data k zobrazení.", level=1)
+2 -1
View File
@@ -119,6 +119,7 @@ class AmcrViewer:
if result == 1: if result == 1:
filters = dlg.get_filters() filters = dlg.get_filters()
bbox = dlg.get_bbox() bbox = dlg.get_bbox()
komponenty = dlg.get_komponenty()
canvas = self.iface.mapCanvas() canvas = self.iface.mapCanvas()
load_amcr_data(canvas, bbox, filters, typ_dat) load_amcr_data(canvas, bbox, filters, typ_dat, komponenty)