načítání metadat pro lokality

This commit is contained in:
2026-03-09 18:08:29 +01:00
parent 78bad9aaa7
commit d6d520e612
+85 -36
View File
@@ -74,24 +74,24 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
else: else:
base_params[key] = str(value).strip() base_params[key] = str(value).strip()
docs_akce = [] docs = []
current_page = 0 current_page = 0
BATCH_AKCE = 500 BATCH_DOCS = 500
MAX_LIMIT = 20000 MAX_LIMIT = 20000
seen_ids = set() seen_ids = set()
target_pian_ids_count = 0 target_pian_ids_count = 0
while True: while True:
base_params['rows'] = BATCH_AKCE base_params['rows'] = BATCH_DOCS
if current_page > 0: if current_page > 0:
base_params['page'] = current_page base_params['page'] = current_page
elif 'page' in base_params: elif 'page' in base_params:
del base_params['page'] del base_params['page']
try: try:
resp_akce = requests.get(url, params=base_params, timeout=30) resp_docs = requests.get(url, params=base_params, timeout=30)
resp_json = resp_akce.json() resp_json = resp_docs.json()
data = resp_json.get('response', {}) data = resp_json.get('response', {})
batch_docs = data.get('docs', []) batch_docs = data.get('docs', [])
num_found = data.get('numFound', 0) num_found = data.get('numFound', 0)
@@ -106,12 +106,12 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
seen_ids.add(ident) seen_ids.add(ident)
new_docs.append(d) new_docs.append(d)
docs_akce.extend(new_docs) docs.extend(new_docs)
print(f"Strana {current_page} stažena. Celkem záznamů: {len(docs_akce)} / {num_found}") print(f"Strana {current_page} stažena. Celkem záznamů: {len(docs)} / {num_found}")
if len(docs_akce) >= num_found: if len(docs) >= num_found:
break break
if len(docs_akce) >= MAX_LIMIT: if len(docs) >= MAX_LIMIT:
iface.messageBar().pushMessage("AMCR", f"Limit {MAX_LIMIT} záznamů dosažen.", level=1) iface.messageBar().pushMessage("AMCR", f"Limit {MAX_LIMIT} záznamů dosažen.", level=1)
break break
@@ -122,8 +122,8 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
print(f"Chyba při stránkování na straně {current_page}: {e}") print(f"Chyba při stránkování na straně {current_page}: {e}")
break break
if not docs_akce: if not docs:
iface.messageBar().pushMessage("AMCR", "Žádné akce nenalezeny.", level=1) iface.messageBar().pushMessage("AMCR", "Žádné záznamy nenalezeny.", level=1)
return return
# ========================================== # ==========================================
@@ -133,29 +133,29 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
target_pian_ids = set() target_pian_ids = set()
actions_with_geom = 0 actions_with_geom = 0
for akce in docs_akce: for doc in docs:
piani = akce.get('az_dj_pian', []) piani = doc.get('az_dj_pian', [])
if not piani: if not piani:
continue continue
actions_with_geom += 1 actions_with_geom += 1
def g(key, default=""): def g(key, default=""):
val = akce.get(key) val = doc.get(key)
if isinstance(val, list): if isinstance(val, list):
return str(val[0]) if val else default return str(val[0]) if val else default
return str(val) if val is not None else default return str(val) if val is not None else default
def g_list(key, translate=False): def g_list(key, translate=False):
val = akce.get(key, []) val = doc.get(key, [])
if not isinstance(val, list): if not isinstance(val, list):
val = [val] if val else [] val = [val] if val else []
if translate: if translate:
return ", ".join([tr_code(str(x)) for x in val if x]) return ", ".join([tr_code(str(x)) for x in val if x])
return ", ".join([str(x) for x in val if x]) return ", ".join([str(x) for x in val if x])
az_chranene = akce.get('az_chranene_udaje', {}) az_chranene = doc.get('az_chranene_udaje', {})
akce_chranene = akce.get('akce_chranene_udaje', {}) chranene = doc.get('akce_chranene_udaje') or doc.get('lokalita_chranene_udaje') or {}
dalsi_kat = az_chranene.get('dalsi_katastr', []) dalsi_kat = az_chranene.get('dalsi_katastr', [])
dalsi_kat_str = "" dalsi_kat_str = ""
@@ -163,14 +163,22 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
items = [x.get('value', '') if isinstance(x, dict) else str(x) for x in dalsi_kat] items = [x.get('value', '') if isinstance(x, dict) else str(x) for x in dalsi_kat]
dalsi_kat_str = ", ".join([i for i in items if i]) dalsi_kat_str = ", ".join([i for i in items if i])
lokalizace = akce_chranene.get('lokalizace_okolnosti', "") lokalizace = chranene.get('lokalizace_okolnosti', "")
lokalita_nazev = chranene.get('nazev', "")
lokalita_popis = chranene.get('popis', "")
# Prepate metadata for fieldwork event # Prepate common metadata
meta = { meta = {
"ident_cely": akce.get('ident_cely', ''), "ident_cely": doc.get('ident_cely', ''),
"az_okres": g('az_okres'), "az_okres": g('az_okres'),
"katastr": g_list('katastr'), "katastr": g_list('katastr'),
"dalsi_katastr": dalsi_kat_str, "dalsi_katastr": dalsi_kat_str,
"pristupnost": g('pristupnost'),
"loc": g_list('loc')
}
if typ_dat == "akce":
meta.update({
"akce_hlavni_vedouci": g('akce_hlavni_vedouci'), "akce_hlavni_vedouci": g('akce_hlavni_vedouci'),
"akce_organizace": tr_code(g('akce_organizace')), "akce_organizace": tr_code(g('akce_organizace')),
"akce_specifikace_data": tr_code(g('akce_specifikace_data')), "akce_specifikace_data": tr_code(g('akce_specifikace_data')),
@@ -179,12 +187,19 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
"akce_hlavni_typ": tr_code(g('akce_hlavni_typ')), "akce_hlavni_typ": tr_code(g('akce_hlavni_typ')),
"akce_vedlejsi_typ": g_list('akce_vedlejsi_typ', translate=True), "akce_vedlejsi_typ": g_list('akce_vedlejsi_typ', translate=True),
"lokalizace_okolnosti": str(lokalizace) if lokalizace else "", "lokalizace_okolnosti": str(lokalizace) if lokalizace else "",
"akce_je_nz": "Ano" if akce.get('akce_je_nz') is True else "Ne", "akce_je_nz": "Ano" if doc.get('akce_je_nz') is True else "Ne",
"pristupnost": g('pristupnost'), })
"loc": g_list('loc')
}
djs = akce.get('az_dokumentacni_jednotka', []) elif typ_dat == "lokalita":
meta.update({
"lokalita_nazev": lokalita_nazev,
"lokalita_popis": lokalita_popis,
"lokalita_zachovalost": tr_code(g('lokalita_zachovalost')),
"lokalita_druh": tr_code(g('lokalita_druh')),
"lokalita_typ": tr_code(g('lokalita_typ_lokality')),
})
djs = doc.get('az_dokumentacni_jednotka', [])
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:
@@ -206,7 +221,7 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
pian_lookup[dj_pian_value].append(dj_meta) pian_lookup[dj_pian_value].append(dj_meta)
if not target_pian_ids: if not target_pian_ids:
iface.messageBar().pushMessage("AMCR", f"Nalezeno {len(docs_akce)} akcí, ale žádná nemá geometrii.", level=1) iface.messageBar().pushMessage("AMCR", f"Nalezeno {len(docs)} akcí, ale žádná nemá geometrii.", level=1)
return return
@@ -218,7 +233,7 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
docs_pian = [] docs_pian = []
BATCH_PIAN = 50 BATCH_PIAN = 50
iface.messageBar().pushMessage("AMCR", f"Akcí: {len(docs_akce)} (z toho {actions_with_geom} s mapou). Stahuji {total_pians} unikátních geometrií, vykresluji {target_pian_ids_count} geometrií...", level=1) iface.messageBar().pushMessage("AMCR", f"Akcí: {len(docs)} (z toho {actions_with_geom} s mapou). Stahuji {total_pians} unikátních geometrií, vykresluji {target_pian_ids_count} geometrií...", level=1)
# Seznam polí pro PIAN # Seznam polí pro PIAN
fl_pian = ["ident_cely", "pian_typ", "pian_chranene_udaje", "pian_presnost"] fl_pian = ["ident_cely", "pian_typ", "pian_chranene_udaje", "pian_presnost"]
@@ -251,6 +266,11 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
vl_point = QgsVectorLayer("Point?crs=epsg:5514", "AMCR Body", "memory") vl_point = QgsVectorLayer("Point?crs=epsg:5514", "AMCR Body", "memory")
layers = [vl_poly, vl_line, vl_point] layers = [vl_poly, vl_line, vl_point]
if typ_dat == "akce":
archeologicky_zaznam = "Akce"
elif typ_dat == "lokalita":
archeologicky_zaznam = "ID lokality"
# Definice sloupců atributové tabulky # Definice sloupců atributové tabulky
cols = [ cols = [
QgsField("PIAN", QVariant.String), QgsField("PIAN", QVariant.String),
@@ -259,11 +279,15 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
QgsField("Dokumentační jednotka", QVariant.String), QgsField("Dokumentační jednotka", QVariant.String),
QgsField("Typ dokumentační jednotky", QVariant.String), QgsField("Typ dokumentační jednotky", QVariant.String),
QgsField("Definiční bod(y) (WGS-84)", QVariant.String), QgsField("Definiční bod(y) (WGS-84)", QVariant.String),
QgsField("Akce", QVariant.String), QgsField(archeologicky_zaznam, QVariant.String),
QgsField("Odkaz do Digitálního archivu AMČR", QVariant.String), QgsField("Odkaz do Digitálního archivu AMČR", QVariant.String),
QgsField("Okres", QVariant.String), QgsField("Okres", QVariant.String),
QgsField("Katastr", QVariant.String), QgsField("Katastr", QVariant.String),
QgsField("Další katastry", QVariant.String), QgsField("Další katastry", QVariant.String)
]
if typ_dat == "akce":
cols += [
QgsField("Vedoucí akce", QVariant.String), QgsField("Vedoucí akce", QVariant.String),
QgsField("Organizace", QVariant.String), QgsField("Organizace", QVariant.String),
QgsField("Specifikace data", QVariant.String), QgsField("Specifikace data", QVariant.String),
@@ -274,8 +298,17 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
QgsField("Zjištění", QVariant.String), QgsField("Zjištění", QVariant.String),
QgsField("Akce lokalizace", QVariant.String), QgsField("Akce lokalizace", QVariant.String),
QgsField("Akce nahrazuje NZ", QVariant.String), QgsField("Akce nahrazuje NZ", QVariant.String),
QgsField("Přístupnost", QVariant.String)
] ]
elif typ_dat == "lokalita":
cols += [
QgsField("Název lokality", QVariant.String),
QgsField("Popis lokality", QVariant.String),
QgsField("Typ lokality", QVariant.String),
QgsField("Druh lokality", QVariant.String),
QgsField("Zachovalost", QVariant.String)
]
cols.append(QgsField("Přístupnost", QVariant.String))
for vl in layers: for vl in layers:
vl.dataProvider().addAttributes(cols) vl.dataProvider().addAttributes(cols)
@@ -317,7 +350,7 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
for meta in metas: for meta in metas:
feat = QgsFeature() feat = QgsFeature()
feat.setGeometry(geom) feat.setGeometry(geom)
feat.setAttributes([ atributy = [
pid, pid,
pian_presnost, pian_presnost,
pian_typ, pian_typ,
@@ -328,7 +361,10 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
"https://digiarchiv.aiscr.cz/id/" + meta['ident_cely'], "https://digiarchiv.aiscr.cz/id/" + meta['ident_cely'],
meta['az_okres'], meta['az_okres'],
meta['katastr'], meta['katastr'],
meta['dalsi_katastr'], meta['dalsi_katastr']
]
if typ_dat == "akce":
atributy += [
meta['akce_hlavni_vedouci'], meta['akce_hlavni_vedouci'],
meta['akce_organizace'], meta['akce_organizace'],
meta['akce_specifikace_data'], meta['akce_specifikace_data'],
@@ -338,9 +374,22 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
meta['akce_vedlejsi_typ'], meta['akce_vedlejsi_typ'],
meta['dj_negativni'], meta['dj_negativni'],
meta['lokalizace_okolnosti'], meta['lokalizace_okolnosti'],
meta['akce_je_nz'], meta['akce_je_nz']
meta['pristupnost'] ]
])
elif typ_dat == "lokalita":
atributy += [
meta['lokalita_nazev'],
meta['lokalita_popis'],
meta['lokalita_typ'],
meta['lokalita_druh'],
meta['lokalita_zachovalost']
]
atributy.append(meta['pristupnost'])
feat.setAttributes(atributy)
t = geom.type() t = geom.type()
if t == QgsWkbTypes.PolygonGeometry: if t == QgsWkbTypes.PolygonGeometry:
feats_p.append(feat) feats_p.append(feat)
@@ -363,7 +412,7 @@ def load_amcr_data(canvas, bb, filters=None, typ_dat="akce"):
added += len(f) added += len(f)
if added > 0: if added > 0:
iface.messageBar().pushMessage("AMCR", f"Hotovo. Akcí: {len(docs_akce)} (s geom: {actions_with_geom}). Vykresleno: {added} prvků.", level=0) iface.messageBar().pushMessage("AMCR", f"Hotovo. Akcí: {len(docs)} (s geom: {actions_with_geom}). Vykresleno: {added} prvků.", level=0)
else: else:
iface.messageBar().pushMessage("AMCR", "Žádná data k zobrazení.", level=1) iface.messageBar().pushMessage("AMCR", "Žádná data k zobrazení.", level=1)