From 46bbe0f1ace3cb4f638d65946964869597bbc706 Mon Sep 17 00:00:00 2001 From: Johannes Baumeister Date: Fri, 29 May 2026 13:36:02 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Geb=C3=A4ude=20aus=20Datenbank=20als=20?= =?UTF-8?q?transparente=20graue=20Fl=C3=A4che=20eingebunden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.js | 35 ++++++++++++++++++++++++++++++++++- server.js | 25 +++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index a1993c3..1213461 100644 --- a/app.js +++ b/app.js @@ -1324,7 +1324,40 @@ document.addEventListener('DOMContentLoaded', async () => { console.warn("Leitungsverläufe-Layer konnte nicht geladen werden."); } - statusEl.innerText = "Layer geladen (ALKIS DB, Artennachweise & Leitungen integriert)."; + // Gebäude laden + console.log("Lade Gebäude aus Datenbank..."); + const gebaudeResp = await fetch('/api/layers/gebaude').catch(err => { + console.error("Netzwerkfehler beim Laden der Gebäude:", err); + return null; + }); + + if (gebaudeResp?.ok) { + const data = await gebaudeResp.json(); + console.log(`Gebäude API: ${data.features ? data.features.length : 0} Features erhalten.`); + if (data.features && data.features.length > 0) { + const layerName = "Gebäude (DB)"; + const gebaudeLayer = L.geoJSON(data, { + style: { + color: "gray", + weight: 1, + fillColor: "gray", + fillOpacity: 0.5 + } + }); + + if (overlays[layerName]) { + state.map.removeLayer(overlays[layerName]); + layerControl.removeLayer(overlays[layerName]); + } + overlays[layerName] = gebaudeLayer; + state.map.addLayer(gebaudeLayer); + layerControl.addOverlay(gebaudeLayer, layerName); + } + } else { + console.warn("Gebäude-Layer konnte nicht geladen werden."); + } + + statusEl.innerText = "Layer geladen (ALKIS DB, Artennachweise, Leitungen & Gebäude integriert)."; } catch (e) { if (!isLocalFile) console.error("Layer-Init fehlgeschlagen:", e); } diff --git a/server.js b/server.js index ad3a449..2ad50bb 100644 --- a/server.js +++ b/server.js @@ -336,6 +336,31 @@ app.get('/api/layers/leitungsverlaeufe', async (req, res) => { } }); +// NEU: API zum Laden der Gebäude +app.get('/api/layers/gebaude', async (req, res) => { + log("Lade Gebäude aus Datenbank..."); + try { + const result = await pool.query( + `SELECT jsonb_build_object( + 'type', 'FeatureCollection', + 'features', COALESCE(jsonb_agg(features.feature), '[]'::jsonb) + ) + FROM ( + SELECT jsonb_build_object( + 'type', 'Feature', + 'geometry', ST_AsGeoJSON(ST_Transform(geom, 4326))::jsonb, + 'properties', jsonb_build_object() + ) AS feature + FROM geodaten.gebaude + ) features` + ); + res.json(result.rows[0].jsonb_build_object); + } catch (err) { + log(`FEHLER beim Laden der Gebäude: ${err.message}`); + res.status(500).json({ error: err.message }); + } +}); + // API für Projekt-Statistiken (Fortschrittsanzeige) app.get('/api/stats/:projekt_id', async (req, res) => { const { projekt_id } = req.params;