načítání metadat pro lokality

This commit is contained in:
2026-03-09 18:08:29 +01:00
parent 78bad9aaa7
commit d6d520e612
+110 -61
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,28 +163,43 @@ 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,
"akce_hlavni_vedouci": g('akce_hlavni_vedouci'),
"akce_organizace": tr_code(g('akce_organizace')),
"akce_specifikace_data": tr_code(g('akce_specifikace_data')),
"akce_datum_zahajeni": g('akce_datum_zahajeni'),
"akce_datum_ukonceni": g('akce_datum_ukonceni'),
"akce_hlavni_typ": tr_code(g('akce_hlavni_typ')),
"akce_vedlejsi_typ": g_list('akce_vedlejsi_typ', translate=True),
"lokalizace_okolnosti": str(lokalizace) if lokalizace else "",
"akce_je_nz": "Ano" if akce.get('akce_je_nz') is True else "Ne",
"pristupnost": g('pristupnost'), "pristupnost": g('pristupnost'),
"loc": g_list('loc') "loc": g_list('loc')
} }
if typ_dat == "akce":
meta.update({
"akce_hlavni_vedouci": g('akce_hlavni_vedouci'),
"akce_organizace": tr_code(g('akce_organizace')),
"akce_specifikace_data": tr_code(g('akce_specifikace_data')),
"akce_datum_zahajeni": g('akce_datum_zahajeni'),
"akce_datum_ukonceni": g('akce_datum_ukonceni'),
"akce_hlavni_typ": tr_code(g('akce_hlavni_typ')),
"akce_vedlejsi_typ": g_list('akce_vedlejsi_typ', translate=True),
"lokalizace_okolnosti": str(lokalizace) if lokalizace else "",
"akce_je_nz": "Ano" if doc.get('akce_je_nz') is True else "Ne",
})
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 = akce.get('az_dokumentacni_jednotka', []) 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,24 +279,37 @@ 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)
QgsField("Vedoucí akce", QVariant.String),
QgsField("Organizace", QVariant.String),
QgsField("Specifikace data", QVariant.String),
QgsField("Datum zahájeni", QVariant.String),
QgsField("Datum ukončení", QVariant.String),
QgsField("Hlavní typ", QVariant.String),
QgsField("Vedlejší typ", QVariant.String),
QgsField("Zjištění", QVariant.String),
QgsField("Akce lokalizace", QVariant.String),
QgsField("Akce nahrazuje NZ", QVariant.String),
QgsField("Přístupnost", QVariant.String)
] ]
if typ_dat == "akce":
cols += [
QgsField("Vedoucí akce", QVariant.String),
QgsField("Organizace", QVariant.String),
QgsField("Specifikace data", QVariant.String),
QgsField("Datum zahájeni", QVariant.String),
QgsField("Datum ukončení", QVariant.String),
QgsField("Hlavní typ", QVariant.String),
QgsField("Vedlejší typ", QVariant.String),
QgsField("Zjištění", QVariant.String),
QgsField("Akce lokalizace", QVariant.String),
QgsField("Akce nahrazuje NZ", 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)
vl.updateFields() vl.updateFields()
@@ -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,19 +361,35 @@ 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']
meta['akce_hlavni_vedouci'], ]
meta['akce_organizace'], if typ_dat == "akce":
meta['akce_specifikace_data'], atributy += [
meta['akce_datum_zahajeni'], meta['akce_hlavni_vedouci'],
meta['akce_datum_ukonceni'], meta['akce_organizace'],
meta['akce_hlavni_typ'], meta['akce_specifikace_data'],
meta['akce_vedlejsi_typ'], meta['akce_datum_zahajeni'],
meta['dj_negativni'], meta['akce_datum_ukonceni'],
meta['lokalizace_okolnosti'], meta['akce_hlavni_typ'],
meta['akce_je_nz'], meta['akce_vedlejsi_typ'],
meta['pristupnost'] meta['dj_negativni'],
]) meta['lokalizace_okolnosti'],
meta['akce_je_nz']
]
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)