Compare commits
17 Commits
415bd6d355
...
ba6ed0f058
| Author | SHA1 | Date |
|---|---|---|
|
|
ba6ed0f058 | |
|
|
63ba610ca5 | |
|
|
9d256198a6 | |
|
|
15471c52ff | |
|
|
955c71a02e | |
|
|
330a7a5a0a | |
|
|
a92b054645 | |
|
|
6f3001dff8 | |
|
|
ed821296f3 | |
|
|
685bfb1f3b | |
|
|
261b7a1bf3 | |
|
|
e3f51f59e0 | |
|
|
40017b152a | |
|
|
866d749388 | |
|
|
e68bee0bb1 | |
|
|
bbd531f5a1 | |
|
|
3020ae2ad0 |
|
|
@ -1,4 +1,4 @@
|
|||
name: Deploy Bürgerwind
|
||||
name: Deploy Standortplaner
|
||||
|
||||
on:
|
||||
push:
|
||||
|
|
@ -15,11 +15,12 @@ jobs:
|
|||
- name: .env erstellen
|
||||
run: |
|
||||
echo "DB_HOST=${{ secrets.DB_HOST }}" > .env
|
||||
echo "DB_PORT=5432" >> .env
|
||||
echo "DB_PORT=${{ secrets.DB_PORT }}" >> .env
|
||||
echo "DB_USER=${{ secrets.DB_USER }}" >> .env
|
||||
echo "DB_PASSWORD=${{ secrets.DB_PASSWORD }}" >> .env
|
||||
echo "DB_NAME=${{ secrets.DB_NAME }}" >> .env
|
||||
echo "DB_SCHEMA=geodaten" >> .env
|
||||
echo "OIDC_CLIENT_ID=${{ secrets.OIDC_CLIENT_ID }}" >> .env
|
||||
echo "OIDC_CLIENT_SECRET=${{ secrets.OIDC_CLIENT_SECRET }}" >> .env
|
||||
|
||||
- name: App bauen und starten
|
||||
run: |
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
UTF-8
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
PROJCS["ETRS_1989_UTM_Zone_32N",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
|
||||
<qgis version="3.40.10-Bratislava">
|
||||
<identifier></identifier>
|
||||
<parentidentifier></parentidentifier>
|
||||
<language></language>
|
||||
<type></type>
|
||||
<title></title>
|
||||
<abstract></abstract>
|
||||
<contact>
|
||||
<name></name>
|
||||
<organization></organization>
|
||||
<position></position>
|
||||
<voice></voice>
|
||||
<fax></fax>
|
||||
<email></email>
|
||||
<role></role>
|
||||
</contact>
|
||||
<links/>
|
||||
<dates/>
|
||||
<fees></fees>
|
||||
<encoding></encoding>
|
||||
<crs>
|
||||
<spatialrefsys nativeFormat="Wkt">
|
||||
<wkt></wkt>
|
||||
<proj4>+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs</proj4>
|
||||
<srsid>0</srsid>
|
||||
<srid>0</srid>
|
||||
<authid></authid>
|
||||
<description></description>
|
||||
<projectionacronym></projectionacronym>
|
||||
<ellipsoidacronym></ellipsoidacronym>
|
||||
<geographicflag>false</geographicflag>
|
||||
</spatialrefsys>
|
||||
</crs>
|
||||
<extent>
|
||||
<spatial crs="" maxx="0" maxy="0" maxz="0" minz="0" dimensions="2" minx="0" miny="0"/>
|
||||
<temporal>
|
||||
<period>
|
||||
<start></start>
|
||||
<end></end>
|
||||
</period>
|
||||
</temporal>
|
||||
</extent>
|
||||
</qgis>
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
UTF-8
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
PROJCS["ETRS_1989_UTM_Zone_32N",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
|
||||
<qgis version="3.40.10-Bratislava">
|
||||
<identifier></identifier>
|
||||
<parentidentifier></parentidentifier>
|
||||
<language></language>
|
||||
<type></type>
|
||||
<title></title>
|
||||
<abstract></abstract>
|
||||
<links/>
|
||||
<dates/>
|
||||
<fees></fees>
|
||||
<encoding></encoding>
|
||||
<crs>
|
||||
<spatialrefsys nativeFormat="Wkt">
|
||||
<wkt></wkt>
|
||||
<proj4></proj4>
|
||||
<srsid>0</srsid>
|
||||
<srid>0</srid>
|
||||
<authid></authid>
|
||||
<description></description>
|
||||
<projectionacronym></projectionacronym>
|
||||
<ellipsoidacronym></ellipsoidacronym>
|
||||
<geographicflag>false</geographicflag>
|
||||
</spatialrefsys>
|
||||
</crs>
|
||||
<extent/>
|
||||
</qgis>
|
||||
Binary file not shown.
Binary file not shown.
342
app.js
342
app.js
|
|
@ -12,7 +12,14 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
ownerMapping: { firstName: 'vorname', lastName: 'nachname' }, // Default for ALKIS and modern Shapefiles
|
||||
ownerStatuses: {}, // { "name vorname": { status: "...", notiz: "..." } }
|
||||
showAuxiliary: true,
|
||||
isEditMode: false
|
||||
isEditMode: false,
|
||||
isLoading: true,
|
||||
hasLoadedFromDB: false
|
||||
};
|
||||
|
||||
const getProjektId = () => {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
return urlParams.get('project') || urlParams.get('projekt') || urlParams.get('projekt_id') || "BWSamern-Ohne";
|
||||
};
|
||||
|
||||
const STATUS_MAP = {
|
||||
|
|
@ -70,6 +77,17 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
maxZoom: 19
|
||||
}).addTo(state.map);
|
||||
|
||||
// Automatisches Sortieren der Layer beim Ein-/Ausschalten
|
||||
state.map.on('overlayadd', (e) => {
|
||||
const name = (e.name || '').toLowerCase();
|
||||
if (name.includes('eigentümer') || name.includes('flurstücke') || name.includes('alkis') || name.includes('gebäude')) {
|
||||
if (typeof e.layer.bringToBack === 'function') {
|
||||
e.layer.bringToBack();
|
||||
console.log(`Layer ${e.name} in den Hintergrund verschoben.`);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Layer Groups for Variants
|
||||
const variantLayers = {
|
||||
'A': L.layerGroup().addTo(state.map),
|
||||
|
|
@ -1103,9 +1121,97 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
const statusEl = document.getElementById('statusInfo');
|
||||
const isLocalFile = globalThis.location?.protocol === 'file:';
|
||||
|
||||
const createDbLayer = (geojsonData, name, styleFunc, isFreileitung) => {
|
||||
if (!geojsonData || !geojsonData.features || geojsonData.features.length === 0) return;
|
||||
|
||||
const layer = L.geoJSON(geojsonData, {
|
||||
style: styleFunc,
|
||||
pointToLayer: (feature, latlng) => {
|
||||
if (name.toLowerCase().includes('wohngebäude')) {
|
||||
return L.marker(latlng, {
|
||||
icon: L.divIcon({
|
||||
className: 'residential-icon',
|
||||
html: '<span style="font-size: 20px; line-height: 24px;">🏠</span>',
|
||||
iconSize: [24, 24],
|
||||
iconAnchor: [12, 12]
|
||||
})
|
||||
});
|
||||
}
|
||||
return L.circleMarker(latlng, {
|
||||
radius: 4,
|
||||
fillColor: styleFunc().color || 'violet',
|
||||
color: "#fff",
|
||||
weight: 1,
|
||||
opacity: 1,
|
||||
fillOpacity: 0.8
|
||||
});
|
||||
},
|
||||
onEachFeature: (feature, l) => {
|
||||
if (feature.properties) {
|
||||
let popup = `<b>${name}</b><br><hr style="margin: 5px 0; border: 0; border-top: 1px solid #444;">`;
|
||||
for (let key in feature.properties) {
|
||||
const val = feature.properties[key];
|
||||
if (val !== null && val !== undefined) popup += `<b>${key}:</b> ${val}<br>`;
|
||||
}
|
||||
l.bindPopup(popup);
|
||||
}
|
||||
}
|
||||
});
|
||||
if (overlays[name]) {
|
||||
state.map.removeLayer(overlays[name]);
|
||||
layerControl.removeLayer(overlays[name]);
|
||||
}
|
||||
overlays[name] = layer;
|
||||
state.map.addLayer(layer);
|
||||
layerControl.addOverlay(layer, name);
|
||||
|
||||
// In bakedData eintragen für die Abstandslinien (updateProximityLines)
|
||||
state.bakedData[name] = { data: geojsonData, style: styleFunc() };
|
||||
|
||||
// Dynamischer Turf Buffer für Freileitungen
|
||||
if (isFreileitung) {
|
||||
try {
|
||||
const bufferedFeatures = [];
|
||||
geojsonData.features.forEach(f => {
|
||||
let dist = 0.05; // 50m default
|
||||
const spannung = (f.properties.spannung || '').toString().toLowerCase();
|
||||
if (spannung.includes('110')) dist = 0.035;
|
||||
else if (spannung.includes('380')) dist = 0.05;
|
||||
|
||||
const b = turf.buffer(f, dist, {units: 'kilometers'});
|
||||
if (b) bufferedFeatures.push(b);
|
||||
});
|
||||
|
||||
if (bufferedFeatures.length > 0) {
|
||||
const bufferLayer = L.geoJSON({ type: 'FeatureCollection', features: bufferedFeatures }, {
|
||||
style: {
|
||||
color: '#ffff00',
|
||||
weight: 0,
|
||||
fillColor: '#ffff00',
|
||||
fillOpacity: 0.3
|
||||
}
|
||||
});
|
||||
const bufferName = name + " (Puffer)";
|
||||
if (overlays[bufferName]) {
|
||||
state.map.removeLayer(overlays[bufferName]);
|
||||
layerControl.removeLayer(overlays[bufferName]);
|
||||
}
|
||||
overlays[bufferName] = bufferLayer;
|
||||
state.map.addLayer(bufferLayer);
|
||||
layerControl.addOverlay(bufferLayer, bufferName);
|
||||
bufferLayer.bringToBack();
|
||||
}
|
||||
} catch(err) {
|
||||
console.error("Fehler beim Erstellen des Puffers für " + name, err);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
const projId = getProjektId();
|
||||
|
||||
// Priority 1: Use globalThis.BAKED_DATA if available (Standalone Mode)
|
||||
if (globalThis.BAKED_DATA) {
|
||||
if (globalThis.BAKED_DATA && (projId.toLowerCase() === 'bwsamern-ohne' || isLocalFile)) {
|
||||
// Support both old format (direct layers) and new format (with mapping/statuses)
|
||||
let bakedLayers = globalThis.BAKED_DATA;
|
||||
if (globalThis.BAKED_DATA.layers) {
|
||||
|
|
@ -1118,14 +1224,17 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
}
|
||||
|
||||
// Priority 2: Use globalThis.LAYER_CONFIG (Script-based config) or remote config
|
||||
const layers = await resolveLayerConfig(isLocalFile, statusEl);
|
||||
if (layers) {
|
||||
await loadConfigLayers(layers);
|
||||
// Only load local config layers if the project is the default (bwsamern-ohne)
|
||||
if (projId.toLowerCase() === 'bwsamern-ohne') {
|
||||
const layers = await resolveLayerConfig(isLocalFile, statusEl);
|
||||
if (layers) {
|
||||
await loadConfigLayers(layers);
|
||||
}
|
||||
}
|
||||
|
||||
// ALKIS aus Datenbank IMMER laden
|
||||
console.log("Lade ALKIS-Layer aus Datenbank...");
|
||||
const alkisResp = await fetch('/api/layers/alkis').catch(err => {
|
||||
const alkisResp = await fetch(`/api/layers/alkis?project=${encodeURIComponent(projId)}`).catch(err => {
|
||||
console.error("Netzwerkfehler beim Laden des ALKIS-Layers:", err);
|
||||
return null;
|
||||
});
|
||||
|
|
@ -1135,6 +1244,20 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
console.log(`ALKIS API: ${data.features ? data.features.length : 0} Features erhalten.`);
|
||||
await processALKISData(data, "Eigentümer (ALKIS DB)");
|
||||
|
||||
// Auto-zoom to project parcels bounds if features exist
|
||||
const alkisLayer = overlays["Eigentümer (ALKIS DB)"];
|
||||
if (alkisLayer && data.features && data.features.length > 0) {
|
||||
try {
|
||||
const bounds = alkisLayer.getBounds();
|
||||
if (bounds.isValid()) {
|
||||
state.map.fitBounds(bounds);
|
||||
console.log("Erfolgreich auf ALKIS-Flächen gezoomt.");
|
||||
}
|
||||
} catch (zoomErr) {
|
||||
console.error("Fehler beim Zoomen auf ALKIS-Flächen:", zoomErr);
|
||||
}
|
||||
}
|
||||
|
||||
cleanupLocalOwnerLayers();
|
||||
} else {
|
||||
const errorText = alkisResp ? await alkisResp.text() : "Server nicht erreichbar";
|
||||
|
|
@ -1144,7 +1267,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
|
||||
// Artennachweis laden
|
||||
console.log("Lade Artennachweis-Layer aus Datenbank...");
|
||||
const artenResp = await fetch('/api/layers/artennachweis').catch(err => {
|
||||
const artenResp = await fetch(`/api/layers/artennachweis?project=${encodeURIComponent(projId)}`).catch(err => {
|
||||
console.error("Netzwerkfehler beim Laden des Artennachweis-Layers:", err);
|
||||
return null;
|
||||
});
|
||||
|
|
@ -1185,7 +1308,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
|
||||
// Artennachweis Restriktionsabstände laden
|
||||
console.log("Lade Artennachweise-Restriktionen aus Datenbank...");
|
||||
const restriktionResp = await fetch('/api/layers/artennachweise_restriktionen').catch(err => {
|
||||
const restriktionResp = await fetch(`/api/layers/artennachweise_restriktionen?project=${encodeURIComponent(projId)}`).catch(err => {
|
||||
console.error("Netzwerkfehler beim Laden der Restriktionsabstände:", err);
|
||||
return null;
|
||||
});
|
||||
|
|
@ -1251,72 +1374,6 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
});
|
||||
}
|
||||
|
||||
const createDbLayer = (geojsonData, name, styleFunc, isFreileitung) => {
|
||||
if (geojsonData.features.length === 0) return;
|
||||
|
||||
const layer = L.geoJSON(geojsonData, {
|
||||
style: styleFunc,
|
||||
onEachFeature: (feature, l) => {
|
||||
if (feature.properties) {
|
||||
let popup = `<b>${name}</b><br><hr style="margin: 5px 0; border: 0; border-top: 1px solid #444;">`;
|
||||
for (let key in feature.properties) {
|
||||
const val = feature.properties[key];
|
||||
if (val !== null && val !== undefined) popup += `<b>${key}:</b> ${val}<br>`;
|
||||
}
|
||||
l.bindPopup(popup);
|
||||
}
|
||||
}
|
||||
});
|
||||
if (overlays[name]) {
|
||||
state.map.removeLayer(overlays[name]);
|
||||
layerControl.removeLayer(overlays[name]);
|
||||
}
|
||||
overlays[name] = layer;
|
||||
state.map.addLayer(layer);
|
||||
layerControl.addOverlay(layer, name);
|
||||
|
||||
// In bakedData eintragen für die Abstandslinien (updateProximityLines)
|
||||
state.bakedData[name] = { data: geojsonData, style: styleFunc() };
|
||||
|
||||
// Dynamischer Turf Buffer für Freileitungen
|
||||
if (isFreileitung) {
|
||||
try {
|
||||
const bufferedFeatures = [];
|
||||
geojsonData.features.forEach(f => {
|
||||
let dist = 0.05; // 50m default
|
||||
const spannung = (f.properties.spannung || '').toString().toLowerCase();
|
||||
if (spannung.includes('110')) dist = 0.035;
|
||||
else if (spannung.includes('380')) dist = 0.05;
|
||||
|
||||
const b = turf.buffer(f, dist, {units: 'kilometers'});
|
||||
if (b) bufferedFeatures.push(b);
|
||||
});
|
||||
|
||||
if (bufferedFeatures.length > 0) {
|
||||
const bufferLayer = L.geoJSON({ type: 'FeatureCollection', features: bufferedFeatures }, {
|
||||
style: {
|
||||
color: '#ffff00',
|
||||
weight: 0,
|
||||
fillColor: '#ffff00',
|
||||
fillOpacity: 0.3
|
||||
}
|
||||
});
|
||||
const bufferName = name + " (Puffer)";
|
||||
if (overlays[bufferName]) {
|
||||
state.map.removeLayer(overlays[bufferName]);
|
||||
layerControl.removeLayer(overlays[bufferName]);
|
||||
}
|
||||
overlays[bufferName] = bufferLayer;
|
||||
state.map.addLayer(bufferLayer);
|
||||
layerControl.addOverlay(bufferLayer, bufferName);
|
||||
bufferLayer.bringToBack();
|
||||
}
|
||||
} catch(err) {
|
||||
console.error("Fehler beim Erstellen des Puffers für " + name, err);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
createDbLayer(freileitungen, "Freileitungen (DB)", () => ({ color: '#ccaa00', weight: 3, fillOpacity: 0 }), true);
|
||||
createDbLayer(wasserstoff, "Wasserstoffleitungen (DB)", () => ({ color: '#9400d3', weight: 2.5, fillOpacity: 0 }), false);
|
||||
|
||||
|
|
@ -1326,7 +1383,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
|
||||
// Gebäude laden
|
||||
console.log("Lade Gebäude aus Datenbank...");
|
||||
const gebaudeResp = await fetch('/api/layers/gebaeude').catch(err => {
|
||||
const gebaudeResp = await fetch(`/api/layers/gebaeude?project=${encodeURIComponent(projId)}`).catch(err => {
|
||||
console.error("Netzwerkfehler beim Laden der Gebäude:", err);
|
||||
return null;
|
||||
});
|
||||
|
|
@ -1357,6 +1414,26 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
console.warn("Gebäude-Layer konnte nicht geladen werden.");
|
||||
}
|
||||
|
||||
// Wohngebäude laden
|
||||
console.log("Lade Wohngebäude aus Datenbank...");
|
||||
const wohngebaudeResp = await fetch(`/api/layers/wohngebeaude?project=${encodeURIComponent(projId)}`).catch(err => {
|
||||
console.error("Netzwerkfehler beim Laden der Wohngebäude:", err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (wohngebaudeResp?.ok) {
|
||||
const data = await wohngebaudeResp.json();
|
||||
console.log(`Wohngebäude API: ${data.features ? data.features.length : 0} Features erhalten.`);
|
||||
createDbLayer(data, "Wohngebäude (DB)", () => ({
|
||||
color: "red",
|
||||
weight: 1,
|
||||
fillColor: "red",
|
||||
fillOpacity: 0.4
|
||||
}), false);
|
||||
} else {
|
||||
console.warn("Wohngebä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);
|
||||
|
|
@ -1378,7 +1455,9 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
|
||||
function cleanupLocalOwnerLayers() {
|
||||
const localOwnerKeys = Object.keys(overlays).filter(k =>
|
||||
k.toLowerCase().includes('eigentümer') && k !== 'Eigentümer (ALKIS DB)'
|
||||
k.toLowerCase().includes('eigentümer') &&
|
||||
k !== 'Eigentümer (ALKIS DB)' &&
|
||||
!k.toLowerCase().includes('umriss')
|
||||
);
|
||||
localOwnerKeys.forEach(key => {
|
||||
console.log(`Entferne lokalen Layer "${key}" (wird durch ALKIS DB ersetzt).`);
|
||||
|
|
@ -1475,7 +1554,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
}
|
||||
|
||||
layerControl.addOverlay(layer, layerName);
|
||||
layer.bringToFront(); // Ensure it's on top of local shapefiles
|
||||
layer.bringToBack(); // Ensure it is behind other map overlays like turbines
|
||||
|
||||
// ---- Erzeuge zusätzlich den Umriss-Layer ----
|
||||
const outlineLayerName = "Flurstücke & Eigentümer (Umriss)";
|
||||
|
|
@ -1531,7 +1610,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
}
|
||||
layerControl.addOverlay(outlineLayer, outlineLayerName);
|
||||
if (state.map.hasLayer(outlineLayer)) {
|
||||
outlineLayer.bringToFront();
|
||||
outlineLayer.bringToBack();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1823,7 +1902,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
setTimeout(() => element.style.borderColor = '', 1500);
|
||||
}
|
||||
|
||||
const projekt_id = "BWSamern-Ohne";
|
||||
const projekt_id = getProjektId();
|
||||
|
||||
try {
|
||||
const response = await fetch('/api/sicherung', {
|
||||
|
|
@ -1899,7 +1978,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
});
|
||||
|
||||
async function loadOwnerStatusesFromDB() {
|
||||
const projekt_id = "BWSamern-Ohne";
|
||||
const projekt_id = getProjektId();
|
||||
console.log("Lade Eigentümer-Status aus Datenbank...");
|
||||
try {
|
||||
const response = await fetch(`/api/sicherung/${projekt_id}`);
|
||||
|
|
@ -1942,29 +2021,56 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
|
||||
// Initialize Dynamic Layers and then load data
|
||||
initDynamicLayers().then(async () => {
|
||||
// Erst Status laden
|
||||
await loadOwnerStatusesFromDB();
|
||||
try {
|
||||
// Erst Status laden
|
||||
await loadOwnerStatusesFromDB();
|
||||
|
||||
// Dann WEAs laden
|
||||
await loadTurbinesFromDB();
|
||||
// Dann WEAs laden
|
||||
await loadTurbinesFromDB();
|
||||
|
||||
// Automatisches Mapping für den Eigentümer-Layer prüfen
|
||||
const ownerLayerName = Object.keys(overlays).find(k => k.toLowerCase().includes('eigentümer'));
|
||||
if (ownerLayerName && overlays[ownerLayerName]) {
|
||||
const layer = overlays[ownerLayerName];
|
||||
const layers = layer.getLayers();
|
||||
if (layers.length > 0) {
|
||||
const firstFeature = layers[0].feature;
|
||||
if (firstFeature?.properties) {
|
||||
const props = firstFeature.properties;
|
||||
const vna = Object.keys(props).find(k => k.toUpperCase() === 'VNA');
|
||||
const gna = Object.keys(props).find(k => k.toUpperCase() === 'GNA' || k.toUpperCase() === 'NBA');
|
||||
if (vna && gna) {
|
||||
state.ownerMapping = { firstName: vna, lastName: gna };
|
||||
refreshOwnerLayerStyle();
|
||||
// Automatisches Mapping für den Eigentümer-Layer prüfen
|
||||
const ownerLayerName = Object.keys(overlays).find(k => k.toLowerCase().includes('eigentümer'));
|
||||
if (ownerLayerName && overlays[ownerLayerName]) {
|
||||
const layer = overlays[ownerLayerName];
|
||||
const layers = layer.getLayers();
|
||||
if (layers.length > 0) {
|
||||
const firstFeature = layers[0].feature;
|
||||
if (firstFeature?.properties) {
|
||||
const props = firstFeature.properties;
|
||||
const vna = Object.keys(props).find(k => k.toUpperCase() === 'VNA');
|
||||
const gna = Object.keys(props).find(k => k.toUpperCase() === 'GNA' || k.toUpperCase() === 'NBA');
|
||||
if (vna && gna) {
|
||||
state.ownerMapping = { firstName: vna, lastName: gna };
|
||||
refreshOwnerLayerStyle();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Auto-zoom to project parcels
|
||||
if (ownerLayerName && overlays[ownerLayerName]) {
|
||||
const layer = overlays[ownerLayerName];
|
||||
const layers = layer.getLayers();
|
||||
const matchedLayers = layers.filter(l => {
|
||||
if (!l.feature?.properties) return false;
|
||||
const props = l.feature.properties;
|
||||
const firstName = (props.vorname || props.VNA || '').trim();
|
||||
const lastName = (props.nachname || props.GNA || '').trim();
|
||||
const matched = getAlkisOwnerStatus(firstName, lastName, state);
|
||||
return matched && matched.status && matched.status.toLowerCase() !== 'none';
|
||||
});
|
||||
|
||||
if (matchedLayers.length > 0) {
|
||||
const group = L.featureGroup(matchedLayers);
|
||||
state.map.fitBounds(group.getBounds());
|
||||
console.log(`Auto-Zoom auf ${matchedLayers.length} Flächen des Projekts ausgeführt.`);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("Fehler bei der Initialisierung des Planungstools:", e);
|
||||
} finally {
|
||||
state.isLoading = false;
|
||||
console.log("Planungstool initialisiert, isLoading = false");
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -2004,17 +2110,39 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
// DB Persistence
|
||||
let autoSaveTimeout = null;
|
||||
function triggerAutoSave() {
|
||||
if (state.isLoading) {
|
||||
console.log("Auto-Save unterdrückt: App befindet sich noch in der Ladephase.");
|
||||
return;
|
||||
}
|
||||
if (!state.hasLoadedFromDB) {
|
||||
console.warn("Auto-Save unterdrückt: Datenbank wurde beim Start nicht erfolgreich geladen.");
|
||||
return;
|
||||
}
|
||||
if (autoSaveTimeout) clearTimeout(autoSaveTimeout);
|
||||
autoSaveTimeout = setTimeout(() => {
|
||||
saveTurbinesToDB();
|
||||
saveTurbinesToDB(false);
|
||||
}, 1500); // 1.5 Seconds debounce
|
||||
}
|
||||
|
||||
async function saveTurbinesToDB() {
|
||||
const statusEl = document.getElementById('statusInfo');
|
||||
if (statusEl) statusEl.innerText = "Automatische Speicherung...";
|
||||
async function saveTurbinesToDB(force = false) {
|
||||
if (state.isLoading && !force) {
|
||||
console.log("Speichern unterdrückt: Ladephase aktiv.");
|
||||
return;
|
||||
}
|
||||
if (!state.hasLoadedFromDB && !force) {
|
||||
console.warn("Speichern unterdrückt: Datenbank wurde beim Start nicht geladen.");
|
||||
return;
|
||||
}
|
||||
|
||||
const projekt_id = "BWSamern-Ohne";
|
||||
if (!state.hasLoadedFromDB && force) {
|
||||
const confirmSave = confirm("WARNUNG: Die Datenbank wurde beim Start nicht erfolgreich geladen. Wenn Sie jetzt speichern, überschreiben Sie eventuell vorhandene Standorte in der Datenbank. Möchten Sie trotzdem speichern?");
|
||||
if (!confirmSave) return;
|
||||
}
|
||||
|
||||
const statusEl = document.getElementById('statusInfo');
|
||||
if (statusEl) statusEl.innerText = "Speicherung läuft...";
|
||||
|
||||
const projekt_id = getProjektId();
|
||||
const turbineData = state.turbines.map(t => ({
|
||||
nr: t.nr,
|
||||
variant: t.variant,
|
||||
|
|
@ -2041,17 +2169,17 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
}
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
if (statusEl) statusEl.innerHTML = `<span style="color: #ff4444;">Auto-Save Fehler: ${err.message}</span>`;
|
||||
if (statusEl) statusEl.innerHTML = `<span style="color: #ff4444;">Speicherfehler: ${err.message}</span>`;
|
||||
}
|
||||
}
|
||||
|
||||
const btnSaveDB = document.getElementById('btnSaveDB');
|
||||
if (btnSaveDB) {
|
||||
btnSaveDB.addEventListener('click', saveTurbinesToDB);
|
||||
btnSaveDB.addEventListener('click', () => saveTurbinesToDB(true));
|
||||
}
|
||||
|
||||
async function loadTurbinesFromDB() {
|
||||
const projekt_id = "BWSamern-Ohne";
|
||||
const projekt_id = getProjektId();
|
||||
const statusEl = document.getElementById('statusInfo');
|
||||
console.log(`Lade WEAs aus Datenbank für Projekt: ${projekt_id}...`);
|
||||
try {
|
||||
|
|
@ -2102,9 +2230,11 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
} else {
|
||||
console.log("Datenbank ist leer.");
|
||||
}
|
||||
state.hasLoadedFromDB = true;
|
||||
} catch (err) {
|
||||
console.error("GLOBALER FEHLER beim Laden aus der DB:", err);
|
||||
if (statusEl) statusEl.innerText = "Fehler beim Laden der Standorte.";
|
||||
state.hasLoadedFromDB = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
const { Client } = require('pg');
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
client.connect().then(async () => {
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'geodata'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
const { Client } = require('pg');
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
client.connect().then(async () => {
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function clean() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function fix() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function fixView() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
const { Client } = require('pg');
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
client.connect().then(async () => {
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
require('dotenv').config({ path: require('path').resolve(__dirname, '../.env') });
|
||||
const { Client } = require('pg');
|
||||
|
||||
const client = new Client({
|
||||
|
|
@ -5,7 +6,7 @@ const client = new Client({
|
|||
port: 5432,
|
||||
database: 'enwelo',
|
||||
user: 'postgres',
|
||||
password: ''
|
||||
password: process.env.DB_PASSWORD
|
||||
});
|
||||
|
||||
async function run() {
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function inspect() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function inspect() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'geodata'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
require('dotenv').config({ path: '../.env' });
|
||||
const { Pool } = require('pg');
|
||||
|
||||
const pool = new Pool({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
database: process.env.DB_NAME,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD
|
||||
});
|
||||
|
||||
async function run() {
|
||||
try {
|
||||
const res = await pool.query("SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'geodaten' AND table_name = 'artennachweis'");
|
||||
console.log("Columns:", res.rows);
|
||||
|
||||
// Test the exact query
|
||||
const res2 = 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(
|
||||
'art', art
|
||||
)
|
||||
) AS feature
|
||||
FROM geodaten.artennachweis
|
||||
) features`);
|
||||
console.log("Query Success! First few chars of result:", JSON.stringify(res2.rows[0]).substring(0, 100));
|
||||
} catch (err) {
|
||||
console.error("Error:", err.message);
|
||||
} finally {
|
||||
pool.end();
|
||||
}
|
||||
}
|
||||
|
||||
run();
|
||||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function test_insert() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function testFullLogic() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function testInsert() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,47 @@
|
|||
require('dotenv').config({ path: '../.env' });
|
||||
const { Pool } = require('pg');
|
||||
|
||||
const pool = new Pool({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
database: process.env.DB_NAME,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD
|
||||
});
|
||||
|
||||
async function run() {
|
||||
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(
|
||||
'art', art,
|
||||
'spannung', spannung,
|
||||
'ltg_name', ltg_name,
|
||||
'bezeichnun', bezeichnun,
|
||||
'bemerkung', bemerkung,
|
||||
'status', status,
|
||||
'quelle', quelle,
|
||||
'info', info,
|
||||
'vorschlag', vorschlag
|
||||
)
|
||||
) AS feature
|
||||
FROM geodaten.leitungsverlaeufe
|
||||
WHERE art ILIKE '%wasserstoff%' OR art ILIKE '%freileitung%'
|
||||
) features`
|
||||
);
|
||||
console.log("Success! Output:", JSON.stringify(result.rows[0]).substring(0, 100));
|
||||
} catch (err) {
|
||||
console.error("DB Error:", err.message);
|
||||
} finally {
|
||||
pool.end();
|
||||
}
|
||||
}
|
||||
|
||||
run();
|
||||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function testQuery() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function testProject() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,5 +1,12 @@
|
|||
const { Client } = require('pg');
|
||||
const client = new Client({ host: '87.106.21.21', port: 5432, user: 'enwelo_admin', password: 'WX1t1cgP1qK09', database: 'enwelo' });
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
async function resolveProjectId(client, input) {
|
||||
if (!input) return null;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const { Client } = require('pg');
|
||||
|
||||
async function check() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
require('dotenv').config({ path: '../.env' });
|
||||
const client = new Client({
|
||||
host: process.env.DB_HOST,
|
||||
port: process.env.DB_PORT,
|
||||
user: process.env.DB_USER,
|
||||
password: process.env.DB_PASSWORD,
|
||||
database: process.env.DB_NAME
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
|
|
|
|||
|
|
@ -1,25 +1,24 @@
|
|||
services:
|
||||
bw-samern-ohne:
|
||||
standortplaner:
|
||||
# Baut das Image basierend auf deinem Dockerfile
|
||||
build: .
|
||||
container_name: bw-samern-ohne
|
||||
container_name: standortplaner
|
||||
restart: always
|
||||
# Lädt die Umgebungsvariablen (die durch deine deploy.yaml erstellt werden)
|
||||
env_file:
|
||||
- .env
|
||||
networks:
|
||||
- proxy
|
||||
labels:
|
||||
# 1. Aktivierung in Traefik
|
||||
- "traefik.enable=true"
|
||||
|
||||
# 2. Router-Konfiguration (Domain & HTTPS)
|
||||
- "traefik.http.routers.bw-samern-ohne.rule=Host(`bw-samern-ohne.enwelo-serverumgebung.cloud`)"
|
||||
- "traefik.http.routers.bw-samern-ohne.entrypoints=websecure"
|
||||
- "traefik.http.routers.bw-samern-ohne.tls.certresolver=le"
|
||||
|
||||
# 3. Zuweisung des internen Service-Ports
|
||||
- "traefik.http.services.bw-samern-ohne.loadbalancer.server.port=3000"
|
||||
|
||||
# 4. Authentik-Schutz (Middleware)
|
||||
# Wir nutzen jetzt den Namen aus unserer neuen Server-Datei:
|
||||
- "traefik.http.routers.bw-samern-ohne.middlewares=authentik@file"
|
||||
# URL-Routing
|
||||
- "traefik.http.routers.standortplaner.rule=Host(`standortplaner.enwelo-serverumgebung.cloud`)"
|
||||
- "traefik.http.routers.standortplaner.entrypoints=websecure"
|
||||
- "traefik.http.routers.standortplaner.tls.certresolver=le"
|
||||
# Authentik-Schutz
|
||||
- "traefik.http.routers.standortplaner.middlewares=authentik@file"
|
||||
# Port-Mapping
|
||||
- "traefik.http.services.standortplaner.loadbalancer.server.port=3000"
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
|
|
|
|||
|
|
@ -0,0 +1,180 @@
|
|||
const { Client } = require('pg');
|
||||
const shapefile = require('shapefile');
|
||||
const crypto = require('node:crypto');
|
||||
|
||||
const firstNames = ['Hans', 'Peter', 'Thomas', 'Michael', 'Andreas', 'Wolfgang', 'Klaus', 'Jürgen', 'Günter', 'Christian', 'Maria', 'Ursula', 'Monika', 'Petra', 'Elisabeth', 'Sabine', 'Renate', 'Karin', 'Helga', 'Gisela'];
|
||||
const lastNames = ['Müller', 'Schmidt', 'Schneider', 'Fischer', 'Weber', 'Meyer', 'Wagner', 'Becker', 'Schulz', 'Hoffmann', 'Schäfer', 'Koch', 'Bauer', 'Richter', 'Klein', 'Wolf', 'Schröder', 'Neumann', 'Schwarz', 'Zimmermann'];
|
||||
|
||||
function getRandomElement(arr) {
|
||||
return arr[Math.floor(Math.random() * arr.length)];
|
||||
}
|
||||
|
||||
function getRandomStatus() {
|
||||
const val = Math.random();
|
||||
if (val < 0.1) return 'Gesichert';
|
||||
if (val < 0.3) return 'In Verhandlung';
|
||||
return 'Offen';
|
||||
}
|
||||
|
||||
function geojsonToWkt(geom) {
|
||||
if (geom.type === 'Polygon') {
|
||||
const rings = geom.coordinates.map(ring =>
|
||||
'(' + ring.map(pt => `${pt[0]} ${pt[1]}`).join(', ') + ')'
|
||||
).join(', ');
|
||||
return `MULTIPOLYGON((${rings}))`;
|
||||
} else if (geom.type === 'MultiPolygon') {
|
||||
const polys = geom.coordinates.map(poly =>
|
||||
'(' + poly.map(ring =>
|
||||
'(' + ring.map(pt => `${pt[0]} ${pt[1]}`).join(', ') + ')'
|
||||
).join(', ') + ')'
|
||||
).join(', ');
|
||||
return `MULTIPOLYGON(${polys})`;
|
||||
} else if (geom.type === 'Point') {
|
||||
return `POINT(${geom.coordinates[0]} ${geom.coordinates[1]})`;
|
||||
}
|
||||
throw new Error('Unsupported geometry type: ' + geom.type);
|
||||
}
|
||||
|
||||
async function run() {
|
||||
const client = new Client({
|
||||
host: '87.106.21.21',
|
||||
port: 5432,
|
||||
user: 'enwelo_admin',
|
||||
password: 'WX1t1cgP1qK09',
|
||||
database: 'enwelo'
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
console.log("Connected to database.");
|
||||
|
||||
// 1. Ensure project 'test' exists
|
||||
let projectUuid;
|
||||
const checkProj = await client.query("SELECT id FROM geodaten.projekte WHERE name = 'test';");
|
||||
if (checkProj.rows.length > 0) {
|
||||
projectUuid = checkProj.rows[0].id;
|
||||
console.log(`Project 'test' already exists with UUID: ${projectUuid}`);
|
||||
} else {
|
||||
projectUuid = crypto.randomUUID();
|
||||
await client.query("INSERT INTO geodaten.projekte (id, name, beschreibung) VALUES ($1, $2, $3);", [projectUuid, 'test', 'Testprojekt für Dummydaten']);
|
||||
console.log(`Created project 'test' with UUID: ${projectUuid}`);
|
||||
}
|
||||
|
||||
// 2. Update turbine where project_id IS NULL to 'test'
|
||||
console.log("Updating wind turbine...");
|
||||
const weaUpdate = await client.query(
|
||||
`UPDATE geodaten.wea_standorte
|
||||
SET projekt_id = 'test', wea_nummer = COALESCE(wea_nummer, '1')
|
||||
WHERE projekt_id IS NULL OR projekt_id = ''
|
||||
RETURNING id, ST_AsText(geom) as geom_wkt;`
|
||||
);
|
||||
console.log(`Updated ${weaUpdate.rowCount} wind turbine(s) to project 'test'.`);
|
||||
|
||||
// 3. Import Flurstücke
|
||||
console.log("Reading Flurstücke shapefile...");
|
||||
const flurstuecke = await shapefile.read("Shapefile/Test/Flurstücke.shp");
|
||||
console.log(`Found ${flurstuecke.features.length} flurstücke features.`);
|
||||
|
||||
let insertedAlkis = 0;
|
||||
let insertedZuweisung = 0;
|
||||
let insertedStatus = 0;
|
||||
|
||||
for (let i = 0; i < flurstuecke.features.length; i++) {
|
||||
const f = flurstuecke.features[i];
|
||||
const props = f.properties;
|
||||
const fsk = props.flstkennz || props.FSK;
|
||||
if (!fsk) continue;
|
||||
|
||||
const wkt = geojsonToWkt(f.geometry);
|
||||
|
||||
// Check if ALKIS owner entry already exists
|
||||
const checkAlkis = await client.query('SELECT 1 FROM geodaten.flaecheneigentuemer_alkis WHERE "FSK" = $1;', [fsk]);
|
||||
if (checkAlkis.rows.length === 0) {
|
||||
const gna = getRandomElement(lastNames);
|
||||
const vna = getRandomElement(firstNames);
|
||||
const gemarkung = props.gemarkung || props.GMK__BEZ || '';
|
||||
const flur = parseInt(props.flur || props.FLN) || null;
|
||||
const gemeinde = props.gemeinde || props.GEM__BEZ || '';
|
||||
|
||||
await client.query(
|
||||
`INSERT INTO geodaten.flaecheneigentuemer_alkis ("FSK", "GNA", "VNA", "GMK__BEZ", "FLN", "GEM__BEZ", geom)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, ST_SetSRID(ST_GeomFromText($7), 25832));`,
|
||||
[fsk, gna, vna, gemarkung, flur, gemeinde, wkt]
|
||||
);
|
||||
insertedAlkis++;
|
||||
}
|
||||
|
||||
// Check if project assignment exists
|
||||
const checkZuw = await client.query('SELECT 1 FROM geodaten.flaecheneigentuemer_alkis_zuweisung WHERE fsk = $1 AND projekt_id = $2;', [fsk, projectUuid]);
|
||||
if (checkZuw.rows.length === 0) {
|
||||
await client.query(
|
||||
`INSERT INTO geodaten.flaecheneigentuemer_alkis_zuweisung (id, fsk, projekt_id, zugewiesen_am)
|
||||
VALUES ($1, $2, $3, NOW());`,
|
||||
[crypto.randomUUID(), fsk, projectUuid]
|
||||
);
|
||||
insertedZuweisung++;
|
||||
}
|
||||
|
||||
// Check if status entry exists
|
||||
const checkStat = await client.query('SELECT 1 FROM geodaten.flaecheneigentuemer_status WHERE fsk = $1 AND projekt_id = $2;', [fsk, projectUuid]);
|
||||
if (checkStat.rows.length === 0) {
|
||||
const status = getRandomStatus();
|
||||
await client.query(
|
||||
`INSERT INTO geodaten.flaecheneigentuemer_status (id, fsk, projekt_id, status, datum)
|
||||
VALUES ($1, $2, $3, $4, NOW());`,
|
||||
[crypto.randomUUID(), fsk, projectUuid, status]
|
||||
);
|
||||
insertedStatus++;
|
||||
}
|
||||
|
||||
if ((i + 1) % 200 === 0) {
|
||||
console.log(`Processed ${i + 1} / ${flurstuecke.features.length} flurstücke...`);
|
||||
}
|
||||
}
|
||||
console.log(`Flurstücke summary: Inserted ${insertedAlkis} owners, ${insertedZuweisung} assignments, ${insertedStatus} status values.`);
|
||||
|
||||
// 4. Import Wohngebäude
|
||||
console.log("Reading Wohngebäude shapefile...");
|
||||
const wohngebaeude = await shapefile.read("Shapefile/Test/Wohngebäude.shp");
|
||||
console.log(`Found ${wohngebaeude.features.length} wohngebäude features.`);
|
||||
|
||||
let insertedWohn = 0;
|
||||
for (let i = 0; i < wohngebaeude.features.length; i++) {
|
||||
const f = wohngebaeude.features[i];
|
||||
const props = f.properties;
|
||||
const wkt = geojsonToWkt(f.geometry);
|
||||
|
||||
const oi = props.OI || '';
|
||||
const ags = props.AGS || '';
|
||||
const gfk = props.GFK || '';
|
||||
const aktualitaet = props.AKTUALITAE || props.AKTUALITÄT || '';
|
||||
const wert = props.WERT !== undefined ? parseInt(props.WERT) : null;
|
||||
const axGeb = props.AX_Gebäude !== undefined ? parseInt(props.AX_Gebäude) : (props.AX_Gebäud !== undefined ? parseInt(props.AX_Gebäud) : null);
|
||||
const randPoint = props.rand_point !== undefined ? parseInt(props.rand_point) : null;
|
||||
|
||||
// Check if building already exists based on geometry/identifier (or just insert since it's dummy data, but let's check OI to avoid duplicates)
|
||||
const checkWohn = await client.query('SELECT 1 FROM geodaten.wohngebeaude WHERE "OI" = $1;', [oi]);
|
||||
if (checkWohn.rows.length === 0) {
|
||||
await client.query(
|
||||
`INSERT INTO geodaten.wohngebeaude (geom, rand_point_id, "AGS", "OI", "GFK", "AKTUALITAE", "WERT", "AX_Gebäude")
|
||||
VALUES (ST_SetSRID(ST_GeomFromText($1), 25832), $2, $3, $4, $5, $6, $7, $8);`,
|
||||
[wkt, randPoint, ags, oi, gfk, aktualitaet, wert, axGeb]
|
||||
);
|
||||
insertedWohn++;
|
||||
}
|
||||
|
||||
if ((i + 1) % 500 === 0) {
|
||||
console.log(`Processed ${i + 1} / ${wohngebaeude.features.length} wohngebäude...`);
|
||||
}
|
||||
}
|
||||
console.log(`Wohngebäude summary: Inserted ${insertedWohn} new residential buildings.`);
|
||||
|
||||
console.log("Successfully completed data import!");
|
||||
|
||||
} catch (e) {
|
||||
console.error("Database transaction error:", e);
|
||||
} finally {
|
||||
await client.end();
|
||||
}
|
||||
}
|
||||
run();
|
||||
|
|
@ -12,7 +12,8 @@
|
|||
"cors": "^2.8.5",
|
||||
"dotenv": "^16.4.5",
|
||||
"express": "^4.19.2",
|
||||
"pg": "^8.11.5"
|
||||
"pg": "^8.11.5",
|
||||
"shapefile": "^0.6.6"
|
||||
}
|
||||
},
|
||||
"node_modules/accepts": {
|
||||
|
|
@ -34,6 +35,12 @@
|
|||
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/array-source": {
|
||||
"version": "0.0.4",
|
||||
"resolved": "https://registry.npmjs.org/array-source/-/array-source-0.0.4.tgz",
|
||||
"integrity": "sha512-frNdc+zBn80vipY+GdcJkLEbMWj3xmzArYApmUGxoiV8uAu/ygcs9icPdsGdA26h0MkHUMW6EN2piIvVx+M5Mw==",
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/body-parser": {
|
||||
"version": "1.20.5",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
|
||||
|
|
@ -96,6 +103,12 @@
|
|||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/commander": {
|
||||
"version": "2.20.3",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/content-disposition": {
|
||||
"version": "0.5.4",
|
||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
|
||||
|
|
@ -309,6 +322,15 @@
|
|||
"url": "https://opencollective.com/express"
|
||||
}
|
||||
},
|
||||
"node_modules/file-source": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/file-source/-/file-source-0.6.1.tgz",
|
||||
"integrity": "sha512-1R1KneL7eTXmXfKxC10V/9NeGOdbsAXJ+lQ//fvvcHUgtaZcZDWNJNblxAoVOyV1cj45pOtUrR3vZTBwqcW8XA==",
|
||||
"license": "BSD-3-Clause",
|
||||
"dependencies": {
|
||||
"stream-source": "0.3"
|
||||
}
|
||||
},
|
||||
"node_modules/finalhandler": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
|
||||
|
|
@ -600,6 +622,16 @@
|
|||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/path-source": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/path-source/-/path-source-0.1.3.tgz",
|
||||
"integrity": "sha512-dWRHm5mIw5kw0cs3QZLNmpUWty48f5+5v9nWD2dw3Y0Hf+s01Ag8iJEWV0Sm0kocE8kK27DrIowha03e1YR+Qw==",
|
||||
"license": "BSD-3-Clause",
|
||||
"dependencies": {
|
||||
"array-source": "0.0",
|
||||
"file-source": "0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/path-to-regexp": {
|
||||
"version": "0.1.13",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
|
||||
|
|
@ -864,6 +896,24 @@
|
|||
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/shapefile": {
|
||||
"version": "0.6.6",
|
||||
"resolved": "https://registry.npmjs.org/shapefile/-/shapefile-0.6.6.tgz",
|
||||
"integrity": "sha512-rLGSWeK2ufzCVx05wYd+xrWnOOdSV7xNUW5/XFgx3Bc02hBkpMlrd2F1dDII7/jhWzv0MSyBFh5uJIy9hLdfuw==",
|
||||
"license": "BSD-3-Clause",
|
||||
"dependencies": {
|
||||
"array-source": "0.0",
|
||||
"commander": "2",
|
||||
"path-source": "0.1",
|
||||
"slice-source": "0.4",
|
||||
"stream-source": "0.3",
|
||||
"text-encoding": "^0.6.4"
|
||||
},
|
||||
"bin": {
|
||||
"dbf2json": "bin/dbf2json",
|
||||
"shp2json": "bin/shp2json"
|
||||
}
|
||||
},
|
||||
"node_modules/side-channel": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
|
||||
|
|
@ -936,6 +986,12 @@
|
|||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/slice-source": {
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/slice-source/-/slice-source-0.4.1.tgz",
|
||||
"integrity": "sha512-YiuPbxpCj4hD9Qs06hGAz/OZhQ0eDuALN0lRWJez0eD/RevzKqGdUx1IOMUnXgpr+sXZLq3g8ERwbAH0bCb8vg==",
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/split2": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
|
||||
|
|
@ -954,6 +1010,19 @@
|
|||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/stream-source": {
|
||||
"version": "0.3.5",
|
||||
"resolved": "https://registry.npmjs.org/stream-source/-/stream-source-0.3.5.tgz",
|
||||
"integrity": "sha512-ZuEDP9sgjiAwUVoDModftG0JtYiLUV8K4ljYD1VyUMRWtbVf92474o4kuuul43iZ8t/hRuiDAx1dIJSvirrK/g==",
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/text-encoding": {
|
||||
"version": "0.6.4",
|
||||
"resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
|
||||
"integrity": "sha512-hJnc6Qg3dWoOMkqP53F0dzRIgtmsAge09kxUIqGrEUS4qr5rWLckGYaQAVr+opBrIMRErGgy6f5aPnyPpyGRfg==",
|
||||
"deprecated": "no longer maintained",
|
||||
"license": "Unlicense"
|
||||
},
|
||||
"node_modules/toidentifier": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
|
||||
|
|
|
|||
|
|
@ -7,7 +7,8 @@
|
|||
"cors": "^2.8.5",
|
||||
"dotenv": "^16.4.5",
|
||||
"express": "^4.19.2",
|
||||
"pg": "^8.11.5"
|
||||
"pg": "^8.11.5",
|
||||
"shapefile": "^0.6.6"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "node server.js"
|
||||
|
|
|
|||
225
server.js
225
server.js
|
|
@ -210,49 +210,84 @@ app.get('/api/sicherung/:projekt_id', async (req, res) => {
|
|||
|
||||
// NEU: API zum Laden des ALKIS-Layers als GeoJSON
|
||||
app.get('/api/layers/alkis', async (req, res) => {
|
||||
log("Lade ALKIS-Layer aus Datenbank...");
|
||||
const projectParam = req.query.project || req.query.projekt_id || req.query.projekt;
|
||||
log(`Lade ALKIS-Layer aus Datenbank für Projekt: ${projectParam || 'alle'}`);
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
const result = await pool.query(
|
||||
`SELECT jsonb_build_object(
|
||||
'type', 'FeatureCollection',
|
||||
'features', jsonb_agg(features.feature)
|
||||
)
|
||||
FROM (
|
||||
let query = `
|
||||
SELECT jsonb_build_object(
|
||||
'type', 'Feature',
|
||||
'id', id,
|
||||
'geometry', ST_AsGeoJSON(ST_Transform(geom, 4326))::jsonb,
|
||||
'id', a.id,
|
||||
'geometry', ST_AsGeoJSON(ST_Transform(a.geom, 4326))::jsonb,
|
||||
'properties', jsonb_build_object(
|
||||
'id', id,
|
||||
'vorname', "VNA",
|
||||
'nachname', "GNA",
|
||||
'FSK', "FSK",
|
||||
'PLZ', "PLZ",
|
||||
'ORP', "ORP",
|
||||
'STR', "STR",
|
||||
'HSN', "HSN",
|
||||
'FLN', "FLN",
|
||||
'ZAE', "FSN__ZAE",
|
||||
'NEN', "FSN__NEN",
|
||||
'status', status,
|
||||
'notiz', notiz
|
||||
'id', a.id,
|
||||
'vorname', a."VNA",
|
||||
'nachname', a."GNA",
|
||||
'FSK', a."FSK",
|
||||
'PLZ', a."PLZ",
|
||||
'ORP', a."ORP",
|
||||
'STR', a."STR",
|
||||
'HSN', a."HSN",
|
||||
'FLN', a."FLN",
|
||||
'ZAE', a."FSN__ZAE",
|
||||
'NEN', a."FSN__NEN",
|
||||
'status', a.status,
|
||||
'notiz', a.notiz
|
||||
)
|
||||
) AS feature
|
||||
FROM geodaten.flaecheneigentuemer_alkis
|
||||
) features`
|
||||
);
|
||||
FROM geodaten.flaecheneigentuemer_alkis a
|
||||
`;
|
||||
const params = [];
|
||||
|
||||
if (projectParam) {
|
||||
const projId = await resolveProjectId(client, projectParam);
|
||||
if (projId) {
|
||||
query += ` JOIN geodaten.flaecheneigentuemer_alkis_zuweisung z ON a."FSK" = z.fsk WHERE z.projekt_id = $1`;
|
||||
params.push(projId);
|
||||
}
|
||||
}
|
||||
|
||||
const sql = `
|
||||
SELECT jsonb_build_object(
|
||||
'type', 'FeatureCollection',
|
||||
'features', COALESCE(jsonb_agg(features.feature), '[]'::jsonb)
|
||||
)
|
||||
FROM (
|
||||
${query}
|
||||
) features
|
||||
`;
|
||||
|
||||
const result = await client.query(sql, params);
|
||||
res.json(result.rows[0].jsonb_build_object);
|
||||
} catch (err) {
|
||||
log(`FEHLER beim Laden des ALKIS-Layers: ${err.message}`);
|
||||
res.status(500).json({ error: err.message });
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
});
|
||||
|
||||
// NEU: API zum Laden des Artennachweis-Layers als GeoJSON
|
||||
app.get('/api/layers/artennachweis', async (req, res) => {
|
||||
log("Lade Artennachweis-Layer aus Datenbank...");
|
||||
const projectParam = req.query.project || req.query.projekt_id || req.query.projekt;
|
||||
log(`Lade Artennachweis-Layer aus Datenbank für Projekt: ${projectParam || 'alle'}`);
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
const result = await pool.query(
|
||||
let whereClause = '';
|
||||
const params = [];
|
||||
|
||||
if (projectParam) {
|
||||
const projId = await resolveProjectId(client, projectParam);
|
||||
whereClause = `WHERE projekt_id = $1`;
|
||||
params.push(projectParam); // e.g. 'test' or 'BWSamern-Ohne'
|
||||
|
||||
if (projId) {
|
||||
whereClause += ` OR projekt_id = $2`;
|
||||
params.push(projId);
|
||||
}
|
||||
}
|
||||
|
||||
const result = await client.query(
|
||||
`SELECT jsonb_build_object(
|
||||
'type', 'FeatureCollection',
|
||||
'features', COALESCE(jsonb_agg(features.feature), '[]'::jsonb)
|
||||
|
|
@ -266,20 +301,43 @@ app.get('/api/layers/artennachweis', async (req, res) => {
|
|||
)
|
||||
) AS feature
|
||||
FROM geodaten.artennachweise
|
||||
) features`
|
||||
${whereClause}
|
||||
) features`,
|
||||
params
|
||||
);
|
||||
res.json(result.rows[0].jsonb_build_object);
|
||||
} catch (err) {
|
||||
log(`FEHLER beim Laden des Artennachweis-Layers: ${err.message}`);
|
||||
res.status(500).json({ error: err.message });
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
});
|
||||
|
||||
// NEU: API zum Laden der Artennachweis Restriktionsabstände
|
||||
app.get('/api/layers/artennachweise_restriktionen', async (req, res) => {
|
||||
log("Lade Artennachweise-Restriktionen aus Datenbank...");
|
||||
const projectParam = req.query.project || req.query.projekt_id || req.query.projekt;
|
||||
log(`Lade Artennachweise-Restriktionen aus Datenbank für Projekt: ${projectParam || 'alle'}`);
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
const result = await pool.query(
|
||||
let whereClause = '';
|
||||
const params = [];
|
||||
|
||||
if (projectParam) {
|
||||
const projId = await resolveProjectId(client, projectParam);
|
||||
if (projId) {
|
||||
whereClause = `WHERE EXISTS (
|
||||
SELECT 1
|
||||
FROM geodaten.flaecheneigentuemer_alkis alkis
|
||||
JOIN geodaten.flaecheneigentuemer_alkis_zuweisung z ON alkis."FSK" = z.fsk
|
||||
WHERE z.projekt_id = $1
|
||||
AND ST_DWithin(a.geom, alkis.geom, 5000)
|
||||
)`;
|
||||
params.push(projId);
|
||||
}
|
||||
}
|
||||
|
||||
const result = await client.query(
|
||||
`SELECT jsonb_build_object(
|
||||
'type', 'FeatureCollection',
|
||||
'features', COALESCE(jsonb_agg(features.feature), '[]'::jsonb)
|
||||
|
|
@ -287,16 +345,20 @@ app.get('/api/layers/artennachweise_restriktionen', async (req, res) => {
|
|||
FROM (
|
||||
SELECT jsonb_build_object(
|
||||
'type', 'Feature',
|
||||
'geometry', ST_AsGeoJSON(ST_Transform(geom, 4326))::jsonb,
|
||||
'geometry', ST_AsGeoJSON(ST_Transform(a.geom, 4326))::jsonb,
|
||||
'properties', jsonb_build_object()
|
||||
) AS feature
|
||||
FROM geodaten.artennachweise_restriktion_abstand
|
||||
) features`
|
||||
FROM geodaten.artennachweise_restriktion_abstand a
|
||||
${whereClause}
|
||||
) features`,
|
||||
params
|
||||
);
|
||||
res.json(result.rows[0].jsonb_build_object);
|
||||
} catch (err) {
|
||||
log(`FEHLER beim Laden der Restriktionen: ${err.message}`);
|
||||
res.status(500).json({ error: err.message });
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -326,7 +388,21 @@ app.get('/api/layers/leitungsverlaeufe', async (req, res) => {
|
|||
)
|
||||
) AS feature
|
||||
FROM geodaten.leitungsverleaufe
|
||||
WHERE art ILIKE '%wasserstoff%' OR art ILIKE '%freileitung%'
|
||||
WHERE art ILIKE '%wasserstoff%'
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT jsonb_build_object(
|
||||
'type', 'Feature',
|
||||
'geometry', ST_AsGeoJSON(ST_Transform(geom, 4326))::jsonb,
|
||||
'properties', jsonb_build_object(
|
||||
'art', 'freileitung',
|
||||
'land', land,
|
||||
'stand', stand,
|
||||
'spannung', '380'
|
||||
)
|
||||
) AS feature
|
||||
FROM geodaten."Freileitungen"
|
||||
) features`
|
||||
);
|
||||
res.json(result.rows[0].jsonb_build_object);
|
||||
|
|
@ -338,9 +414,28 @@ app.get('/api/layers/leitungsverlaeufe', async (req, res) => {
|
|||
|
||||
// NEU: API zum Laden der Gebäude
|
||||
app.get('/api/layers/gebaeude', async (req, res) => {
|
||||
log("Lade Gebäude aus Datenbank...");
|
||||
const projectParam = req.query.project || req.query.projekt_id || req.query.projekt;
|
||||
log(`Lade Gebäude aus Datenbank für Projekt: ${projectParam || 'alle'}`);
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
const result = await pool.query(
|
||||
let whereClause = '';
|
||||
const params = [];
|
||||
|
||||
if (projectParam) {
|
||||
const projId = await resolveProjectId(client, projectParam);
|
||||
if (projId) {
|
||||
whereClause = `WHERE EXISTS (
|
||||
SELECT 1
|
||||
FROM geodaten.flaecheneigentuemer_alkis alkis
|
||||
JOIN geodaten.flaecheneigentuemer_alkis_zuweisung z ON alkis."FSK" = z.fsk
|
||||
WHERE z.projekt_id = $1
|
||||
AND ST_DWithin(g.geom, alkis.geom, 5000)
|
||||
)`;
|
||||
params.push(projId);
|
||||
}
|
||||
}
|
||||
|
||||
const result = await client.query(
|
||||
`SELECT jsonb_build_object(
|
||||
'type', 'FeatureCollection',
|
||||
'features', COALESCE(jsonb_agg(features.feature), '[]'::jsonb)
|
||||
|
|
@ -348,16 +443,68 @@ app.get('/api/layers/gebaeude', async (req, res) => {
|
|||
FROM (
|
||||
SELECT jsonb_build_object(
|
||||
'type', 'Feature',
|
||||
'geometry', ST_AsGeoJSON(ST_Transform(geom, 4326))::jsonb,
|
||||
'geometry', ST_AsGeoJSON(ST_Transform(g.geom, 4326))::jsonb,
|
||||
'properties', jsonb_build_object()
|
||||
) AS feature
|
||||
FROM geodaten.gebaeude
|
||||
) features`
|
||||
FROM geodaten.gebaeude g
|
||||
${whereClause}
|
||||
) features`,
|
||||
params
|
||||
);
|
||||
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 });
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
});
|
||||
|
||||
// NEU: API zum Laden der Wohngebäude
|
||||
app.get('/api/layers/wohngebeaude', async (req, res) => {
|
||||
const projectParam = req.query.project || req.query.projekt_id || req.query.projekt;
|
||||
log(`Lade Wohngebäude aus Datenbank für Projekt: ${projectParam || 'alle'}`);
|
||||
const client = await pool.connect();
|
||||
try {
|
||||
let whereClause = '';
|
||||
const params = [];
|
||||
|
||||
if (projectParam) {
|
||||
const projId = await resolveProjectId(client, projectParam);
|
||||
if (projId) {
|
||||
whereClause = `WHERE EXISTS (
|
||||
SELECT 1
|
||||
FROM geodaten.flaecheneigentuemer_alkis alkis
|
||||
JOIN geodaten.flaecheneigentuemer_alkis_zuweisung z ON alkis."FSK" = z.fsk
|
||||
WHERE z.projekt_id = $1
|
||||
AND ST_DWithin(w.geom, alkis.geom, 5000)
|
||||
)`;
|
||||
params.push(projId);
|
||||
}
|
||||
}
|
||||
|
||||
const result = await client.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(w.geom, 4326))::jsonb,
|
||||
'properties', jsonb_build_object()
|
||||
) AS feature
|
||||
FROM geodaten.wohngebeaude w
|
||||
${whereClause}
|
||||
) features`,
|
||||
params
|
||||
);
|
||||
res.json(result.rows[0].jsonb_build_object);
|
||||
} catch (err) {
|
||||
log(`FEHLER beim Laden der Wohngebäude: ${err.message}`);
|
||||
res.status(500).json({ error: err.message });
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue