mirror of
https://github.com/ARUP-CAS/aiscr-qgis-amcr-viewer.git
synced 2026-06-17 11:22:53 +02:00
Merge pull request #21 from ARUP-CAS/komponenty
Přidání možnosti stahovat data komponent k archeologickým záznamům
This commit is contained in:
@@ -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 = {}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user