Kartenmodule ergaenzen
Phase 6: alles, was einen Ort hat — Loeschwasser, Objekte mit Feuerwehrplan, die Lagekarte eines Einsatzes und die geplante Foerderstrecke. Keine Kacheln aus dem Netz. Wo eine Wehr ausrueckt und wo ihre Hydranten liegen, ist niemandes Geschaeft; der Kartenserver laeuft selbst (tileserver-gl im Compose-Profil "karte"). Ohne ihn zeigt die Karte einen leeren Grund und sagt das auch — Punkte, Entfernungen und Umkreissuche funktionieren trotzdem. Dasselbe gilt fuer einen eingetragenen, aber nicht erreichbaren Server. Die Umkreissuche laeuft ueber PostGIS: ST_DWithin auf der Geografie mit GiST-Index rechnet in Metern und nutzt den Index. Gefragt wird waehrend der Fahrt, und bei tausend Hydranten waere alles andere ein vollstaendiger Tabellendurchlauf. Der Import aus GeoJSON und Stadtwerke-CSV ist nachsichtig, aber ehrlich: er erkennt "DN 100", deutsche Kommazahlen, Datumsangaben und vertauschte Achsen — raet aber nichts. Fehlt die Position, wird die Zeile uebersprungen; ohne Statusangabe steht "ungeprueft", nicht "einsatzbereit". 22 taktische Zeichen nach FwDV 102 selbst gezeichnet, die Lagekarte gleicht ueber denselben Ereignisstrom ab wie die Atemschutzueberwachung. Die Wasserfoerderung rechnet Reibung, Hoehe und Pumpenzahl; das Ergebnis wird nie gespeichert, sondern bei jeder Anzeige neu gerechnet. Geht eine Strecke nicht auf, sagt die Ausgabe das. Behoben: die Reibungsbeiwerte lagen im ersten Wurf um den Faktor zehn daneben. Aufgefallen ist es nur, weil die Tests gegen die Tabellenwerte der Ausbildung pruefen und nicht gegen die eigene Implementierung. Dazu ein Abruf fuer abgelegte Dateien (/api/dateien/[id]) — bis hierher gab es nur den Upload. 59 neue Tests (48 Unit, 11 E2E je Browser). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
e1480c0c3e
commit
1c1e141666
@@ -29,7 +29,7 @@ Anmelden mit `SEED_ADMIN_EMAIL` und `SEED_ADMIN_PASSWORT` aus der `.env`
|
||||
| Phase 3 — Einsätze und Übungen | fertig |
|
||||
| Phase 4 — Kiosk-PWA im Gerätehaus | fertig |
|
||||
| Phase 5 — Atemschutz (FwDV 7) | fertig |
|
||||
| Phase 6 — Kartenmodule | offen |
|
||||
| Phase 6 — Kartenmodule | fertig |
|
||||
| Phase 7 — Benachrichtigungen und Termine | offen |
|
||||
| Phase 8 — Lokale KI | offen |
|
||||
| Phase 9 — Kassenverwaltung | offen |
|
||||
@@ -664,6 +664,127 @@ Einsatz als Erstes gefragt wird — wie viele Träger heute einsetzbar sind.
|
||||
|
||||
---
|
||||
|
||||
## Phase 6 — Kartenmodule
|
||||
|
||||
Die Frage, wegen der es das Modul gibt, wird auf der Anfahrt gestellt: **Was
|
||||
liegt in der Nähe, und was gibt es her?**
|
||||
|
||||
### Keine Kacheln aus dem Netz
|
||||
|
||||
Wo eine Wehr ausrückt, wo ihre Hydranten liegen und welche Objekte sie im Blick
|
||||
hat, ist niemandes Geschäft. FLORIAN lädt deshalb **keine** Kartenkacheln von
|
||||
einem öffentlichen Dienst — auch nicht „nur zum Ausprobieren". Der Kartenserver
|
||||
läuft selbst:
|
||||
|
||||
```bash
|
||||
docker compose --profile karte up -d
|
||||
```
|
||||
|
||||
Dafür wird eine MBTiles-Datei des eigenen Ausrückegebiets gebraucht; woher man
|
||||
sie bekommt, steht in [docker/karten/LIESMICH.md](docker/karten/LIESMICH.md).
|
||||
Danach in der `.env`:
|
||||
|
||||
```
|
||||
KARTE_STIL_URL=http://localhost:8085/styles/basic/style.json
|
||||
```
|
||||
|
||||
**Ohne Kartenserver läuft alles trotzdem** — die Karte zeigt einen leeren Grund
|
||||
mit einem Hinweis darauf. Punkte liegen an der richtigen Stelle, Entfernungen
|
||||
stimmen, die Umkreissuche rechnet; es fehlen nur die Straßen darunter. Ist ein
|
||||
Server eingetragen, aber nicht erreichbar, sieht es genauso aus — mit
|
||||
entsprechendem Hinweis.
|
||||
|
||||
### Löschwasser
|
||||
|
||||
Hydranten, Saugstellen, Zisternen und offene Gewässer mit Typ, Nennweite,
|
||||
Durchfluss, Zustand und dem, was man vor Ort wissen muss („im Winter oft
|
||||
zugeschoben").
|
||||
|
||||
Die **Umkreissuche** ist der eigentliche Zweck: in die Karte tippen, und es
|
||||
steht da, was in 500 Metern erreichbar ist — nach Entfernung sortiert, mit
|
||||
Nennweite und Durchfluss. Sie läuft über PostGIS (`ST_DWithin` auf der
|
||||
Geografie, GiST-Index), nicht über die Dezimalgrade: bei tausend Hydranten wäre
|
||||
alles andere ein vollständiger Tabellendurchlauf, und gefragt wird während der
|
||||
Fahrt.
|
||||
|
||||
### Import
|
||||
|
||||
Zwei Quellen, die eine Wehr tatsächlich bekommt:
|
||||
|
||||
| Quelle | Was erkannt wird |
|
||||
|---|---|
|
||||
| **GeoJSON** | FeatureCollection mit Punkten, Eigenschaften wie in der CSV |
|
||||
| **CSV der Stadtwerke** | Spaltennamen wie `DN`, `Lage`, `Latitude`, `Pruefdatum`, `Bauart` |
|
||||
|
||||
Der Import ist nachsichtig, aber ehrlich: „DN 100" wird zu 100, „48,5031" zu
|
||||
48.5031, „24.05.2026" zu einem Datum, und vertauschte Achsen werden erkannt und
|
||||
zurückgedreht. Was nicht lesbar ist, wird mit Zeilennummer und Grund gemeldet —
|
||||
und der Rest läuft durch. Eine Liste, die zu 90 Prozent stimmt, ist im Einsatz
|
||||
mehr wert als keine.
|
||||
|
||||
**Geraten wird nichts.** Fehlt die Position, wird die Zeile übersprungen: ein
|
||||
Hydrant ohne Ort ist kein Hydrant. Und ohne Statusangabe steht „ungeprüft",
|
||||
nicht „einsatzbereit".
|
||||
|
||||
### Objekte und Feuerwehrpläne
|
||||
|
||||
Was hier gepflegt wird, wird auf der Anfahrt gelesen — oft vom Beifahrersitz,
|
||||
oft in zwanzig Sekunden. Deshalb sind **Zufahrt**, **Gefahren** und
|
||||
**Schlüsseldepot** eigene Felder und stehen ganz oben, nicht in einer
|
||||
Fließtextnotiz.
|
||||
|
||||
Dazu Ansprechpartner mit der einzigen Angabe, die im Einsatz zählt — wer nachts
|
||||
ans Telefon geht — und die Planblätter nach DIN 14095 mit ihrem Stand.
|
||||
|
||||
Gesucht wird über alles: Name, Straße, Gefahrenstichwort, Ansprechpartner. Wer
|
||||
im Einsatz sucht, weiß selten, wie das Objekt im System heißt.
|
||||
|
||||
### Lagekarte
|
||||
|
||||
Eine je Einsatz, unterhalb der Einsatzdaten. 22 taktische Zeichen nach
|
||||
FwDV 102, selbst gezeichnet als SVG — fertige Sätze sind selten frei
|
||||
verwendbar, und nachgeladen wird ohnehin nichts.
|
||||
|
||||
Ein Werkzeug, ein Klick: Zeichen wählen, in die Karte tippen. Dazu Linienzüge
|
||||
(Schlauchleitung, Absperrung), Flächen (Bereitstellungsraum) und
|
||||
Beschriftungen.
|
||||
|
||||
Der Abgleich zwischen Geräten läuft über denselben Ereignisstrom wie die
|
||||
Atemschutzüberwachung, und wie dort steht der Zustand der Verbindung sichtbar
|
||||
da. Zurückgenommene Elemente verschwinden von der Karte, nicht aus dem
|
||||
Datenbestand: eine Lagekarte ist die Mitschrift einer Entscheidung.
|
||||
|
||||
### Wasserförderung
|
||||
|
||||
Die Rechnung, die sonst mit Tabelle und Bleistift auf der Motorhaube entsteht.
|
||||
Strecke in die Karte tippen, Durchmesser und Fördermenge einstellen:
|
||||
|
||||
```
|
||||
Reibungsverlust je 100 m = Beiwert × (Fördermenge / 100)²
|
||||
Höhenverlust = Höhenmeter × 0,1 bar
|
||||
```
|
||||
|
||||
Daraus: Zahl der Verstärkerpumpen, Schlauchlängen je Abschnitt, Restdruck und
|
||||
der Druck, der an der Einsatzstelle ankommt. Die Beiwerte treffen die
|
||||
Tabellenwerte der Ausbildung — 1,5 bar je 100 m im B-Schlauch bei 800 l/min.
|
||||
|
||||
Reicht ein Abschnitt selbst mit voller Pumpe nicht, sagt die Ausgabe das,
|
||||
statt eine Zahl auszuwerfen, die niemand halten kann. Und unter jeder Rechnung
|
||||
steht, was sie ist: **eine Planungshilfe. Was zählt, ist der Druck am
|
||||
Verteiler.**
|
||||
|
||||
### Zusätzliche Umgebungsvariablen
|
||||
|
||||
| Variable | Vorgabe | Bedeutung |
|
||||
|---|---|---|
|
||||
| `KARTE_STIL_URL` | — | Stil des eigenen Kartenservers; leer = leerer Grund |
|
||||
| `KARTE_BREITENGRAD` | `48.5` | Mittelpunkt, falls kein Standort verortet ist |
|
||||
| `KARTE_LAENGENGRAD` | `12.15` | dito |
|
||||
| `KARTE_ZOOM` | `13` | Zoomstufe beim Öffnen |
|
||||
| `KARTE_PORT` | `8085` | Port des tileserver-gl (Profil `karte`) |
|
||||
|
||||
---
|
||||
|
||||
## Befehle
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user