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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user