Hybrid-Centerplan: PNG-Hintergrund mit Polygon-Layer
Manche Architekten oder Center liefern Pläne als hochwertige Rastergrafik (PNG/JPEG) statt als saubere Vektordatei. Damit solche Pläne trotzdem als interaktiver Centerplan funktionieren, unterstützt CockpitOS ein Hybrid-Format:
Eine SVG-Datei mit dem PNG als eingebettetem Hintergrund + transparenten Polygonen als interaktivem Layer – plus optional ein JSON mit pro-Shop-
viewBoxfür scharfe Detail-Ausschnitte auf Shop-Detailseiten.
Das ist der gleiche Daten-/Anzeigepfad wie ein „normaler" SVG-Centerplan – nichts ändert sich beim Upload, beim Mapping oder im Frontend. Es ist also keine Migration und kein Datenverlust zu erwarten.
Wann macht das Sinn?
- Plan kommt als PNG/JPEG vom Architekten und enthält viele feine grafische Details (Schatten, Texturen, Symbole), die als Vektor mühsam zu rekonstruieren wären.
- Du willst trotzdem klickbare/hoverbare Shops, Services usw. mit allem, was das CockpitOS-Wayfinding bietet.
- Auf der Shop-Detailseite soll ein knackscharfer Ausschnitt zu sehen sein.
Auflösung, Zoom — Plus und Minus
Der große Vorteil: Ihr könnt den Plan visuell frei gestalten — Schatten, Texturen, Icons, schöne Farben, alles was KI-Tools oder Grafikprogramme gut können. Das wirkt auf der Website oft deutlich hochwertiger als ein schlichter Vektor-Grundriss.
Was ihr beachten solltet: Der Hintergrund ist ein Bild, kein unendlich scharfer Vektor. Deshalb:
- Auflösung: Lieber groß und scharf exportieren (typisch mind. 2000–3000 px auf der längeren Kante; bei sehr großen Centern eher mehr). Ein kleines, unscharfes Bild wird beim Zoomen auf dem Plan oder in Detail-Ausschnitten weich oder pixelig.
- Stark reinzoomen auf der Gesamtübersicht kann sichtbar werden — das ist normal bei Rasterplänen. Für Shop-Detailseiten kann das Cockpit optional scharfe Ausschnitte (
shopViewBoxes) mitliefern; dafür lohnt sich ein gutes Ausgangsbild. - Klassische SVG aus Illustrator bleibt unschlagbar, wenn ihr extrem nah ranzoomen müsst oder der Plan ständig vektorisch nachgezogen wird.
Kurz: Hybrid = Top-Optik und schneller Start (z. B. KI-Bild → Cockpit). Trade-off = Bildqualität und Auflösung mitdenken, nicht nur „irgendein kleines PNG“.
Aufbau eines Hybrid-SVG
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 1600 1200">
<!-- 1) Raster-Hintergrund: das PNG eingebettet als Data-URL ODER als externe URL -->
<image x="0" y="0" width="1600" height="1200"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA…" />
<!-- Alternativ: href="https://cdn.cockpitos.dev/centers/<id>/centerplan/plan.png" -->
<!-- 2) Optional: Gruppe als „Hover-Layer“ markieren – stellt sicher, dass die
Polygone unsichtbar bleiben und nur beim Hover leicht eingefärbt werden. -->
<g id="hover-layer">
<!-- Shops: jede ID nach Konvention shop-XX -->
<polygon id="shop-EG-29" points="180,120 270,120 270,180 180,180" fill="none" />
<polygon id="shop-EG-30" points="280,120 370,120 370,180 280,180" fill="none" />
<!-- Services -->
<polygon id="service-OG-treppe" points="…" fill="none" />
<polygon id="service-OG-aufzug" points="…" fill="none" />
</g>
</svg>
Wichtig:
- Das
<image>muss den vollen Plan abdecken. DieviewBoxder SVG sollte die Größe des Bilds widerspiegeln (z. B. PNG ist 1600×1200 →viewBox="0 0 1600 1200"). - Polygone bekommen
fill="none"oderfill-opacity="0"– so sind sie unsichtbar, fangen aber Klicks/Hover ab. - IDs folgen der Konvention
shop-…,service-…,entrance-…(siehe SVG-Struktur). Optional kann der Polygon-Layer in<g id="hover-layer">verpackt werden – CockpitOS sorgt dann automatisch für transparente Darstellung mit leichter Hover-Einfärbung. - Das CSS im Frontend setzt
pointer-events: nonefür<image>, sodass alle Klicks zuverlässig die Polygone treffen.
Variante A (empfohlen): Automatische Segmentierung im Dashboard
CockpitOS kann ein PNG/JPEG direkt im Dashboard in eine Hybrid-SVG mit Polygon-Layer umwandeln. Du brauchst dafür kein Inkscape und keine externen Tools – nur den Centerplan als Bilddatei.
Workflow
Neue Etage mit Raster direkt: Unter Centerpläne → Neue Etage kannst du im Dialog den Tab „Raster (Hybrid)“ wählen und PNG/JPEG/WebP hochladen. Nach dem Speichern öffnet sich die Etage mit aktivem Tab „SVG-Centerplan“, sodass du dort mit Auto-Segmentierung weitermachst (wie bei bestehenden Etagen).
- Etage öffnen:
Centerpläne → Etage bearbeiten → Tab „SVG-Centerplan". - In der ersten Karte „PNG → Hybrid-SVG (automatische Segmentierung)":
- Centerplan hochladen (PNG, JPEG oder WebP – Bunny CDN nimmt seit dem letzten Update alle drei Formate für Centerpläne an).
- Optional die Erkennungs-Parameter anpassen (siehe Tabelle unten) – in den meisten Fällen reichen die Defaults.
- „Vorschau erzeugen" klicken → der Server lädt das Bild, segmentiert es und zeigt eine isolierte Vorschau mit der Anzahl gefundener Polygone.
- Vor großen Änderungen im Cockpit kannst du die aktuelle Hybrid-Datei
auch in der Karte „SVG-Centerplan“ mit „Hybrid-SVG herunterladen“
als
.svgsichern (identisch zur gespeichertenmapSvg) — hilfreich, wenn du nur das eingebettete Rastergrafik austauschen willst und die Polygon-IDs beibehalten möchtest.
- Danach in den Tab „Polygon-Editor" wechseln und jedem Polygon seine finale ID-Konvention zuweisen (siehe weiter unten).
Planbild später austauschen (Polygone behalten)
Wenn der Architekt oder KI ein überarbeitetes PNG/JPEG liefert (neues Format, zusätzliche Elemente, andere Farben), aber die Polygon-Zuordnungen im Cockpit bestehen bleiben sollen:
- Etage öffnen → Tab „SVG-Centerplan" → Karte „PNG → Hybrid-SVG".
- Neues Bild hochladen – die UI wechselt automatisch in den Modus „Hintergrund tauschen (Polygone behalten)".
- „Vorschau erzeugen" → prüfen, ob das neue Raster passt (Hinweis bei abweichendem Seitenverhältnis).
- „Hintergrund übernehmen" – aktualisiert
mapSvg(<image xlink:href="…">) undmapImagein der Datenbank; Polygon-IDs und MapLocations bleiben unverändert. - Center-Website-Cache wird invalidiert (ISR-Revalidation).
Wichtig: Der Modus „Additiv hinzufügen" segmentiert nur zusätzliche Polygone aus dem neuen Bild – er tauscht nicht den sichtbaren Hintergrund. „Komplett ersetzen" verwirft alle bestehenden Polygone und startet neu.
Empfehlung: Gleiches Seitenverhältnis wie beim Erst-Upload (Polygone liegen in der bestehenden SVG-Canvas). Stark andere Proportionen können das Bild leicht verzerren; die Klickflächen bleiben an den alten Koordinaten.
Alternativ (extern): Hybrid-SVG herunterladen, Raster in Inkscape tauschen, SVG erneut hochladen – funktioniert, ist aber fehleranfälliger als der Cockpit-Modus oben.
Was die Parameter bewirken
| Parameter | Wirkung | Default |
|---|---|---|
| Farbtoleranz | Wie stark Pixel sich farblich unterscheiden dürfen, um zur gleichen Region gezählt zu werden. Höher = großzügiger zusammenfassen (Risiko: Shops verschmelzen). | 30 |
| Mindestgröße (Pixel, downscaled) | Regionen kleiner als dieser Wert werden als „Rauschen" verworfen. Erhöhen, wenn zu viele Mini-Polygone entstehen. | 200 |
| Hintergrund-Toleranz | Pixel mit Abstand ≤ diesem Wert zur dominanten Eckenfarbe werden als Hintergrund ignoriert. | 40 |
| Polygon-Vereinfachung (Pixel) | Douglas-Peucker-Epsilon. Höher = weniger Eckpunkte (kleinere SVG, leicht kantigere Polygone). | 1.5 |
| Max. Verarbeitungsmaße | Begrenzt die Bildgröße fürs Verarbeiten (Performance). Originalmaße bleiben in der finalen SVG erhalten. | 1500 |
Wie funktioniert das technisch?
- Bild laden: Bunny-URL →
sharp(libvips) → RGBA-Pixel-Buffer. - Downscale auf max. ~1500 px Kantenlänge (rein für Performance; die Polygon-Koordinaten werden am Ende auf die Originalmaße zurückskaliert).
- Hintergrund erkennen: Median-Farbe der vier Bildecken (mit Inset).
- Connected-Components per Flood-Fill mit Farbtoleranz – jeder zusammen hängende, hintergrundverschiedene Bereich wird zu einer Region.
- Filter: Mindest-Pixelanzahl + maximaler Anteil (verhindert, dass eine große Hintergrundfläche fälschlich als „Region" eingestuft wird).
- Boundary-Tracing (Moore-Nachbarschaft) → geschlossene Außenkontur.
- Douglas-Peucker-Vereinfachung → kompaktere Polygon-Punkte.
- Hybrid-SVG bauen mit
<image>(Bunny-URL) +<g id="shops">voller<path>-Elemente mit IDsshop-EG-tbd-01,shop-EG-tbd-02, …
Der Floor-Prefix (EG, OG1, …) wird automatisch aus dem Etagen-Namen
abgeleitet, sodass die Polygone direkt mit dem Editor-Workflow zusammenpassen.
Datenverlust-Schutz
- Vorschau zuerst, Apply nur explizit: Es gibt keinen Auto-Apply.
- Bestehende
mapSvgblockiert: Wenn die Etage schon ein SVG hat, lehnt der Servermode=applyohnereplaceExisting: trueab. Die UI fragt explizit nach und bietet vorher den Download des aktuellen SVGs an. shopViewBoxesbleibt unangetastet: Dietbd-XX-Provisorien sind irrelevant für die existierende viewBox-Map – sie passen erst nach der ID-Zuweisung im Polygon-Editor.
Praxis: Konturen, Services, Eingänge, Dekoratives
Konturen um Shop-Flächen
Die meisten Centerpläne haben dunkle Konturlinien zwischen den Shops – das ist Gold wert für die Erkennung. Die Karte hat dafür den Slider „Konturen-Schwelle (Luminanz)" (Default 60). Damit werden alle dunklen Pixel vor dem Flood-Fill als Hintergrund behandelt:
- Effekt 1: Konturen verschwinden komplett aus den Polygonen, statt als riesiges, unschönes „Linien-Polygon" mitsegmentiert zu werden.
- Effekt 2: Polygone enden sauber an der Kontur, nicht durch sie hindurch – die Vorschau wirkt deutlich aufgeräumter.
- Effekt 3: Benachbarte Shops mit fast gleicher Farbe werden zuverlässiger getrennt, weil die Kontur den Flood-Fill blockiert.
Tipps:
- Wenn dein Plan sehr dünne, hellgraue Konturen hat: Schwelle erhöhen (z. B. 90), bis die Linien rausfallen.
- Wenn dein Plan gar keine Konturen hat (nur reine Farbflächen): Schwelle auf 0 setzen, sonst werden dunkle Shops fälschlich als Hintergrund behandelt.
- Falls trotz allem Linien-Reste übrigbleiben: die erweiterten Optionen Aspect-Ratio (Default 12) und Compactness (Default 0.15) verwerfen langgezogene oder löchrige Regionen.
Services (Aufzug, Rolltreppe, WC)
Service-Symbole sind im PNG meist viel kleiner als Shops. Empfohlener Workflow:
- Erster Pass:
Polygon-Ebene = Shops, Mindestgröße 200, Modus „Komplett ersetzen". Liefert die großen Shop-Polygone. - Zweiter Pass auf das gleiche PNG:
Polygon-Ebene = Services, Mindestgröße auf z. B. 50 reduzieren, Modus „Additiv hinzufügen". Liefert die kleinen Service-Symbole als zusätzliche Polygone, die zur bestehenden SVG hinzugefügt werden – Shops bleiben unverändert. - Dritter Pass für Logos analog (
Polygon-Ebene = Logos, ggf. noch kleinere Mindestgröße).
Dann im Polygon-Editor den Service-Symbolen sprechende Suffixe geben
(treppe, aufzug-1, wc-damen, …).
Eingänge
Eingänge sind im PNG häufig Pfeil-Symbole an den Außenseiten. Der Auto-Segmenter erkennt sie meistens, ordnet sie aber nicht automatisch der Konvention zu – das ist auch sinnvoll, weil „der Hauptzugang" eine inhaltliche Entscheidung ist. Vorgehen:
- Die Pfeile werden im ersten Shops-Pass entweder mit-erkannt (dann im
Polygon-Editor klicken → Ebene auf „Eingang" → Suffix
haupt/nord/parkhaus→ Enter) oder bleiben unsegmentiert. - Falls das PNG keine Pfeil-Symbole hat: in Inkscape ein kleines Polygon
über den Eingang zeichnen, ID
entrance-haupt, SVG re-uploaden.
Dekorative Elemente (Pflanzen, Bänke, Schatten, Maßstab, Kompass-Rose)
Im Polygon-Editor gibt es zwei dedizierte Aktionen:
- „Als dekorativ markieren" verschiebt das Polygon in
<g id="decorative">mitpointer-events: none. Das Polygon bleibt im SVG erhalten (für späteren Inkscape-Roundtrip), wird auf der Live-Centerplan-Seite aber weder angezeigt noch klickbar. Im Editor selbst erscheint es als grau schraffiertes Polygon, kann jederzeit per „Wieder interaktiv" zurückgeholt werden. - „Polygon entfernen" löscht das Polygon mit Bestätigungsdialog hart aus dem SVG. Sinnvoll für eindeutigen Müll: Schatten, Maßstabsbalken, Nord-Pfeile, Kompass-Rosen.
Auto-Save: Im Polygon-Editor werden Änderungen nach kurzer Pause automatisch in die Datenbank geschrieben (Status „Gespeichert“ oben). Optional kann weiterhin „Speichern“ geklickt werden.
Beim Speichern werden im Hintergrund auch verknüpfte Shop-Mappings sauber
mitgezogen: Wenn ein bereits gemapptes Polygon auf „dekorativ" gesetzt wird,
verlinkt das MapLocation-Eintrag auf die neue decorative-…-ID statt ins
Leere – das Mapping geht nicht verloren, ist aber für den Besucher inert.
Variante B: Hybrid-SVG manuell in Inkscape oder Affinity Designer
- Neues SVG-Dokument mit der Größe deines PNGs (z. B. 1600×1200 px).
- PNG einbetten: Datei → Importieren → PNG auswählen → Option „einbetten"
(nicht „verknüpfen"). In Inkscape kannst du nach dem Import zusätzlich
Bearbeiten → XML-Editoröffnen und prüfen, dass das<image>-Element einxlink:href="data:image/png;base64,…"hat. - Hover-Layer anlegen: Neue Gruppe oder Layer mit ID
hover-layer. - Polygone zeichnen: Über jede Shop- oder Service-Fläche ein Polygon legen.
- Füllung: keine (transparent)
- Konturlinie: keine (oder dünn, nur zur Orientierung beim Bearbeiten)
- ID setzen: Über das Objekt-Eigenschaften-Panel (
Strg + Umschalt + Oin Inkscape) z. B.shop-EG-29,service-OG-treppe.
- Speichern als „Klares SVG" (Inkscape) bzw. „SVG exportieren" (Affinity).
- Im Dashboard hochladen →
Centerpläne → Etage bearbeiten → SVG-Centerplan. Beim Upload werden Bunny-CDN, viewBox-Normalisierung und Shop-Erkennung automatisch durchgeführt.
Tipp: Wer das PNG zentral pflegen möchte, kann es separat als
mapImagehochladen (Bunny erlaubt für Centerpläne jetzt auch PNG/JPEG/WebP) und dann im SVG nur perxlink:hrefdarauf verlinken. Damit lässt sich der Hintergrund später ohne SVG-Änderung tauschen.
Schritt 4 (alternativ): IDs direkt im Dashboard zuweisen
Wenn die SVG bereits Polygone enthält, deren IDs aber noch nicht der Konvention
entsprechen (z. B. weil sie aus einer automatischen PNG-Farbsegmentierung
kommen und Namen wie shop-EG-tbd-12 tragen), kannst du die finale Zuweisung
ohne Inkscape direkt im Dashboard machen:
- Im Centerplan-Editor den Tab „Polygon-Editor" öffnen.
- Auto-erkannte Flächen: Rote Fläche anklicken → Art (Shop/Service) und Nummer oder Name eintragen → Zuweisen & weiter.
- Fehlende Flächen nachzeichnen (Werkzeug-Leiste über dem Plan):
- Rechteck: zwei diagonal gegenüberliegende Ecken klicken (typisch für Shop-Grundrisse).
- Kreis: Mitte klicken, dann einen Punkt auf dem Rand (runde Inseln, Säulen).
- Ecken: beliebige Form – Ecken nacheinander klicken, Enter oder „Form abschließen" (min. 3 Ecken).
- Tasten: 1 Auswählen · 2 Rechteck · 3 Kreis · 4 Ecken · Enter Zuweisen bzw. Form abschließen · Esc abbrechen.
- Der Editor zeigt oben den Fortschritt X/Y.
- „Speichern" persistiert das aktualisierte SVG plus die ID-Renames in der Datenbank.
Im Tab SVG-Centerplan gibt es für die Auto-Erkennung nur noch Standard / Kleine Flächen – Feinregler nur unter „Feineinstellung".
Was beim Speichern automatisch passiert
- Das Polygon erhält die Konventions-ID
<layer>-<floorPrefix>-<suffix>und wird in die passende Layer-Gruppe (<g id="shops">,<g id="services">, …) einsortiert. Der Floor-Prefix wird aus dem Etagen-Namen abgeleitet (Erdgeschoss→EG,1. Obergeschoss→OG1, …). - Für die neue ID wird – falls noch nicht vorhanden – ein Eintrag in
shopViewBoxesergänzt (Bounding-Box + 12 px Padding). - Bestehende
MapLocation.svgId-Verknüpfungen werden mitumbenannt – kein verlorenes Mapping. Das geschieht atomar in einer Transaktion: Erst werden alle betroffenen MapLocations auf einen temporären Marker gesetzt, dann auf die neue ID, damit sich Renames nicht gegenseitig in die Quere kommen. - Caches (Redis Shop-Mapping, Center-Website-ISR) werden invalidiert.
- Zwischenstände werden lokal im Browser (localStorage) gespeichert, damit Arbeit nicht verloren geht – aber nichts wird ohne explizites „Speichern" in die DB geschrieben.
Bestehende Center sind risikolos: Polygone, die bereits korrekt benannt sind (
shop-29), erkennt der Editor als „zugewiesen" (grün) und lässt sie unverändert. Wer keinen Bedarf hat, ignoriert den Tab einfach.
Detail-Ausschnitte (shopViewBoxes)
Auf Shop-Detailseiten bietet CockpitOS einen knackscharfen Vektor-Ausschnitt des Centerplans. Standardmäßig wird per CSS-Transform auf die Bounding-Box des Shops gezoomt – das funktioniert immer, ist aber bei Hybrid-Plänen weniger elegant, weil das PNG dann pixelig wird.
Mit shopViewBoxes (im Dashboard pro Etage pflegbar) wird stattdessen die
SVG viewBox gezielt auf den passenden Ausschnitt gesetzt. Das Resultat:
- Vektor-Skalierung – immer scharf
- Wiederverwendung der gleichen SVG-Datei – kein Bildschneiden nötig
- Konsistenter Look auf allen Geräten (Retina, App-WebViews)
So pflegst du die Ausschnitte im Dashboard
- Öffne
Centerpläne → Etage bearbeiten → Tab „SVG-Centerplan". - Unterhalb des Upload-Feldes findest du die Karte „Detailseiten-Ausschnitte".
- Klicke „Fehlende automatisch berechnen" – das System legt für jeden gefundenen Shop/Service einen viewBox-Vorschlag an (basierend auf der Bounding-Box + frei wählbarem Padding).
- Einzelne Werte können per Eingabefeld noch verfeinert werden.
- Speichern schreibt die JSON-Map in
MapFloor.shopViewBoxes.
Wer keine Ausschnitte pflegen möchte, lässt das Feld einfach leer – das Frontend nutzt dann automatisch den klassischen DOM-Zoom. Es ist ein rein additives, optionales Feature.
JSON-Format (für Entwickler)
{
"shop-EG-29": { "viewBox": "180 120 90 60", "padding": 8 },
"service-OG-treppe": { "viewBox": "300 50 50 80" }
}
- Schlüssel = SVG-Element-ID (oder
data-shop-id). viewBox= Standard-SVG-viewBox als String"minX minY width height".paddingist optional und nur informativ (wird beim Auto-Berechnen abgelegt).
Was passiert intern?
| Schritt | Komponente / Datei |
|---|---|
| Upload (Bunny CDN, jetzt auch PNG/JPEG/WebP für Centerpläne) | apps/dashboard/src/app/api/upload/bunny/route.ts |
viewBox-Normalisierung (jetzt inkl. <image>-BBox) | apps/dashboard/src/lib/wayfinding/svg-viewbox-normalizer.ts |
| Shop-Erkennung (unverändert, IDs nach Konvention) | apps/dashboard/src/lib/wayfinding/svg-analyzer.ts |
Frontend: pointer-events für <image> | packages/wayfinding/src/components/InteractiveFloorPlan.tsx |
Detail-Embed: presetViewBox aus DB | apps/center-website/components/shop-detail-center-plan-embed.tsx |
| Helper-Lib: parsen/serialisieren/auto-berechnen | packages/wayfinding/src/lib/wayfinding/shop-viewboxes.ts |
| Helper-Lib: Polygone parsen/umbenennen/in Layer einsortieren | packages/wayfinding/src/lib/wayfinding/svg-polygon-editor.ts |
| Helper-Lib: manuelles Einzeichnen (Rechteck/Kreis/Ecken) | packages/wayfinding/src/lib/wayfinding/svg-polygon-draw.ts |
| Helper-Lib: Bild-Segmentierung (Flood-Fill, Boundary-Tracing, Douglas-Peucker, SVG-Builder) | packages/wayfinding/src/lib/wayfinding/image-segmentation.ts |
| Server-Wrapper: sharp + Pixel-Extraktion | apps/dashboard/src/lib/wayfinding/server-image-segment.ts |
| Dashboard-UI: viewBox-Map | apps/dashboard/src/components/wayfinding/ShopViewBoxesCard.tsx |
| Dashboard-UI: Polygon-Editor | apps/dashboard/src/components/wayfinding/PolygonAssignmentEditor.tsx |
| Dashboard-UI: PNG-Auto-Segmentierung | apps/dashboard/src/components/wayfinding/AutoSegmentPngCard.tsx |
| Atomic-Save (mapSvg + viewBoxes + MapLocation-Sync) | apps/dashboard/src/app/api/wayfinding/floors/[floorId]/polygon-edits/route.ts |
| API: PNG-Auto-Segmentierung (Vorschau + Apply) | apps/dashboard/src/app/api/wayfinding/floors/[floorId]/auto-segment-png/route.ts |
| DB-Feld | MapFloor.shopViewBoxes (TEXT, nullable) – siehe SAFE-Migration 20260514_add_map_floor_shop_view_boxes_SAFE.md |
Was sich für Bestands-Center nicht ändert
- Bestehende reine Vektor-SVGs werden weiter identisch dargestellt – weder Klick-Logik noch viewBox-Normalisierung verhalten sich anders.
- Das neue DB-Feld
shopViewBoxesist optional (nullbei allen Bestands-Floors). Solange es leer bleibt, läuft der bestehende DOM-Zoom. - Der Bunny-Upload-Typ
centerplanakzeptiert weiter SVG; zusätzlich sind jetzt PNG/JPEG/WebP erlaubt – nichts verschwindet.
Querverweise
Nutzungsstatistik: Seitenaufrufe werden anonymisiert erfasst. Im Umami-Dashboard nach diesem Pfad filtern: /centerplan/hybrid-png-mit-polygonen