Eigenentwicklung

Eine Anwendung, die Lücken zeigt, statt sie zu füllen

Der Waldzustands-Monitor wertet die Ergebnisse der amtlichen Waldzustandserhebung aus. Schwieriger als die Darstellung war der ehrliche Umgang mit dem, was in den Quellen fehlt.

Zur Anwendung

vier

Auswahlfälle, aus denen jede Karte, jedes Diagramm und jede Tabelle der Anwendung entsteht

null

Anfragen an fremde Server beim Aufruf, über neun Seiten gemessen, und kein Cookie

Was die Anwendung tut

Die Erhebung läuft seit Jahrzehnten, in den meisten Ländern jedes Jahr. Ihre Ergebnisse liegen verstreut in Berichten und Tabellenblättern. Für einen Vergleich von zwei Jahrgängen oder zwei Ländern muss man von Hand rechnen.

Im Monitor wählt man vier Dinge aus: einen Parameter, ein Gebiet, ein Aufnahmejahr und ob Baumartengruppen getrennt oder zusammengefasst erscheinen sollen. Daraus entstehen unmittelbar aus der Datenbank eine Karte, Diagramme und eine Tabelle, ohne vorbereitete Inhalte und ohne einen Zwischenstand, den jemand pflegen müsste.

Dazu kommen Steckbriefe für jedes Land, ein Methodenteil, der jeden Parameter mitsamt seinen Ausprägungen und seiner Bewertungsrichtung erklärt, ein Glossar, ein Quellenverzeichnis, das Herunterladen der angezeigten Tabelle als Datei und dieselbe Auswertung maschinenlesbar über eine Schnittstelle. Wie viele Werte, Parameter und Aufnahmejahre gerade im Bestand sind, steht in der Anwendung selbst und wird dort gezählt, nicht gepflegt.

Was die Daten hergeben und was nicht

Die Erhebung ist nicht lückenlos. Ein Stadtstaat führt sie nicht, ein anderer fehlt in mehreren Jahren, und einzelne Reihen setzen für ein Jahr aus. Eine Auswertung, die das glattzieht, sieht besser aus und ist falsch.

  • Wo ein Land in einem Jahr nicht erhoben hat, bleibt die Fläche schraffiert statt eingefärbt, und die Linie im Diagramm setzt aus, statt über die Lücke hinwegzuziehen.
  • Flächenanteile je Baumart wären darstellerisch reizvoll und fehlen trotzdem, weil kein dafür freigegebener Datenbestand vorliegt. An ihrer Stelle steht auch keine geschätzte Zahl.
  • Jede angezeigte Zahl führt Herausgeber, Lizenz und Abrufdatum mit, weil die Quelle am einzelnen Messwert hängt und nicht am Bestand.
  • Das Quellenverzeichnis wird bei jedem Aufruf aus dem Quellenregister der Datenbank erzeugt. Es ist damit nicht gepflegt, sondern abgeleitet, und kann nicht auseinanderlaufen.
  • Der Hinweis, wie eine Zahl zu lesen ist, steht an der Darstellung und nicht im Kleingedruckten.

Eine feh­len­de Er­he­bung ist keine Null.

Das ist der Punkt, an dem sich die Arbeit entschieden hat. Eine Null bedeutet, dass gemessen wurde und nichts herauskam. Eine Lücke bedeutet, dass niemand gemessen hat. Stellt man beides gleich dar, wird aus einer Verwaltungsentscheidung ein Befund über den Wald. Auf der Karte bleiben Länder ohne Erhebung deshalb schraffiert, und die Bildbeschreibung sagt ausdrücklich, dass keine Werte vorliegen.

Karte der Bundesländer, eingefärbt nach dem Anteil deutlich geschädigter Bäume für 2024. Dreizehn Länder tragen eine Farbe, drei Länder ohne Erhebung sind schraffiert und nicht eingefärbt.
Die unveränderte Aufnahme aus der laufenden Anwendung, auf die Karte zugeschnitten, vom 18. September 2026. Mecklenburg-Vorpommern, Bremen und Hamburg sind schraffiert, weil für 2024 keine Werte vorliegen. Werte: amtliche Waldzustandserhebung 2024. Geometrie: © GeoBasis-DE / BKG 2025 (Daten verändert). Datenlizenz Deutschland – Namensnennung – Version 2.0.

Rechnen in der Datenbank

Viele Parameter der Erhebung sind keine Messwerte, sondern Stufen. Ein Baum steht in Schadstufe 1, 2 oder 3. Die Stufen haben eine Reihenfolge, aber keinen Abstand.

Das erfordert eine Entscheidung, die man einer Anwendung nicht ansieht und die trotzdem über die Richtigkeit jeder Zahl bestimmt. Ein Durchschnitt über Stufennummern behauptet, dass der Weg von Stufe 1 zu Stufe 2 genauso weit ist wie der von Stufe 2 zu Stufe 3. Das weiß niemand, und die Erhebung sagt es auch nicht. Der Monitor bildet deshalb keinen Mittelwert, sondern sucht die Stufe, bei der die Hälfte des Bestands erreicht ist, und gewichtet dabei die Anteile.

Dazu gehört eine zweite, kleinere Entscheidung. Bei der Suche nach der Hälfte landet man rechnerisch schnell zwischen zwei Stufen, und ein Ergebnis von 1,5 sieht nach Genauigkeit aus. Zwischen Stufe 1 und Stufe 2 liegt aber keine Stufe, und die Ausprägungstabelle kennt auch keine. Ausgegeben wird deshalb immer eine Stufe, die es wirklich gibt.

Und die Bezugsgröße ist die tatsächliche Summe der vorliegenden Anteile, nicht hundert Prozent. Ist eine Verteilung unvollständig, wird sie nicht stillschweigend hochgerechnet, weil das die Lücke aus dem vorigen Abschnitt durch die Hintertür wieder schließen würde.

Erweiterbar ohne Programmänderung

Jedes Jahr kommt ein Aufnahmejahrgang hinzu, und gelegentlich ein Parameter. Wenn dafür jedes Mal jemand den Programmcode anfassen muss, wird die Anwendung genau so lange gepflegt, wie jemand Zeit hat.

Eine einzige Tabelle entscheidet, welche Darstellungen bei welcher Auswahl erscheinen. Weder die Steuerung noch die Vorlagen treffen diese Entscheidung ein zweites Mal, und damit gibt es keine zweite Stelle, die man vergessen kann. Ein Datentyp, den das Schema erlaubt und diese Tabelle nicht kennt, führt zu einem erkennbaren Abbruch statt zu einer leeren Seite, und ein Prüflauf hält beide Listen gegeneinander.

Am 13. September 2026 kam ein zusätzlicher Parameter hinzu, allein über Datenbankeinträge und einen Import. Er erscheint seitdem im Auswahlfeld, in allen vier Auswahlfällen, auf der Karte, in der Heatmap, in der Ausgabedatei und über die Schnittstelle. Geändert wurde dafür keine Datei des Anwendungscodes, und neu gebaut wurde nichts.

Ohne Bibliothek für Karte und Diagramm

Eine öffentliche Auswertung soll auf einem alten Diensttelefon genauso funktionieren wie auf einem neuen Rechner, und sie soll niemanden dabei an einen fremden Server melden.

Karte, Diagramme und Heatmaps entstehen deshalb serverseitig als SVG, ohne Kartenbibliothek, Diagrammframework oder nachgeladene Schrift, und der Browser bekommt sie fertig. Gemessen am 18. September 2026 über neun Seiten geht beim Aufruf keine einzige Anfrage an eine fremde Domain hinaus. Es wird kein Cookie gesetzt, und localStorage und sessionStorage bleiben leer.

Jede Darstellung trägt eine Textfassung für Vorleseprogramme, und zwar keine Notlösung, sondern denselben Inhalt in Sätzen. Die Kartenflächen sind über die Tastatur erreichbar. Schaltet man JavaScript ab, bleiben Karte, Diagramme und Tabelle vollständig stehen und die Flächen bleiben bedienbar. Die Anwendung liefert zwei kleine eigene Skripte aus, die Bedienung ergänzen und für keine Darstellung nötig sind.

Prüfen, was sonst still veraltet

Gefährlicher als ein Absturz ist in dieser Anwendung eine Zahl, die einmal stimmte und nach dem nächsten Import nicht mehr stimmt, ohne dass sich irgendetwas beschwert.

  • Keine Vorlage enthält eine Zahl. Eine fest eingetragene wäre heute richtig und nach dem nächsten Import unbemerkt falsch.
  • Jeder aktive Parameter hat einen Eintrag im Glossar, sonst scheitert der Lauf.
  • Jeder Quellenvermerk steht wörtlich im Verzeichnis, so wie die Lizenz ihn verlangt.
  • Jede Farbpaarung erreicht den geforderten Mindestkontrast.
  • Die Liste der Datentypen, die das Schema erlaubt, wird gegen die Liste gehalten, die die Anwendung darstellen kann.

Ein Teil dieser Sicherungen steht gar nicht im Programm, sondern in der Datenbank. Ein zusammengesetzter Fremdschlüssel verhindert, dass ein Messwert der Kronenverlichtung eine Stufe trägt, die zu einem anderen Parameter gehört, und ein Auslöser verwirft den Zwischenspeicher der Ergebnisse, sobald sich Daten oder Register ändern. Beides greift auch dann, wenn jemand am Programm vorbei unmittelbar in der Datenbank arbeitet.

Die Läufe starten mit einem Befehl und enden mit einer Zahl, nicht mit einer Einschätzung. Am 13. September 2026 kamen 23 Prüfskripte auf 3.350 Einzelprüfungen, dazu 99 Modultests mit 1.177 Zusicherungen. Diese Zahlen wachsen mit dem Projekt und tragen deshalb ihr Datum.

Betrieb

Die Anwendung läuft öffentlich unter eigener Domain, und niemand sitzt daneben. Also muss der Betrieb die Fälle abdecken, in denen ich gerade nicht hinsehe.

  • Die Anwendung wird täglich gesichert, und die Rückspielprobe gehört dazu, weil sich erst beim Zurückspielen zeigt, ob die Sicherung taugt.
  • Die Erreichbarkeit wird minütlich geprüft, und die Verbindung läuft über TLS mit HSTS.
  • Die Datenbank hat keinen Port nach außen und ist auch aus dem Rechenzentrumsnetz nicht erreichbar.
  • Der Anwendungsdienst läuft mit schreibgeschütztem Dateisystem. Die beiden schreibbaren Verzeichnisse sind ausdrücklich als flüchtiger Speicher eingehängt, sodass ein Schreibzugriff an anderer Stelle scheitert statt unbemerkt zu gelingen.

Diese Begrenzung der Schreibrechte empfehle ich besonders häufig. Versucht der Dienst, außerhalb der freigegebenen Verzeichnisse zu schreiben, wird der Zugriff verweigert. Der fehlgeschlagene Zugriff lässt sich dann untersuchen, um die Ursache zu beheben.

Was ich bewusst nicht gebaut habe

  • Keine Aufnahmejahrgänge nach 2024Dafür gibt es keine freigegebene Quelle. Das ist der Stand der Veröffentlichungen und keine Grenze der Anwendung.
  • Keine Sichtenschicht im SchemaDatenbank und Anwendung entwickle ich selbst, und sie ändern sich gemeinsam über nummerierte Migrationen. Eine Zwischenschicht zur Entkopplung bringt hier nichts und kostet eine weitere Stelle, an der etwas veralten kann.
  • Keine Baumartenzusammensetzung der WaldflächeDie Darstellung wäre naheliegend, die dafür nötige Quelle trägt aber keine eindeutige Lizenz. Eine Ersatzzahl kommt nicht in Frage.
  • Keine KartenbibliothekSie hätte Kacheln von einem fremden Server nachgeladen und die Karte an JavaScript gebunden. Beides wollte ich nicht, und die Umrisse ändern sich ohnehin selten genug, um sie serverseitig zu zeichnen.
  • Kein KontaktformularEine Nachricht läuft über das eigene E-Mail-Programm. Damit gibt es auf dem Server nichts zu speichern, zu schützen und zu löschen.

Zum Nachprüfen

Der Monitor ist öffentlich erreichbar. Was hier über Lücken, über die Darstellung ohne Bibliothek und über die Quellenangabe an jedem Wert steht, lässt sich dort mit einem Klick nachprüfen. Der Quelltext ist nicht öffentlich.

Zur AnwendungE-Mail schreibenZurück zu den Projekten

kontakt@gartway.de