erik 091ef281b0 QGIS-Plugin VLN Karten: Verfahrens-Layer der Karten-API laden und hochladen
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>
2026-06-12 13:31:44 +02:00

VLN Karten — QGIS-Plugin für die Karten-API des VLN Managers

QGIS-Plugin, das die Karten-Layer des VLN Managers direkt in QGIS bearbeitbar macht. Es liest und schreibt dieselben Datenbank-Daten (KARTE_OBJEKT), die auch das Web-GIS (karte.flurneuordnung-sachsen.de) über die /maps/*-Endpunkte nutzt.

Funktionen

  • Einmaliger Login mit dem VLN-Manager-Konto (E-Mail/Passwort). Der zurückgelieferte API-Key wird in den QGIS-Einstellungen gespeichert und bei jedem QGIS-Start automatisch wiederverwendet; erst bei HTTP 401/403 erscheint der Anmeldedialog erneut.

  • Verfahrens-Auswahl in der Toolbar — alle Teilnehmergemeinschaften aus GET /tgen als „VKZ — Name“. Die Auswahl wird in der Projektdatei gespeichert und beim Öffnen des Projekts wiederhergestellt.

  • Vier Layer je Verfahren laden:

    Button API-Layer DB-Art
    Verfahrensgebiet umringe UMRING
    Plan 41 (Wege- und Gewässerplan) p41 P41
    Karte alter Stand kas KAS
    Wertermittlung we WE

    Geladen wird vollständig über den Listen-Endpunkt mit limit/offset-Paging — auch bei mehr als 2000 Objekten.

  • Gemischte Geometrietypen: Die API liefert Punkte, Linien und Flächen in einer FeatureCollection. Beim Laden wird nach Geometrie-Familie in bis zu drei Memory-Layer gesplittet (Single-Typen werden zu Multi-Typen befördert); bei nur einem Typ entsteht ein einzelner Layer.

  • Hochladen: „Aktiven Layer hochladen“ vereint alle Teil-Layer desselben Datensatzes (Punkte + Linien + Flächen derselben VKZ) wieder zu einer FeatureCollection und schreibt sie per PUT zurück. Vorher: Commit offener Bearbeitungssitzungen und Sicherheitsabfrage mit Auflistung der beteiligten Layer.

  • Schutz vor Duplikaten: Erneutes Laden eines bereits geladenen Datensatzes ersetzt die vorhandenen Layer nach Rückfrage, statt sie zu stapeln. Liefert der Server 0 Objekte, wird das deutlich gemeldet und ein leerer Layer zum Digitalisieren angelegt.

Voraussetzungen

  • QGIS 3.22 oder neuer, einschließlich QGIS 4 (Qt6/PyQt6 — der Code verwendet durchgehend scoped Enums und exec()).
  • Ein VLN-Manager-Konto mit Zugriff auf die Karten-API.

Installation

Repository klonen und den Plugin-Ordner in das QGIS-Profil verlinken (alternativ kopieren), dann QGIS neu starten:

git clone https://entwicklung.flurneuordnung-sachsen.de/VLN_SN/API_Karte_QGISDemo.git
cd API_Karte_QGISDemo

# macOS, QGIS 4 (bei QGIS 3: "QGIS4" durch "QGIS3" ersetzen):
ln -s "$PWD/vln_karten" \
  ~/Library/Application\ Support/QGIS/QGIS4/profiles/default/python/plugins/vln_karten

# Linux:
#   ~/.local/share/QGIS/QGIS4/profiles/default/python/plugins/
# Windows:
#   %APPDATA%\QGIS\QGIS4\profiles\default\python\plugins\

Anschließend in QGIS unter Erweiterungen → Erweiterungen verwalten „VLN Karten“ aktivieren (experimentelle Erweiterungen zulassen).

Bedienung

  1. Anmelden … in der Toolbar „VLN Karten“ (auch unter Web → VLN Karten): E-Mail und Passwort des VLN-Manager-Kontos. Das Passwort wird nicht gespeichert, nur der API-Key.
  2. Verfahren wählen in der Auswahlliste.
  3. Layer laden, in QGIS normal editieren (Memory-Layer, EPSG:25833), hochladen.

⚠️ Der PUT der API ersetzt den kompletten Layer-Bestand der jeweiligen VKZ (versionierter Snapshot in KARTE_SPEICHERSTAND). Deshalb lädt das Plugin immer alle Teil-Layer gemeinsam hoch — nur einen Teil zu senden, würde die übrigen Geometrietypen serverseitig löschen.

API-Vertrag

Basis-URL: https://api.flurneuordnung-sachsen.de/v2 (fest hinterlegt als DEFAULT_BASE_URL in vln_karten/api_client.py)

POST /person/login
  Body:     {"mail": "...", "password": "..."}
  Antwort:  {"data": {"userauth": "<url_token>", "id": ...}}
  userauth = API-Key, danach Header "X-API-Key: <userauth>"

GET  /tgen                              Verfahren/TGs (Auth nötig)

GET  /maps/<layer>?vkz=&limit=&offset=  Layer lesen (kas/we: Auth nötig)
  Antwort:  GeoJSON FeatureCollection in EPSG:25833 (ETRS89/UTM33)

PUT  /maps/<layer>/{vkz}                Layer schreiben (Auth nötig)
  Body:     GeoJSON (ersetzt den Layer dieser VKZ, neuer Snapshot)
  Antwort:  {"data": {"vkz","layer","art","speicher_id"}, "status":"ok"}

Fehlerformat: RFC 7807 (application/problem+json)

Ein weiterer Layer der API (st = Servicetermin) wäre ein zusätzlicher Eintrag im DATASETS-Dict in vln_karten/plugin.py.

Aufbau

Datei Zweck
vln_karten/plugin.py Toolbar, Aktionen, Verfahrens-Auswahl, DATASETS-Registry
vln_karten/api_client.py HTTP-Client (Login, Paging-Loader, PUT) über QgsBlockingNetworkRequest
vln_karten/layer_manager.py GeoJSON ↔ Memory-Layer, Geometrie-Splitting, Layer-Zusammenführung
vln_karten/login_dialog.py Anmeldedialog
vln_karten/metadata.txt QGIS-Plugin-Metadaten

Technische Hinweise

  • CRS: Die API liefert und erwartet Koordinaten in EPSG:25833 (abweichend von RFC 7946). Import/Export laufen ohne WGS84-Transformation (GEOJSON_CRS in layer_manager.py).
  • Geometrien gehen beim Hochladen als Multi-Typen an die API (ST_GeomFromGeoJSON akzeptiert beides). Features ohne Geometrie landen in einem Tabellen-Layer „ohne Geometrie“.
  • API-Key-Ablage: unverschlüsselt in den QGIS-Einstellungen (QSettings, Gruppe vln_karten). Wer das härten will, verlagert ihn in den QGIS-Authentifizierungsmanager (QgsApplication.authManager()).
  • Requests laufen synchron (blockierend) — für sehr große Datensätze wäre QgsNetworkAccessManager mit Tasks der nächste Schritt.
  • Die gewählte VKZ liegt in der Projektdatei (writeEntry-Scope vln_karten) — verschiedene Projekte können verschiedene Verfahren vorausgewählt haben.

Entwicklung

Für schnelles Iterieren empfiehlt sich das Plugin Plugin Reloader aus dem offiziellen QGIS-Repository — Codeänderungen wirken dann ohne QGIS-Neustart. Der Plugin-Ordner kann dafür per Symlink direkt aus dem Git-Arbeitsverzeichnis eingebunden bleiben (siehe Installation).

S
Description
No description provided
Readme 49 KiB
Languages
Python 100%