Drei Fehler, die erst der erweiterte Headless-Test gegen die echte Schnittstelle sichtbar
gemacht hat (11.09.2026, alle drei Anbieter plus Vererbung und Stil):
1. WMS-Layer kamen als "Provider is not valid" zurück. Der Rasterprovider erwartet seine
Parameter mit "&" getrennt statt mit Leerzeichen wie die Vektorprovider — und "styles"
muss dabei sein, auch leer. Beides durchgemessen am wms_geosn_dop-rgb: ohne "styles"
ungültig, mit "&"+"styles=" gültig in 0,2 s. Ein fertiger URI wird durchgereicht.
2. "Dienste holen" lieferte bis zu eine Minute lang die alte Liste. Die Schnittstelle
antwortet mit "Cache-Control: private, max-age=60", damit ein Ladelauf nicht alles neu
holt — bei einem Klick des Nutzers ist das aber falsch: wer gerade im Manager einen
Dienst eingetragen hat, will ihn sehen. dienste_laden und stil_anwenden fragen jetzt
frisch.
3. Gesteuert wird das über den forceRefresh-Parameter von QgsBlockingNetworkRequest.get/post,
NICHT über CacheLoadControlAttribute am Request: das Attribut wird intern überschrieben
und blieb wirkungslos.
Der Test in tools/headless_dienste_test.py deckt jetzt auch ab, was das Plugin bisher nicht
sah, weil alle 44 Altdaten ArcGIS-REST sind: WMS und WFS bauen, Ausblenden wirkt und lässt
sich zurücknehmen, ein Stil bleibt beim Ändern ohne QML stehen und lässt sich entfernen.
Angelegte Proben räumt der Lauf selbst wieder ab.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Erik, 11.09.2026: "als angemeldeter Nutzer TG-spezifisch die Dienste aus der
Linkliste einbinden".
- vln_karten/linkliste.py (neu): holt GET /v2/linkliste?vkz=…, baut je Anbieter
den passenden Layer (wms, wfs, rest/ArcGIS, geojson/ogr), wendet den beim
Eintrag hinterlegten QML-Stil an und haengt alles schrittweise in die Gruppe
"Geodienste <VKZ> <Name>" mit Untergruppen je Listengruppe.
- Seitenleiste: neuer Block "Geodienste (Linkliste)" mit Liste holen, Haken je
Dienst (Name, Gruppe, Herkunft, Stil-Hinweis), alle an/aus und Ausgewaehlte
laden.
- Die Liste kommt fertig aufgeloest vom Server; das Plugin rechnet nichts nach.
Zwei Dinge, die der Test gezeigt hat (tools/headless_dienste_test.py, QGIS 4.2
ohne Fenster gegen die Live-Schnittstelle):
* Die Adressform muss schlicht "url=<Adresse>" sein, wie in
Plugin_SN_Basis/modules/LayerLoader.py. Mit einem selbst gebauten
QgsDataSourceUri (crs, format) kam der ArcGIS-Layer erst nach 60 s und
ungueltig zurueck; jetzt 0,4 s und 4457 Objekte.
* Ein 404 auf style.qml erreicht QgsBlockingNetworkRequest als Transportfehler.
Erst den Statuscode ansehen, sonst meldet das Plugin einen Fehler, wo schlicht
kein Stil hinterlegt ist.
Testlauf 11.09.2026: 44 Dienste in 0,8 s, Layer gueltig, Stil angewendet,
"kein Stil hinterlegt" sauber gemeldet — 0 Fehler.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Erik, 08.09.2026: "in die GUI das Speichern via OGC einbauen, GeoJSON nicht mehr
verwenden."
- Seitenleiste hat jetzt zwei Bloecke: "Layer" (Auswahl, laden, Aenderungen
speichern) und "Darstellung" (Stil, Vorlage-Haken).
- Neuer Knopf "Aenderungen speichern" -> VlnKartenPlugin.run_save_edits():
schliesst die offenen Bearbeitungssitzungen ALLER geladenen OAPIF-Layer auf
einmal; ohne offene Bearbeitung kommt ein Hinweis statt einer Aktion.
Zurueckgeschrieben wird ohnehin je Feature (Part 4), der Knopf beendet nur die
Sitzung.
- Der GeoJSON-Weg ist raus: die vier Datensatz-Knoepfe, "Aktiven Layer
hochladen", DATASETS, run_load_dataset, run_upload_active_layer,
_confirm_replace_existing, vln_karten/layer_manager.py sowie
KartenApiClient.load_layer_complete/save_feature_collection.
- Stil-Hinweise angepasst: den Stil des eigenen Verfahrens darf jeder speichern,
die Vorlage nur die Gruppe MODUL_KARTENSTIL (Server-PR #565).
Geprueft headless mit QGIS 4.2 gegen die Live-API (TG Test 27998): ohne
Bearbeitung Hinweis, mit Aenderung Sitzung geschlossen, API zaehlt +1, Feature
sichtbar, danach wieder aufgeraeumt. Panel-Test deckt die neuen Knoepfe ab.
metadata.txt 0.5.0.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Der OAPIF-Provider fragt je Sammlung nacheinander Sammlung, Schema, Stil,
OPTIONS und die erste Seite ab — bei 27 Sammlungen dauert das Anlegen 20,5 s
(gemessen 08.09.2026, Berbisdorf).
- ogc_layers.vorwaermen(): holt Landing, OpenAPI, Conformance, Sammlung, Schema
und Stil vorab und gleichzeitig ueber Qts Ereignisschleife (unter 1,5 s fuer
84 Antworten). layer_hinzufuegen ruft es vor dem ersten Layer auf. Ergebnis
14,2 s statt 20,5 s, und die Zeit schwankt deutlich weniger.
- Seitenleiste: drei Haken (Verfahren / Vorerhebung / Massnahmenblaetter) waehlen
aus, was geladen wird. Nur Verfahren 11,1 s (21 Layer), nur Vorerhebung oder
nur Massnahmenblaetter je 1,6 s (3 Layer).
Bewusst NICHT parallel: ein in einem Python-Thread gebauter OAPIF-Layer laesst
sich zwar in 0,9 s erzeugen, stuerzt aber beim ersten getFeatures() ab
(Segfault, gemessen) — der Provider gehoert dem Thread, der ihn gebaut hat.
tools/headless_panel_test.py prueft die neue Auswahl mit. metadata.txt 0.4.0.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Erik, 08.09.2026: "ich will keine Toolbar, sondern so eine Seitenleiste auf der
rechten Seite."
- vln_karten/panel.py (neu): andockbares QDockWidget, rechts angedockt, mit den
Abschnitten Anmeldung, Verfahren, OGC API und Klassisch (GeoJSON) sowie einer
Statuszeile. Reine Oberflaeche; Klicks gehen als Rueckrufe ans Plugin.
- Verfahrensliste bekommt ein Suchfeld (Hausregel: Auswahllisten immer mit
Filter). Die Auswahl bleibt beim Filtern erhalten, "kein Treffer" liefert
kein VKZ.
- Der Stil-Knopf hat jetzt ein Haekchen "als Vorlage fuer alle Verfahren"; die
Umschalttaste wirkt weiterhin.
- Abmelden ist ein eigener Knopf (verwirft den gespeicherten API-Key).
- Menue Web -> VLN Karten -> "Seitenleiste anzeigen" blendet sie wieder ein.
- tools/headless_panel_test.py: prueft Zustaende, Filter, Rueckrufe und rendert
das Layout als PNG (QGIS 4.2 offscreen). Lauf am 08.09.2026: 17 Pruefungen,
0 Fehler, 285 Verfahren in der Liste.
- README und metadata.txt (0.3.0) nachgezogen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- ogc_layers.stil_anwenden(): GET …/style.qml, in eine Temp-Datei, loadNamedStyle; scheitert
der Abruf, bleibt die QGIS-Zufallsfarbe (kein Abbruch des Ladens).
- ogc_layers.stil_speichern(): saveNamedStyle -> PUT; 403 meldet die fehlende Gruppe im Klartext.
- plugin.run_save_style(): Knopf 'Stil des aktiven Layers speichern'; mit Umschalttaste als
Vorlage der Art (gilt fuer alle Verfahren, z. B. Karte alter Stand).
- README: Abschnitt Stile samt Routen und Berechtigung.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Erik (07.09.2026): "zuerst soll ein Loginfenster kommen und nach dem Login soll der Apikey
gespeichert werden."
- plugin.py: ohne gespeicherten Key zeigt initGui 1,5 s nach dem QGIS-Start den
Anmeldedialog (singleShot, damit der Dialog den Start nicht blockiert); mit Key wie
bisher direkt die Verfahrensliste.
- Nach erfolgreichem Login werden api_key (userauth) UND mail in QSettings gemerkt, die
Meldung nennt den angemeldeten Nutzer und die Dauerhaftigkeit. Das Passwort wird nie
gespeichert.
- README: Login-Verhalten; Abschnitt zum PAC-Proxy, der jede QGIS-Anfrage ~10 s kostet
(gemessen 07.09.2026: Server antwortet in 0,35 s, alle Antworten 200/204).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Mit QGIS 4.2.0 am 07.09.2026 gemessen: 0 Fehler. README nennt die Server-Anforderungen
(service-desc/OpenAPI, Part-5-Schema, OPTIONS Allow, Merge Patch).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Seit dem 07.09.2026 bietet die API OGC API Features (Part 1/2/3/4) unter /v2/ogc. Neu:
- vln_karten/ogc_layers.py: Auth-Konfiguration "APIHeader" (X-API-Key aus dem Login,
kein Passwort in QGIS), GET /ogc/collections?vkz=, je Sammlung ein QgsVectorLayer(...,
"OAPIF") in Gruppen (Vorerhebung / Massnahmenblaetter / Verfahren); Speicher-CRS je
Sammlung (EPSG:25833 bzw. CRS84).
- plugin.py: Toolbar-Aktion "Alle Layer (OGC API) laden" (run_load_ogc).
- README: Weg ohne Plugin (Datenquellenverwaltung, Basic oder API-Header), Sammlungs-IDs,
Schreibregeln (in place, Vorerhebung nur "bearbeitung", Massnahmenblatt blatt_*),
Routenuebersicht; klassischer GeoJSON-Weg bleibt als zweiter Abschnitt.
- metadata: 0.2.0.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Tabellennamen der Server-Datenbank gehen API-Nutzer nichts an —
beschrieben wird nur noch die Schnittstelle selbst.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Das Repo ist als Beispiel für die Ansteuerung der Karten-API aus QGIS
gedacht: README beginnt jetzt mit einem PyQGIS-Minimalbeispiel
(Login -> GET -> PUT), benennt die drei Stolpersteine (EPSG:25833,
gemischte Geometrietypen, PUT ersetzt alles) und führt das Plugin als
Referenz-Implementierung ein. metadata.txt-Beschreibung entsprechend.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Lädt Verfahrensgebiet, Plan 41, Karte alter Stand (KAS) und Wertermittlung
(WE) je VKZ vollständig aus KARTE_OBJEKT (Listen-Endpunkt mit Paging) und
schreibt sie per PUT zurück. Einmaliger Login (mail/password -> userauth),
API-Key persistiert in QSettings; Verfahrens-Auswahl in der Toolbar wird
je QGIS-Projekt gemerkt. Gemischte Geometrietypen werden beim Laden in
Punkte-/Linien-/Flächen-Layer gesplittet und beim Hochladen wieder
vereint. Qt5/Qt6-kompatibel (QGIS 3.22+ und QGIS 4).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>