Widmungen und Verkehrszeichen laden, Schilder lokal ablegen

Der Server liefert seit heute die Sammlung widmung-<vkz>-punkt|-linie mit einem Stil, der
die Schilder selbst malt, dazu blattzeichen-<vkz> mit den neuen Zeichen am Weg. Das Plugin
kannte beides nicht -- die Gruppenzuordnung fiel auf "Weitere", und die Seitenleiste
filterte das heraus.

* GRUPPEN kennt jetzt widmung ("Widmungen & Verkehrszeichen", eigener Haken in der
  Seitenleiste) und blattzeichen (laeuft in der Gruppe der Maßnahmenblaetter mit).
* Neues Modul zeichen_katalog.py: holt /v2/zeichen/katalog.json (oeffentlich, wird neben den
  Grafiken abgelegt, damit die Palette auch ohne Netz oeffnet), laedt fehlende Schilder nach
  <Profil>/svg/vln/<code>.svg, traegt den Ordner in die SVG-Suchpfade ein und schreibt im
  Stil das Adressen-Praefix auf "vln/" um. Fehlt eine Datei, bleibt die Serveradresse stehen
  -- so zeichnet QGIS sie weiter aus dem Netz, im Druck und offline stimmt es trotzdem.
* Beim Laden eines Zeichen-Layers werden die Grafiken bereitgestellt, BEVOR der Stil greift;
  sonst zeigt der Ausdruck auf eine Datei, die es lokal noch nicht gibt.
* api_client.roh() holt eine Datei roh und ohne Anmeldung; Fehler geben b"" zurueck, ein
  fehlendes Schild darf nichts abbrechen.

Headless gemessen (QGIS 4.2, offscreen): Katalog 890 Zeichen, drei Grafiken geholt, ein
unbekannter Code sauber als fehlend gemeldet, Suchpfad eingetragen, Stil lokalisiert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
KAI
2026-09-21 11:17:45 +02:00
co-authored by Claude Opus 5
parent 3a9075f635
commit d79dff1093
5 changed files with 272 additions and 6 deletions
+35 -3
View File
@@ -51,6 +51,9 @@ SETTINGS_AUTHCFG = "ogc_authcfg"
GRUPPEN = [
("vorerhebung", "Vorerhebung"),
("massnahmeblatt", "Maßnahmenblätter"),
# Die neuen Zeichen am Weg gehoeren zum Blatt, also in dessen Gruppe.
("blattzeichen", "Maßnahmenblätter"),
("widmung", "Widmungen & Verkehrszeichen"),
("umringe", "Verfahren"),
("p41", "Verfahren"),
("ngg", "Verfahren"),
@@ -135,9 +138,16 @@ def stil_anwenden(layer, base_url, cid, api_key=None, authcfg=None):
if antwort.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute) != 200:
return False, "HTTP %s" % antwort.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute)
quelle = bytes(antwort.rawHeader(b"X-Stil-Quelle")).decode() or "?"
roh = bytes(antwort.content()).decode("utf-8", "replace")
# Schildgrafiken aus der lokalen Ablage nehmen, wo sie liegt (s. zeichen_katalog).
try:
from . import zeichen_katalog as zk
roh, _ = zk.stil_lokalisieren(roh, base_url)
except Exception: # noqa: BLE001
pass
pfad = os.path.join(tempfile.gettempdir(), "vln_%s.qml" % cid.replace("*", "_"))
with open(pfad, "wb") as fh:
fh.write(bytes(antwort.content()))
with open(pfad, "w", encoding="utf-8") as fh:
fh.write(roh)
meldung, ok = layer.loadNamedStyle(pfad)
if ok:
layer.triggerRepaint()
@@ -260,7 +270,25 @@ def vorwaermen(base_url, collections, api_key=None, authcfg=None, gleichzeitig=8
return geholt
def layer_hinzufuegen(iface, base_url, vkz, vkz_name, collections, authcfg=None, api_key=None):
def _schilder_bereitstellen(client, layer):
"""Die Schildgrafiken der geladenen Zeichen lokal ablegen (best effort).
Ohne lokale Dateien zeichnet QGIS die Schilder aus dem Netz — im Druck und offline
bleibt die Karte dann leer (Erik, 21.09.2026: „lokal ablegen, URL als Rückfall").
"""
try:
from . import zeichen_katalog as zk
codes = zk.codes_im_layer(layer)
if not codes:
return
zk.pfad_registrieren()
zk.sichere_svgs(client, codes)
except Exception: # noqa: BLE001
pass # Beiwerk, kein Abbruch
def layer_hinzufuegen(iface, base_url, vkz, vkz_name, collections, authcfg=None, api_key=None,
client=None):
"""Alle Sammlungen als OAPIF-Layer in die Gruppe „VLN <Verfahren>" hängen — **schrittweise**.
Warum nicht in einer Schleife: der OAPIF-Provider stellt beim Anlegen jedes Layers mehrere
@@ -317,6 +345,10 @@ def layer_hinzufuegen(iface, base_url, vkz, vkz_name, collections, authcfg=None,
layer = QgsVectorLayer(layer_uri(base_url, cid, authcfg, coll.get("storageCrs"), api_key),
titel, "OAPIF")
if layer.isValid():
# Verkehrszeichen brauchen ihre Grafiken, BEVOR der Stil greift — sonst zeigt der
# Ausdruck auf eine Datei, die es lokal nicht gibt, und QGIS malt ein Fragezeichen.
if cid.startswith(("widmung-", "blattzeichen-")) and client is not None:
_schilder_bereitstellen(client, layer)
stil_anwenden(layer, base_url, cid, api_key, authcfg) # Darstellung wie im Web-GIS
projekt.addMapLayer(layer, False)
untergruppen[gruppen_name].addLayer(layer)