Fresh start without large data history
Deploy Standortpruefung / deploy (push) Failing after 7s Details

This commit is contained in:
Johannes Baumeister 2026-04-27 13:58:44 +02:00
commit 35d3640668
46 changed files with 13528 additions and 0 deletions

6
.gitattributes vendored Normal file
View File

@ -0,0 +1,6 @@
*.shp filter=lfs diff=lfs merge=lfs -text
*.dbf filter=lfs diff=lfs merge=lfs -text
*.shx filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.cpg filter=lfs diff=lfs merge=lfs -text
*.qmd filter=lfs diff=lfs merge=lfs -text

View File

@ -0,0 +1,19 @@
name: Deploy Standortpruefung
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Code holen
uses: actions/checkout@v4
- name: App bauen und starten
run: |
# Da der Runner Zugriff auf den Docker-Socket hat,
# baut er die App direkt dort, wo die Dateien liegen.
docker compose up -d --build --force-recreate

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
node_modules/
dist/
.DS_Store
*.local
.agent/
.vscode/
public/Daten/

32
Dockerfile Normal file
View File

@ -0,0 +1,32 @@
# Nutze Node.js als Basis (LTS Version)
FROM node:20-alpine AS build
WORKDIR /app
# Kopiere package files und installiere Abhängigkeiten
COPY package*.json ./
RUN npm install
# Kopiere den restlichen Code
COPY . .
# Baue das Frontend (erzeugt den 'dist' Ordner)
RUN npm run build
# Finales Image
FROM node:20-alpine
WORKDIR /app
# Installiere nur Production-Abhängigkeiten
COPY package*.json ./
RUN npm install --production
# Kopiere das gebaute Frontend und das Backend
COPY --from=build /app/dist ./dist
COPY --from=build /app/server.cjs ./
COPY --from=build /app/public ./public
# Der Express-Server läuft auf Port 3000
EXPOSE 3000
CMD ["node", "server.cjs"]

View File

@ -0,0 +1,8 @@
{
"folders": [
{
"path": "../../Users/JohannesBaumeister/OneDrive - Enwelo GmbH & Co. KG/Programmieren/Flächenprüfung v2"
}
],
"settings": {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

Binary file not shown.

25
README.md Normal file
View File

@ -0,0 +1,25 @@
# Windenergie-Flächenprüfung
Dieses Projekt dient der automatisierten Vorab-Prüfung von Flächen für Windenergieanlagen in NRW.
## Schnelleinstieg
### 1. Installation
Stellen Sie sicher, dass Node.js installiert ist und führen Sie im Hauptverzeichnis aus:
```bash
npm install
```
### 2. Starten
Verwenden Sie die Batch-Datei oder das npm-Skript:
* **Batch-Datei:** Doppelklick auf `start_server.bat`
* **Terminal:** `npm start`
Das System startet dann:
- den **Geodaten-Server** (Backend) auf [http://localhost:3000](http://localhost:3000)
- das **Frontend** (Vite) auf [http://localhost:5173](http://localhost:5173)
## Komponenten
- `server.cjs`: Express-Backend für WFS-Proxies und Shapefile-Parsing.
- `main.js`: Frontend-Logik mit Leaflet & Turf.js.
- `public/daten/`: Enthält die benötigten GIS-Daten (ZIP/SHP).

1813
atkis_caps.xml Normal file

File diff suppressed because it is too large Load Diff

0
capabilities.xml Normal file
View File

1901
capabilities_linfos.xml Normal file

File diff suppressed because it is too large Load Diff

482
capabilities_wind.xml Normal file
View File

@ -0,0 +1,482 @@
<?xml version="1.0" encoding="UTF-8"?>
<wfs:WFS_Capabilities xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:fes="http://www.opengis.net/fes/2.0" xmlns:erneuerbare_energien_wfs="http://www.wfs.nrw.de/schemas" xmlns="http://www.opengis.net/wfs/2.0" version="2.0.0" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd">
<ows:ServiceIdentification>
<ows:Title>WFS Erneuerbare Energien NRW</ows:Title>
<ows:Abstract>Der WFS-Dienst Erneuerbare Energien stellt die Anlagen der Erneuerbaren Energien Biomasse, Freiflächenphotovoltaik, Wasserkraft und Windkraft dar. Darüber hinaus werden die Anlagen von Klärgas, Deponiegas und Grubengas dargestellt, die aber streng genommen nicht zu den Erneuerbaren Energien zählen, jedoch ebenfalls in hohem Maße zum Klimaschutz beitragen.</ows:Abstract>
<ows:Keywords>
<ows:Keyword>WFS</ows:Keyword>
<ows:Keyword> WFS Erneuerbare Energien</ows:Keyword>
<ows:Keyword> Erneuerbare Energien</ows:Keyword>
<ows:Keyword> LANUV</ows:Keyword>
<ows:Keyword> Biomasse</ows:Keyword>
<ows:Keyword> PV</ows:Keyword>
<ows:Keyword> Photovoltaik</ows:Keyword>
<ows:Keyword> Wasserkraft</ows:Keyword>
<ows:Keyword> Windkraft</ows:Keyword>
<ows:Keyword> Klärgas</ows:Keyword>
<ows:Keyword> Grubengas</ows:Keyword>
<ows:Keyword> Deponiegas</ows:Keyword>
</ows:Keywords>
<ows:ServiceType codeSpace="OGC">WFS</ows:ServiceType>
<ows:ServiceTypeVersion>2.0.0</ows:ServiceTypeVersion>
<ows:Fees>keine</ows:Fees>
<ows:AccessConstraints>Das Fachinformationssystem 'Energieatlas Nordrhein-Westfalen' (www.energieatlas.nrw.de) sowie der zugehörige WFS-Dienst Erneuerbare Energien werden vom Landesamt für Natur, Umwelt und Verbraucherschutz bereitgestellt.&#13;
Grundlage für die Anlagendaten der Erneuerbaren Energien sind Daten der Bundesnetzagentur, der Übertragungsnetzbetreiber Amprion und Tennet, LANUV-eigene Daten und Daten des Landesverbandes Erneuerbare Energien NRW.&#13;
Für die Nutzung des WFS-Dienstes Erneuerbare Energien NRW gelten folgende Nutzungsbedingungen:&#13;
1. Aussagen, sowie Karten und Graphiken dürfen nicht verändert werden.&#13;
2. Die Datengrundlagen wurden mit größter Sorgfalt für den Energieatlas aufbereitet und ausgewertet. Für die Richtigkeit, Vollständigkeit und Aktualität der Daten wird keine Gewähr übernommen.&#13;
3. Die Vervielfältigung und Verbreitung von Inhalten ist, auch auszugsweise, nur mit Angabe des Herausgebers und der jeweiligen Datenquelle gestattet. Es ist an geeigneter Stelle ein deutlich sichtbarer Quellenvermerk wie folgt anzugeben: Energieatlas NRW, Herausgeber: Landesamt für Natur, Umwelt und Verbraucherschutz NRW, [Datenstand einfügen].&#13;
4. Die Aktualität der Daten ist unter dem Informationsbutton der jeweiligen Karte ersichtlich. Aktuellere Daten sind bei den entsprechenden Datenquellen einzuholen.&#13;
5. Für Sach- und Vermögensschäden, die Nutzern durch die Verwendung der Daten und Karten sowie aus der Unmöglichkeit des Zugriffes oder der Benutzung entstehen, übernimmt der Herausgeber keine Verantwortung. Dem Herausgeber kommt keine Garantie- und Einstandshaftung für das technische Funktionieren, die Kompatibilität mit der von dem Nutzer verwendeten Soft- oder Hardware sowie Virenfreiheit zu.&#13;
6. Das LANUV NRW behält sich vor, den Energieatlas NRW ohne Angaben von Gründen einzustellen.&#13;
Stand Ende 2023</ows:AccessConstraints>
</ows:ServiceIdentification>
<ows:ServiceProvider>
<ows:ProviderName>Landesamt für Natur, Umwelt und Klima Nordrhein-Westfalen</ows:ProviderName>
<ows:ProviderSite xlink:type="simple" xlink:href=""/>
<!--WARNING: Optional metadata "ows_service_onlineresource" was missing for ows:ProviderSite/@xlink:href-->
<ows:ServiceContact>
<ows:IndividualName>Christina Seidenstücker</ows:IndividualName>
<ows:PositionName>Ansprechpartner</ows:PositionName>
<ows:ContactInfo>
<ows:Phone>
<ows:Voice>+49 (0) 201-7995-1163</ows:Voice>
<ows:Facsimile>+49 (0) 201-7995-1446</ows:Facsimile>
</ows:Phone>
<ows:Address>
<ows:DeliveryPoint>Wallneyerstr. 6</ows:DeliveryPoint>
<ows:City>Essen</ows:City>
<ows:AdministrativeArea>NRW</ows:AdministrativeArea>
<ows:PostalCode>45133</ows:PostalCode>
<ows:Country>Germany</ows:Country>
<ows:ElectronicMailAddress>fachbereich37@lanuv.nrw.de</ows:ElectronicMailAddress>
</ows:Address>
<ows:OnlineResource xlink:type="simple" xlink:href=""/>
<!--WARNING: Optional metadata "ows_service_onlineresource" was missing for ows:OnlineResource/@xlink:href-->
<ows:HoursOfService></ows:HoursOfService>
<ows:ContactInstructions></ows:ContactInstructions>
</ows:ContactInfo>
<ows:Role></ows:Role>
</ows:ServiceContact>
</ows:ServiceProvider>
<ows:OperationsMetadata>
<ows:Operation name="GetCapabilities">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
<ows:Parameter name="AcceptVersions">
<ows:AllowedValues>
<ows:Value>2.0.0</ows:Value>
<ows:Value>1.1.0</ows:Value>
<ows:Value>1.0.0</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
<ows:Parameter name="AcceptFormats">
<ows:AllowedValues>
<ows:Value>text/xml</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
<ows:Parameter name="Sections">
<ows:AllowedValues>
<ows:Value>ServiceIdentification</ows:Value>
<ows:Value>ServiceProvider</ows:Value>
<ows:Value>OperationsMetadata</ows:Value>
<ows:Value>FeatureTypeList</ows:Value>
<ows:Value>Filter_Capabilities</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
</ows:Operation>
<ows:Operation name="DescribeFeatureType">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
<ows:Parameter name="outputFormat">
<ows:AllowedValues>
<ows:Value>application/gml+xml; version=3.2</ows:Value>
<ows:Value>text/xml; subtype=gml/3.2.1</ows:Value>
<ows:Value>text/xml; subtype=gml/3.1.1</ows:Value>
<ows:Value>text/xml; subtype=gml/2.1.2</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
</ows:Operation>
<ows:Operation name="GetFeature">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
<ows:Parameter name="outputFormat">
<ows:AllowedValues>
<ows:Value>application/gml+xml; version=3.2</ows:Value>
<ows:Value>text/xml; subtype=gml/3.2.1</ows:Value>
<ows:Value>text/xml; subtype=gml/3.1.1</ows:Value>
<ows:Value>text/xml; subtype=gml/2.1.2</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
</ows:Operation>
<ows:Operation name="GetPropertyValue">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
<ows:Parameter name="outputFormat">
<ows:AllowedValues>
<ows:Value>application/gml+xml; version=3.2</ows:Value>
<ows:Value>text/xml; subtype=gml/3.2.1</ows:Value>
<ows:Value>text/xml; subtype=gml/3.1.1</ows:Value>
<ows:Value>text/xml; subtype=gml/2.1.2</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
</ows:Operation>
<ows:Operation name="ListStoredQueries">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
</ows:Operation>
<ows:Operation name="DescribeStoredQueries">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
</ows:Operation>
<ows:Parameter name="version">
<ows:AllowedValues>
<ows:Value>2.0.0</ows:Value>
<ows:Value>1.1.0</ows:Value>
<ows:Value>1.0.0</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
<ows:Constraint name="ImplementsBasicWFS">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsTransactionalWFS">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsLockingWFS">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="KVPEncoding">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="XMLEncoding">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="SOAPEncoding">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsInheritance">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsRemoteResolve">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsResultPaging">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsStandardJoins">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsSpatialJoins">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsTemporalJoins">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsFeatureVersioning">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ManageStoredQueries">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="PagingIsTransactionSafe">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="CountDefault">
<ows:NoValues/>
<ows:DefaultValue>10000</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="QueryExpressions">
<ows:AllowedValues>
<ows:Value>wfs:Query</ows:Value>
<ows:Value>wfs:StoredQuery</ows:Value>
</ows:AllowedValues>
</ows:Constraint>
</ows:OperationsMetadata>
<FeatureTypeList>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Biomasse</Name>
<Title>WFS_Biomasse</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Biomasse"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Deponiegas</Name>
<Title>WFS_Deponiegas</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Deponiegas"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Freiflaechen_PV</Name>
<Title>WFS_Freiflaechen_PV</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Freiflaechen_PV"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Dachflaechen_PV</Name>
<Title>WFS_Dachflaechen_PV</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Dachflaechen_PV"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Grubengas</Name>
<Title>WFS_Grubengas</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Grubengas"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Klaeranlagen</Name>
<Title>WFS_Klaeranlagen</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Klaeranlagen"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Wasserkraft</Name>
<Title>WFS_Wasserkraft</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Wasserkraft"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Windenergie</Name>
<Title>WFS_Windenergie</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Windenergie"/>
</FeatureType>
</FeatureTypeList>
<fes:Filter_Capabilities>
<fes:Conformance>
<fes:Constraint name="ImplementsQuery">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsAdHocQuery">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsFunctions">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsResourceId">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsMinStandardFilter">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsStandardFilter">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsMinSpatialFilter">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsSpatialFilter">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsMinTemporalFilter">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsTemporalFilter">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsVersionNav">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsSorting">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsExtendedOperators">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsMinimumXPath">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsSchemaElementFunc">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
</fes:Conformance>
<fes:Id_Capabilities>
<fes:ResourceIdentifier name="fes:ResourceId"/>
</fes:Id_Capabilities>
<fes:Scalar_Capabilities>
<fes:LogicalOperators/>
<fes:ComparisonOperators>
<fes:ComparisonOperator name="PropertyIsEqualTo"/>
<fes:ComparisonOperator name="PropertyIsNotEqualTo"/>
<fes:ComparisonOperator name="PropertyIsLessThan"/>
<fes:ComparisonOperator name="PropertyIsGreaterThan"/>
<fes:ComparisonOperator name="PropertyIsLessThanOrEqualTo"/>
<fes:ComparisonOperator name="PropertyIsGreaterThanOrEqualTo"/>
<fes:ComparisonOperator name="PropertyIsLike"/>
<fes:ComparisonOperator name="PropertyIsBetween"/>
</fes:ComparisonOperators>
</fes:Scalar_Capabilities>
<fes:Spatial_Capabilities>
<fes:GeometryOperands>
<fes:GeometryOperand name="gml:Point"/>
<fes:GeometryOperand name="gml:MultiPoint"/>
<fes:GeometryOperand name="gml:LineString"/>
<fes:GeometryOperand name="gml:MultiLineString"/>
<fes:GeometryOperand name="gml:Curve"/>
<fes:GeometryOperand name="gml:MultiCurve"/>
<fes:GeometryOperand name="gml:Polygon"/>
<fes:GeometryOperand name="gml:MultiPolygon"/>
<fes:GeometryOperand name="gml:Surface"/>
<fes:GeometryOperand name="gml:MultiSurface"/>
<fes:GeometryOperand name="gml:Box"/>
<fes:GeometryOperand name="gml:Envelope"/>
</fes:GeometryOperands>
<fes:SpatialOperators>
<fes:SpatialOperator name="Equals"/>
<fes:SpatialOperator name="Disjoint"/>
<fes:SpatialOperator name="Touches"/>
<fes:SpatialOperator name="Within"/>
<fes:SpatialOperator name="Overlaps"/>
<fes:SpatialOperator name="Crosses"/>
<fes:SpatialOperator name="Intersects"/>
<fes:SpatialOperator name="Contains"/>
<fes:SpatialOperator name="DWithin"/>
<fes:SpatialOperator name="Beyond"/>
<fes:SpatialOperator name="BBOX"/>
</fes:SpatialOperators>
</fes:Spatial_Capabilities>
<fes:Temporal_Capabilities>
<fes:TemporalOperands>
<fes:TemporalOperand name="gml:TimePeriod"/>
<fes:TemporalOperand name="gml:TimeInstant"/>
</fes:TemporalOperands>
<fes:TemporalOperators>
<fes:TemporalOperator name="During"/>
</fes:TemporalOperators>
</fes:Temporal_Capabilities>
</fes:Filter_Capabilities>
</wfs:WFS_Capabilities>

24
debug_alkis.js Normal file
View File

@ -0,0 +1,24 @@
import https from 'https';
const url = 'https://www.wfs.nrw.de/geobasis/wfs_nw_alkis_vereinfacht?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=ave:Flurstueck&COUNT=1';
https.get(url, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
console.log("Response Status:", res.statusCode);
console.log("\nResponse Body Preview (first 2000 chars):");
console.log(data.substring(0, 2000));
// Check for user mentioned tags
console.log("\nTags check:");
console.log("flstnrzae?", data.includes('flstnrzae'));
console.log("flstnrnen?", data.includes('flstnrnen'));
console.log("gemeinde?", data.includes('gemeinde'));
console.log("gemarkung?", data.includes('gemarkung'));
console.log("flur?", data.includes('flur'));
});
}).on('error', (e) => {
console.error(e);
});

30
debug_caps.js Normal file
View File

@ -0,0 +1,30 @@
// import fetch from 'node-fetch'; // Built-in in Node 18+
async function checkCaps() {
try {
console.log("Checking Roads...");
const resRoads = await fetch('http://localhost:5173/api/wfs/roads?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetCapabilities');
const textRoads = await resRoads.text();
console.log("Roads Caps Length:", textRoads.length);
// Extract FeatureTypes and OutputFormats
if (textRoads.includes('FeatureType')) {
const types = textRoads.match(/<FeatureType>[\s\S]*?<Name>(.*?)<\/Name>/g) || [];
console.log("Roads Layers:", types.map(t => t.match(/<Name>(.*?)<\/Name>/)[1]));
}
console.log("\nChecking Sites...");
const resSites = await fetch('http://localhost:5173/api/nrw/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetCapabilities');
const textSites = await resSites.text();
console.log("Sites Caps Length:", textSites.length);
if (textSites.includes('FeatureType')) {
// Just find OutputFormats
const formats = textSites.match(/<ows:Operation name="GetFeature">[\s\S]*?<ows:Parameter name="outputFormat">([\s\S]*?)<\/ows:Parameter>/);
if (formats) console.log("Sites Formats:", formats[1]);
}
} catch (e) {
console.error(e);
}
}
checkCaps();

28
debug_caps_ea_wind.cjs Normal file
View File

@ -0,0 +1,28 @@
const https = require('https');
// WMS for Renewable Energy NRW
const url = "https://www.wms.nrw.de/umwelt/erneuerbare_energien_wfs?REQUEST=GetCapabilities&SERVICE=WMS";
// Note: using WFS prefix in URL but requesting WMS caps?
// The search result said: https://www.wms.nrw.de/umwelt/erneuerbare_energien_wfs for WFS
// and http://www.wms.nrw.de/umwelt/ea_wind?SERVICE=WMS for Wind.
// Let's try `ea_wind` and `erneuerbare_energien_nrw`.
const url1 = "https://www.wms.nrw.de/umwelt/ea_wind?SERVICE=WMS&REQUEST=GetCapabilities";
https.get(url1, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
console.log("--- Caps for ea_wind ---");
const names = [];
const titles = [];
let m;
const nameRe = /<Name>(.*?)<\/Name>/g;
while ((m = nameRe.exec(data)) !== null) names.push(m[1]);
const titleRe = /<Title>(.*?)<\/Title>/g;
while ((m = titleRe.exec(data)) !== null) titles.push(m[1]);
console.log("Names:", names);
console.log("Titles:", titles);
});
}).on('error', e => console.log(e.message));

24
debug_caps_ee_nrw.cjs Normal file
View File

@ -0,0 +1,24 @@
const https = require('https');
const url = "https://www.wms.nrw.de/umwelt/erneuerbare_energien_nrw?SERVICE=WMS&REQUEST=GetCapabilities";
https.get(url, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
console.log("--- Caps for erneuerbare_energien_nrw ---");
const names = [];
const titles = [];
let m;
// Simple regex - might miss nested structure but gets list
const nameRe = /<Name>(.*?)<\/Name>/g;
while ((m = nameRe.exec(data)) !== null) names.push(m[1]);
const titleRe = /<Title>(.*?)<\/Title>/g;
while ((m = titleRe.exec(data)) !== null) titles.push(m[1]);
console.log("Names:", names);
console.log("Titles:", titles);
});
}).on('error', e => console.log(e.message));

42
debug_caps_energy.cjs Normal file
View File

@ -0,0 +1,42 @@
const https = require('https');
const url = "https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?REQUEST=GetCapabilities&SERVICE=WFS";
console.log("Fetching capabilities from:", url);
https.get(url, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
// Simple regex to find FeatureTypes
// Look for <Name>...</Name> and <Title>...</Title> inside <FeatureType>
// Note: XML namespace prefixes might vary.
console.log(`Received ${data.length} bytes.`);
// Split by FeatureType to isolate
const parts = data.split(/<\/?(?:wfs:)?FeatureType>/);
console.log("Found Layers:");
let count = 0;
for (const part of parts) {
if (!part.includes('Name>')) continue;
const nameMatch = part.match(/<Name>(.*?)<\/Name>/);
const titleMatch = part.match(/<Title>(.*?)<\/Title>/);
if (nameMatch) {
// remove namespaces from name for cleaner printing if needed
console.log(`- Layer: ${nameMatch[1]}`);
if (titleMatch) console.log(` Title: ${titleMatch[1]}`);
count++;
}
}
if (count === 0) {
console.log("No layers found. Dumping first 500 chars:");
console.log(data.substring(0, 500));
}
});
}).on('error', err => {
console.error("Error:", err.message);
});

45
debug_caps_inspire.js Normal file
View File

@ -0,0 +1,45 @@
// import fetch from 'node-fetch';
async function checkCaps() {
try {
console.log("Checking Inspire Sites Caps...");
const url = "https://www.wms.nrw.de/umwelt/wfs_nw_inspire-schutzgebiete?REQUEST=GetCapabilities&SERVICE=WMS";
const res = await fetch(url);
const text = await res.text();
console.log("Length:", text.length);
// formats
if (text.includes('Layer')) {
const layers = text.match(/<Name>(.*?)<\/Name>/g);
// Log first 20 layers
if (layers) console.log("Layers:", layers.slice(0, 20));
}
// Switch back to WMS linfos URL
const url2 = "https://www.wms.nrw.de/umwelt/linfos?REQUEST=GetCapabilities&SERVICE=WMS";
const res2 = await fetch(url2);
const text2 = await res2.text();
if (text2.includes('Layer')) {
const layers = text2.match(/<Name>(.*?)<\/Name>/g);
if (layers) console.log("LINFOS Layers:", layers.slice(0, 20));
}
if (text.includes('outputFormat')) {
// Basic regex to find outputFormat block
const match = text.match(/name="outputFormat"[\s\S]*?<\/ows:Parameter>/);
if (match) {
console.log("OutputFormats Block:", match[0]);
} else {
console.log("No specific outputFormat parameter found in typical place.");
// Look for other indicators
const jsonRef = text.match(/json/i);
console.log("JSON Keywords:", jsonRef);
}
} else {
console.log("No outputFormat string found.");
}
} catch (e) {
console.error(e);
}
}
checkCaps();

45
debug_caps_wms.cjs Normal file
View File

@ -0,0 +1,45 @@
const https = require('https');
const url = "https://www.wms.nrw.de/wms/wms_nw_regionalplan?SERVICE=WMS&REQUEST=GetCapabilities";
console.log("Fetching capabilities from:", url);
https.get(url, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
console.log(`Received ${data.length} bytes.`);
// Simple regex to find Layers
// WMS: <Layer> <Name>...</Name> <Title>...</Title> ... <Layer>
const matches = data.matchAll(/<Layer[^>]*>([\s\S]*?)<\/Layer>/g);
console.log("Found Layers (Top level):");
// This regex is too greedy for nested layers.
// Let's just grep for Name and Title lines to see what's available
const lines = data.split('\n');
lines.forEach(line => {
if (line.includes('<Name>') || line.includes('<Title>')) {
// console.log(line.trim());
}
});
// Better: print the structure loosely
// Or just print Names
const nameMatches = data.matchAll(/<Name>(.*?)<\/Name>/g);
const titleMatches = data.matchAll(/<Title>(.*?)<\/Title>/g);
console.log("--- Names found ---");
for (const m of nameMatches) console.log(m[1]);
console.log("--- Titles found ---");
// Limit titles output
let i = 0;
for (const m of titleMatches) {
if (i++ < 20) console.log(m[1]);
}
});
}).on('error', err => {
console.error("Error:", err.message);
});

38
debug_caps_wms_deep.cjs Normal file
View File

@ -0,0 +1,38 @@
const https = require('https');
const url = "https://www.wms.nrw.de/wms/wms_nw_regionalplan?SERVICE=WMS&REQUEST=GetCapabilities";
https.get(url, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
// Match Layer Name and Title
const regex = /<Layer[^>]*>([\s\S]*?)<\/Layer>/g;
// We need to parse recursively or just look for Name/Title pairs close to each other
// Simple scan
const layers = [];
const lines = data.split(/>\s*</);
let currentName = "";
let currentTitle = "";
// This simple XML parsing is fragile but sufficient for discovery
// Let's just dump all Name/Title occurrences
const names = [];
const titles = [];
const nameRe = /<Name>(.*?)<\/Name>/g;
const titleRe = /<Title>(.*?)<\/Title>/g;
let m;
while ((m = nameRe.exec(data)) !== null) {
names.push(m[1]);
}
while ((m = titleRe.exec(data)) !== null) {
titles.push(m[1]);
}
console.log("Names:", names);
console.log("Titles:", titles);
});
});

18
debug_coords.js Normal file
View File

@ -0,0 +1,18 @@
const turf = require('@turf/turf');
const proj4 = require('proj4');
// Test point within a known potential area (approximate)
// You might need to adjust these coords to match a known potential area
const testPoint = [7.63, 51.96]; // lon, lat
// Projection
proj4.defs("EPSG:25832", "+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs");
proj4.defs("EPSG:4326", "+proj=longlat +datum=WGS84 +no_defs");
const [utmX, utmY] = proj4("EPSG:4326", "EPSG:25832", testPoint);
console.log(`Test Point (UTM32): ${utmX}, ${utmY}`);
// Mock features - We need to inspect what the server actually sees.
// Since we can't easily reproduce the large zip loading here without the file,
// we'll add logging to the server.cjs instead.

29
debug_planning_zip.cjs Normal file
View File

@ -0,0 +1,29 @@
global.self = global;
const fs = require('fs');
// const shp = require('shpjs'); // Removed
const ZIP_PATH = 'public/daten/Windenergiebereiche_NRW.zip';
(async () => {
try {
const { default: shp } = await import('shpjs');
console.log("Reading Zip...");
const buffer = fs.readFileSync(ZIP_PATH);
// shpjs (default export handle)
const geojson = await shp(buffer);
if (Array.isArray(geojson)) {
console.log("Found multiple features/files:", geojson.length);
geojson.forEach(g => console.log(" - File:", g.fileName || 'unknown', "Features:", g.features.length));
} else {
console.log("Found single FeatureCollection. Features:", geojson.features.length);
if (geojson.features.length > 0) {
console.log("First feature geometry type:", geojson.features[0].geometry.type);
console.log("First coordinate:", JSON.stringify(geojson.features[0].geometry.coordinates[0][0][0]));
}
}
} catch (e) {
console.error("Error parsing ZIP:", e.message);
}
})();

24
debug_planning_zip.mjs Normal file
View File

@ -0,0 +1,24 @@
import fs from 'fs';
import shp from 'shpjs';
global.self = global;
const ZIP_PATH = 'public/daten/Windenergiebereiche-Regionalplanung-NRW_EPSG25832_Geodatabase.zip';
(async () => {
try {
console.log("Reading Zip...");
const buffer = fs.readFileSync(ZIP_PATH);
const geojson = await shp(buffer);
if (Array.isArray(geojson)) {
console.log("Found multiple features/files:", geojson.length);
geojson.forEach(g => console.log(" - File:", g.fileName || 'unknown', "Features:", g.features.length));
} else {
console.log("Found single FeatureCollection. Features:", geojson.features.length);
}
} catch (e) {
console.error("Error parsing ZIP:", e.message); // e.stack for more info
if (e.message.includes("but-unzip")) console.log("Hint: This might be a GDB format which shpjs cannot read.");
}
})();

6
debug_shp.cjs Normal file
View File

@ -0,0 +1,6 @@
global.self = global; // Polyfill
const shp = require('shpjs');
console.log("Type of shp:", typeof shp);
console.log("Keys of shp entries:", Object.keys(shp));
console.log("Is shp a function?", typeof shp === 'function');

5
debug_shp.mjs Normal file
View File

@ -0,0 +1,5 @@
global.self = global;
import shp from 'shpjs';
console.log("Imported shp:", shp);
console.log("Type:", typeof shp);

19
debug_usage.cjs Normal file
View File

@ -0,0 +1,19 @@
const https = require('https');
const lat = 51.4332;
const lng = 7.6616;
const size = 0.001;
const bbox = `${lat - size},${lng - size},${lat + size},${lng + size},urn:ogc:def:crs:EPSG::4326`;
const url = `https://www.wfs.nrw.de/geobasis/wfs_nw_alkis_vereinfacht?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=ave:Nutzung&BBOX=${bbox}&COUNT=1`;
https.get(url, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
console.log("Response Body Preview:");
console.log(data.substring(0, 5000));
});
}).on('error', (e) => {
console.error(e);
});

36
debug_wind_wfs.cjs Normal file
View File

@ -0,0 +1,36 @@
const https = require('https');
const lat = 51.4332;
const lng = 7.6616;
const size = 0.05;
const bbox = `${lat - size},${lng - size},${lat + size},${lng + size},urn:ogc:def:crs:EPSG::4326`;
const url = `https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=erneuerbare_energien_wfs:WFS_Windenergie&BBOX=${bbox}&COUNT=10`;
https.get(url, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
console.log("Response length:", data.length);
const features = [];
const blocks = data.split(/<wfs:member[^>]*>/);
console.log("Found blocks:", blocks.length - 1);
for (let i = 1; i < blocks.length; i++) {
const block = blocks[i];
const posMatch = block.match(/<gml:pos[^>]*>(.*?)<\/gml:pos>/);
const ibjahrMatch = block.match(/<erneuerbare_energien_wfs:ibjahr[^>]*>(.*?)<\/erneuerbare_energien_wfs:ibjahr>/);
if (posMatch) {
const coords = posMatch[1].trim().split(/\s+/).map(Number);
features.push({
coords: coords,
ibjahr: ibjahrMatch ? ibjahrMatch[1].trim() : "Unbekannt"
});
}
}
console.log("Parsed features:", features.length);
if (features.length > 0) console.log("First feature:", features[0]);
});
}).on('error', (e) => {
console.error(e);
});

22
docker-compose.yml Normal file
View File

@ -0,0 +1,22 @@
services:
wind-tool-standortpruefung:
build: .
container_name: wind-tool-standortpruefung
restart: always
networks:
- proxy
labels:
# 1. Aktivierung in Traefik
- "traefik.enable=true"
# 2. Router-Konfiguration
- "traefik.http.routers.wind-tool.rule=Host(`wind-tool-standortpruefung.enwelo-serverumgebung.cloud`)"
- "traefik.http.routers.wind-tool.entrypoints=websecure"
- "traefik.http.routers.wind-tool.tls.certresolver=le"
# 3. Port (Express-Server im Container)
- "traefik.http.services.wind-tool.loadbalancer.server.port=3000"
# 4. Authentik-Schutz
- "traefik.http.routers.wind-tool.middlewares=authentik@file"
networks:
proxy:
external: true

482
energy_new_caps.xml Normal file
View File

@ -0,0 +1,482 @@
<?xml version="1.0" encoding="UTF-8"?>
<wfs:WFS_Capabilities xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:fes="http://www.opengis.net/fes/2.0" xmlns:erneuerbare_energien_wfs="http://www.wfs.nrw.de/schemas" xmlns="http://www.opengis.net/wfs/2.0" version="2.0.0" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd">
<ows:ServiceIdentification>
<ows:Title>WFS Erneuerbare Energien NRW</ows:Title>
<ows:Abstract>Der WFS-Dienst Erneuerbare Energien stellt die Anlagen der Erneuerbaren Energien Biomasse, Freiflächenphotovoltaik, Wasserkraft und Windkraft dar. Darüber hinaus werden die Anlagen von Klärgas, Deponiegas und Grubengas dargestellt, die aber streng genommen nicht zu den Erneuerbaren Energien zählen, jedoch ebenfalls in hohem Maße zum Klimaschutz beitragen.</ows:Abstract>
<ows:Keywords>
<ows:Keyword>WFS</ows:Keyword>
<ows:Keyword> WFS Erneuerbare Energien</ows:Keyword>
<ows:Keyword> Erneuerbare Energien</ows:Keyword>
<ows:Keyword> LANUV</ows:Keyword>
<ows:Keyword> Biomasse</ows:Keyword>
<ows:Keyword> PV</ows:Keyword>
<ows:Keyword> Photovoltaik</ows:Keyword>
<ows:Keyword> Wasserkraft</ows:Keyword>
<ows:Keyword> Windkraft</ows:Keyword>
<ows:Keyword> Klärgas</ows:Keyword>
<ows:Keyword> Grubengas</ows:Keyword>
<ows:Keyword> Deponiegas</ows:Keyword>
</ows:Keywords>
<ows:ServiceType codeSpace="OGC">WFS</ows:ServiceType>
<ows:ServiceTypeVersion>2.0.0</ows:ServiceTypeVersion>
<ows:Fees>keine</ows:Fees>
<ows:AccessConstraints>Das Fachinformationssystem 'Energieatlas Nordrhein-Westfalen' (www.energieatlas.nrw.de) sowie der zugehörige WFS-Dienst Erneuerbare Energien werden vom Landesamt für Natur, Umwelt und Verbraucherschutz bereitgestellt.&#13;
Grundlage für die Anlagendaten der Erneuerbaren Energien sind Daten der Bundesnetzagentur, der Übertragungsnetzbetreiber Amprion und Tennet, LANUV-eigene Daten und Daten des Landesverbandes Erneuerbare Energien NRW.&#13;
Für die Nutzung des WFS-Dienstes Erneuerbare Energien NRW gelten folgende Nutzungsbedingungen:&#13;
1. Aussagen, sowie Karten und Graphiken dürfen nicht verändert werden.&#13;
2. Die Datengrundlagen wurden mit größter Sorgfalt für den Energieatlas aufbereitet und ausgewertet. Für die Richtigkeit, Vollständigkeit und Aktualität der Daten wird keine Gewähr übernommen.&#13;
3. Die Vervielfältigung und Verbreitung von Inhalten ist, auch auszugsweise, nur mit Angabe des Herausgebers und der jeweiligen Datenquelle gestattet. Es ist an geeigneter Stelle ein deutlich sichtbarer Quellenvermerk wie folgt anzugeben: Energieatlas NRW, Herausgeber: Landesamt für Natur, Umwelt und Verbraucherschutz NRW, [Datenstand einfügen].&#13;
4. Die Aktualität der Daten ist unter dem Informationsbutton der jeweiligen Karte ersichtlich. Aktuellere Daten sind bei den entsprechenden Datenquellen einzuholen.&#13;
5. Für Sach- und Vermögensschäden, die Nutzern durch die Verwendung der Daten und Karten sowie aus der Unmöglichkeit des Zugriffes oder der Benutzung entstehen, übernimmt der Herausgeber keine Verantwortung. Dem Herausgeber kommt keine Garantie- und Einstandshaftung für das technische Funktionieren, die Kompatibilität mit der von dem Nutzer verwendeten Soft- oder Hardware sowie Virenfreiheit zu.&#13;
6. Das LANUV NRW behält sich vor, den Energieatlas NRW ohne Angaben von Gründen einzustellen.&#13;
Stand Ende 2023</ows:AccessConstraints>
</ows:ServiceIdentification>
<ows:ServiceProvider>
<ows:ProviderName>Landesamt für Natur, Umwelt und Klima Nordrhein-Westfalen</ows:ProviderName>
<ows:ProviderSite xlink:type="simple" xlink:href=""/>
<!--WARNING: Optional metadata "ows_service_onlineresource" was missing for ows:ProviderSite/@xlink:href-->
<ows:ServiceContact>
<ows:IndividualName>Christina Seidenstücker</ows:IndividualName>
<ows:PositionName>Ansprechpartner</ows:PositionName>
<ows:ContactInfo>
<ows:Phone>
<ows:Voice>+49 (0) 201-7995-1163</ows:Voice>
<ows:Facsimile>+49 (0) 201-7995-1446</ows:Facsimile>
</ows:Phone>
<ows:Address>
<ows:DeliveryPoint>Wallneyerstr. 6</ows:DeliveryPoint>
<ows:City>Essen</ows:City>
<ows:AdministrativeArea>NRW</ows:AdministrativeArea>
<ows:PostalCode>45133</ows:PostalCode>
<ows:Country>Germany</ows:Country>
<ows:ElectronicMailAddress>fachbereich37@lanuv.nrw.de</ows:ElectronicMailAddress>
</ows:Address>
<ows:OnlineResource xlink:type="simple" xlink:href=""/>
<!--WARNING: Optional metadata "ows_service_onlineresource" was missing for ows:OnlineResource/@xlink:href-->
<ows:HoursOfService></ows:HoursOfService>
<ows:ContactInstructions></ows:ContactInstructions>
</ows:ContactInfo>
<ows:Role></ows:Role>
</ows:ServiceContact>
</ows:ServiceProvider>
<ows:OperationsMetadata>
<ows:Operation name="GetCapabilities">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
<ows:Parameter name="AcceptVersions">
<ows:AllowedValues>
<ows:Value>2.0.0</ows:Value>
<ows:Value>1.1.0</ows:Value>
<ows:Value>1.0.0</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
<ows:Parameter name="AcceptFormats">
<ows:AllowedValues>
<ows:Value>text/xml</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
<ows:Parameter name="Sections">
<ows:AllowedValues>
<ows:Value>ServiceIdentification</ows:Value>
<ows:Value>ServiceProvider</ows:Value>
<ows:Value>OperationsMetadata</ows:Value>
<ows:Value>FeatureTypeList</ows:Value>
<ows:Value>Filter_Capabilities</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
</ows:Operation>
<ows:Operation name="DescribeFeatureType">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
<ows:Parameter name="outputFormat">
<ows:AllowedValues>
<ows:Value>application/gml+xml; version=3.2</ows:Value>
<ows:Value>text/xml; subtype=gml/3.2.1</ows:Value>
<ows:Value>text/xml; subtype=gml/3.1.1</ows:Value>
<ows:Value>text/xml; subtype=gml/2.1.2</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
</ows:Operation>
<ows:Operation name="GetFeature">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
<ows:Parameter name="outputFormat">
<ows:AllowedValues>
<ows:Value>application/gml+xml; version=3.2</ows:Value>
<ows:Value>text/xml; subtype=gml/3.2.1</ows:Value>
<ows:Value>text/xml; subtype=gml/3.1.1</ows:Value>
<ows:Value>text/xml; subtype=gml/2.1.2</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
</ows:Operation>
<ows:Operation name="GetPropertyValue">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
<ows:Parameter name="outputFormat">
<ows:AllowedValues>
<ows:Value>application/gml+xml; version=3.2</ows:Value>
<ows:Value>text/xml; subtype=gml/3.2.1</ows:Value>
<ows:Value>text/xml; subtype=gml/3.1.1</ows:Value>
<ows:Value>text/xml; subtype=gml/2.1.2</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
</ows:Operation>
<ows:Operation name="ListStoredQueries">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
</ows:Operation>
<ows:Operation name="DescribeStoredQueries">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
<ows:Post xlink:type="simple" xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?"/>
</ows:HTTP>
</ows:DCP>
</ows:Operation>
<ows:Parameter name="version">
<ows:AllowedValues>
<ows:Value>2.0.0</ows:Value>
<ows:Value>1.1.0</ows:Value>
<ows:Value>1.0.0</ows:Value>
</ows:AllowedValues>
</ows:Parameter>
<ows:Constraint name="ImplementsBasicWFS">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsTransactionalWFS">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsLockingWFS">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="KVPEncoding">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="XMLEncoding">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="SOAPEncoding">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsInheritance">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsRemoteResolve">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsResultPaging">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsStandardJoins">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsSpatialJoins">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsTemporalJoins">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ImplementsFeatureVersioning">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="ManageStoredQueries">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="PagingIsTransactionSafe">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="CountDefault">
<ows:NoValues/>
<ows:DefaultValue>10000</ows:DefaultValue>
</ows:Constraint>
<ows:Constraint name="QueryExpressions">
<ows:AllowedValues>
<ows:Value>wfs:Query</ows:Value>
<ows:Value>wfs:StoredQuery</ows:Value>
</ows:AllowedValues>
</ows:Constraint>
</ows:OperationsMetadata>
<FeatureTypeList>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Biomasse</Name>
<Title>WFS_Biomasse</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Biomasse"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Deponiegas</Name>
<Title>WFS_Deponiegas</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Deponiegas"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Freiflaechen_PV</Name>
<Title>WFS_Freiflaechen_PV</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Freiflaechen_PV"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Dachflaechen_PV</Name>
<Title>WFS_Dachflaechen_PV</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Dachflaechen_PV"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Grubengas</Name>
<Title>WFS_Grubengas</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Grubengas"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Klaeranlagen</Name>
<Title>WFS_Klaeranlagen</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Klaeranlagen"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Wasserkraft</Name>
<Title>WFS_Wasserkraft</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Wasserkraft"/>
</FeatureType>
<FeatureType>
<Name>erneuerbare_energien_wfs:WFS_Windenergie</Name>
<Title>WFS_Windenergie</Title>
<DefaultCRS>urn:ogc:def:crs:EPSG::25832</DefaultCRS>
<OutputFormats>
<Format>application/gml+xml; version=3.2</Format>
<Format>text/xml; subtype=gml/3.2.1</Format>
<Format>text/xml; subtype=gml/3.1.1</Format>
<Format>text/xml; subtype=gml/2.1.2</Format>
</OutputFormats>
<ows:WGS84BoundingBox dimensions="2">
<ows:LowerCorner>5.593338 50.057798</ows:LowerCorner>
<ows:UpperCorner>9.741582 52.799797</ows:UpperCorner>
</ows:WGS84BoundingBox>
<MetadataURL xlink:href="https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?request=GetMetadata&amp;layer=WFS_Windenergie"/>
</FeatureType>
</FeatureTypeList>
<fes:Filter_Capabilities>
<fes:Conformance>
<fes:Constraint name="ImplementsQuery">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsAdHocQuery">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsFunctions">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsResourceId">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsMinStandardFilter">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsStandardFilter">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsMinSpatialFilter">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsSpatialFilter">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsMinTemporalFilter">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsTemporalFilter">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsVersionNav">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsSorting">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsExtendedOperators">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsMinimumXPath">
<ows:NoValues/>
<ows:DefaultValue>TRUE</ows:DefaultValue>
</fes:Constraint>
<fes:Constraint name="ImplementsSchemaElementFunc">
<ows:NoValues/>
<ows:DefaultValue>FALSE</ows:DefaultValue>
</fes:Constraint>
</fes:Conformance>
<fes:Id_Capabilities>
<fes:ResourceIdentifier name="fes:ResourceId"/>
</fes:Id_Capabilities>
<fes:Scalar_Capabilities>
<fes:LogicalOperators/>
<fes:ComparisonOperators>
<fes:ComparisonOperator name="PropertyIsEqualTo"/>
<fes:ComparisonOperator name="PropertyIsNotEqualTo"/>
<fes:ComparisonOperator name="PropertyIsLessThan"/>
<fes:ComparisonOperator name="PropertyIsGreaterThan"/>
<fes:ComparisonOperator name="PropertyIsLessThanOrEqualTo"/>
<fes:ComparisonOperator name="PropertyIsGreaterThanOrEqualTo"/>
<fes:ComparisonOperator name="PropertyIsLike"/>
<fes:ComparisonOperator name="PropertyIsBetween"/>
</fes:ComparisonOperators>
</fes:Scalar_Capabilities>
<fes:Spatial_Capabilities>
<fes:GeometryOperands>
<fes:GeometryOperand name="gml:Point"/>
<fes:GeometryOperand name="gml:MultiPoint"/>
<fes:GeometryOperand name="gml:LineString"/>
<fes:GeometryOperand name="gml:MultiLineString"/>
<fes:GeometryOperand name="gml:Curve"/>
<fes:GeometryOperand name="gml:MultiCurve"/>
<fes:GeometryOperand name="gml:Polygon"/>
<fes:GeometryOperand name="gml:MultiPolygon"/>
<fes:GeometryOperand name="gml:Surface"/>
<fes:GeometryOperand name="gml:MultiSurface"/>
<fes:GeometryOperand name="gml:Box"/>
<fes:GeometryOperand name="gml:Envelope"/>
</fes:GeometryOperands>
<fes:SpatialOperators>
<fes:SpatialOperator name="Equals"/>
<fes:SpatialOperator name="Disjoint"/>
<fes:SpatialOperator name="Touches"/>
<fes:SpatialOperator name="Within"/>
<fes:SpatialOperator name="Overlaps"/>
<fes:SpatialOperator name="Crosses"/>
<fes:SpatialOperator name="Intersects"/>
<fes:SpatialOperator name="Contains"/>
<fes:SpatialOperator name="DWithin"/>
<fes:SpatialOperator name="Beyond"/>
<fes:SpatialOperator name="BBOX"/>
</fes:SpatialOperators>
</fes:Spatial_Capabilities>
<fes:Temporal_Capabilities>
<fes:TemporalOperands>
<fes:TemporalOperand name="gml:TimePeriod"/>
<fes:TemporalOperand name="gml:TimeInstant"/>
</fes:TemporalOperands>
<fes:TemporalOperators>
<fes:TemporalOperator name="During"/>
</fes:TemporalOperators>
</fes:Temporal_Capabilities>
</fes:Filter_Capabilities>
</wfs:WFS_Capabilities>

142
index.html Normal file
View File

@ -0,0 +1,142 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<!-- Optimierung für mobile Geräte: Keine Skalierung durch User, App-Feeling -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>enwelo - Vorab-Flächenprüfung</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin="" />
</head>
<body>
<div id="app">
<main class="main-content">
<div id="map"></div>
<!-- Logo, Status & Links Oben Links -->
<div class="top-left-logo glass-panel">
<div class="logo-row">
<img src="/Logos/20201202-ENWELO-Logo-4c_ohne_Claim.png" alt="enwelo Logo">
<div class="logo-divider"></div>
<span class="logo-text">Flächenprüfung</span>
</div>
<div class="info-row">
<div id="backend-status" class="status-indicator offline">
<span class="status-dot"></span>
<span class="status-text">Server-Status</span>
</div>
<div class="info-divider"></div>
<button id="open-impressum" class="text-link impressum-link">Impressum</button>
</div>
<!-- Container for Geocoder Search -->
<div id="search-container" class="search-row"></div>
<!-- Base Map Toggle -->
<div class="basemap-toggle-row">
<button id="toggle-osm" class="basemap-btn active">OSM</button>
<button id="toggle-dop" class="basemap-btn">Luftbild</button>
</div>
<!-- Analysis Button -->
<button id="check-site-btn" class="primary-btn sidebar-btn" disabled>
Analyse starten
</button>
</div>
<!-- Result Card (Bottom Sheet style) -->
<div id="results-area" class="results-hidden glass-panel theme-panel">
<!-- Content generated by JS -->
</div>
<!-- Anleitung (Initial) -->
<div id="intro-hint" class="intro-overlay">
<div class="hint-content">
<p id="marker-hint-msg">Bitte wählen Sie einen möglichen <strong>Windenergieanlagenstandort</strong> durch
Klicken auf die Karte aus.</p>
</div>
</div>
<!-- Impressum Modal -->
<div id="impressum-modal" class="modal-overlay hidden">
<div class="modal-content glass-panel">
<div class="modal-header">
<h2>Impressum</h2>
<button class="close-modal-btn">&times;</button>
</div>
<div class="modal-body">
<h3>Angaben gemäß § 5 TMG</h3>
<p>
ENWELO GmbH & Co.KG<br>
Hollich 79<br>
48565 Steinfurt
</p>
<p>
<strong>Handelsregister:</strong> HRA 7670 und HRB 12991<br>
<strong>Registergericht:</strong> Steinfurt
</p>
<h3>Vertreten durch:</h3>
<p>ENWELO Verwaltungs GmbH</p>
<p>
<strong>Diese wird vertreten durch:</strong><br>
Jan-Hendrik Wolke
</p>
<p>
<strong>Handelsregister:</strong> 12991<br>
<strong>Registergericht:</strong> Steinfurt
</p>
<h3>Kontakt</h3>
<p>
Telefon: 02551 70 90 90<br>
E-Mail: <a href="mailto:info@enwelo.de">info@enwelo.de</a>
</p>
<h3>Umsatzsteuer-ID</h3>
<p>
Umsatzsteuer-Identifikationsnummer gemäß § 27 a Umsatzsteuergesetz:<br>
DE336008081
</p>
<h3>Redaktionell Verantwortlicher</h3>
<p>Thomas Voß, Hollich 79, 48565 Steinfurt</p>
<h3>Verbraucherstreitbeilegung/Universalschlichtungsstelle</h3>
<p>Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.</p>
<h3>Haftung für Inhalte</h3>
<p>Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.</p>
<p>Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.</p>
<h3>Haftung für Links</h3>
<p>Unser Angebot enthält Links zu externen Websites Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar.</p>
<p>Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.</p>
<h3>Urheberrecht</h3>
<p>Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet.</p>
<p>Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.</p>
<p><small>Quelle: eRecht24</small></p>
</div>
</div>
</div>
</main>
</div>
<script type="module" src="./main.js"></script>
</body>
</html>

16
inspect_wind_zip.cjs Normal file
View File

@ -0,0 +1,16 @@
const fs = require('fs');
const path = require('path');
const AdmZip = require('adm-zip');
const zipPath = path.join(__dirname, 'public/daten/Windenergiebereiche-Regionalplanung-NRW_EPSG25832_Geodatabase.zip');
try {
const zip = new AdmZip(zipPath);
const zipEntries = zip.getEntries();
console.log("Entries in zip:");
zipEntries.forEach(entry => {
console.log(entry.entryName);
});
} catch (e) {
console.error("Error reading zip:", e);
}

16
inspect_zip.cjs Normal file
View File

@ -0,0 +1,16 @@
const AdmZip = require('adm-zip');
const path = require('path');
const zipPath = path.resolve('public/daten/Windenergiebereiche-Regionalplanung-NRW_EPSG25832_Geodatabase.zip');
try {
const zip = new AdmZip(zipPath);
const zipEntries = zip.getEntries();
console.log(`Contents of ${zipPath}:`);
zipEntries.forEach(entry => {
console.log(entry.entryName);
});
} catch (e) {
console.error("Error reading zip:", e.message);
}

1141
main.js Normal file

File diff suppressed because it is too large Load Diff

4973
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

29
package.json Normal file
View File

@ -0,0 +1,29 @@
{
"name": "flaechenpruefung-windenergie",
"private": true,
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "vite",
"server": "node server.cjs",
"start": "concurrently \"npm run server\" \"npm run dev\"",
"build": "vite build",
"preview": "vite preview"
},
"devDependencies": {
"concurrently": "^9.2.1",
"vite": "^5.0.0"
},
"dependencies": {
"@turf/turf": "^7.3.3",
"cors": "^2.8.6",
"express": "^5.2.1",
"leaflet": "^1.9.4",
"leaflet-control-geocoder": "^3.3.1",
"leaflet.vectorgrid": "^1.3.0",
"osmtogeojson": "^3.0.0-beta.5",
"proj4": "^2.20.2",
"shapefile": "^0.6.6",
"shpjs": "^6.2.0"
}
}

2
push_test.txt Normal file
View File

@ -0,0 +1,2 @@
Test push from Antigravity.
Time: 2026-04-27

0
roads_caps.xml Normal file
View File

513
server.cjs Normal file
View File

@ -0,0 +1,513 @@
const express = require('express');
const cors = require('cors');
// Polyfill for shpjs which expects self.DecompressionStream
global.self = global;
const proj4 = require('proj4');
const path = require('path');
const fs = require('fs');
const https = require('https');
const app = express();
const PORT = 3000;
app.use(cors());
app.use(express.static('dist'));
// Define Projections
proj4.defs("EPSG:25832", "+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs");
proj4.defs("EPSG:4326", "+proj=longlat +datum=WGS84 +no_defs");
const sourceProj = "EPSG:25832";
const destProj = "EPSG:4326";
const ALKIS_WFS_URL = 'https://www.wfs.nrw.de/geobasis/wfs_nw_alkis_vereinfacht';
const SHP_PATH = path.join(__dirname, 'public/Daten/260130_Wohngebäude.shp');
app.get('/api/buildings', async (req, res) => {
let { bbox, limit } = req.query;
// Quick test endpoint via browser simply loading /api/buildings
if (!bbox) return res.send('Worker is ready. Use ?bbox=minLon,minLat,maxLon,maxLat');
const bounds = bbox.split(',').map(Number);
if (bounds.length !== 4) return res.status(400).json({ error: 'Invalid bbox' });
console.time("Query");
// 1. Project Query BBOX to UTM32
const corners = [
[bounds[0], bounds[1]], [bounds[2], bounds[3]],
[bounds[0], bounds[3]], [bounds[2], bounds[1]]
].map(c => proj4(destProj, sourceProj, c));
const minX = Math.min(...corners.map(c => c[0]));
const maxX = Math.max(...corners.map(c => c[0]));
const minY = Math.min(...corners.map(c => c[1]));
const maxY = Math.max(...corners.map(c => c[1]));
const queryBbox = [minX - 50, minY - 50, maxX + 50, maxY + 50];
const maxFeatures = limit ? parseInt(limit) : 2000;
const results = [];
// 2. Buffered Scanning
const BUFFER_SIZE = 10 * 1024 * 1024; // 10MB chunk
// We open the file and read large chunks.
// We maintain a "buffer cursor" and a "file position".
let fd;
try {
fd = fs.openSync(SHP_PATH, 'r');
const fileSize = fs.statSync(SHP_PATH).size;
let buf = Buffer.alloc(BUFFER_SIZE);
// Initial Read: Skip 100 bytes header
let filePos = 100;
let bytesRead = fs.readSync(fd, buf, 0, BUFFER_SIZE, filePos);
let bufPos = 0; // Position within current buffer
while (filePos < fileSize && results.length < maxFeatures && bytesRead > 0) {
// Need at least 8 bytes for Record Header
if (bufPos + 8 > bytesRead) {
// Not enough bytes left in buffer for header.
// Move remaining to start, read more.
// Or simply: Refill logic.
// Simplest: If near end, just read a new chunk from filePos.
// But filePos is tricky if we processed partial buffer.
// Let's track absolute `currentRecordPos` = filePos + bufPos
}
// SIMPLER LOGIC:
// Valid data is in buf[bufPos ... bytesRead]
const remaining = bytesRead - bufPos;
if (remaining < 8) {
// Fetch next chunk
// Determine where we are in file: filePos + bufPos
filePos += bufPos;
bytesRead = fs.readSync(fd, buf, 0, BUFFER_SIZE, filePos);
bufPos = 0;
if (bytesRead < 8) break; // EOF
}
// Read Record Header (8 bytes)
// Record Num (4 bytes BE) - ignore
const recLenWords = buf.readInt32BE(bufPos + 4);
const recLenBytes = recLenWords * 2;
// Check if we have the full record content in buffer
// 8 header + recLenBytes content
const totalRecSize = 8 + recLenBytes;
if (bufPos + totalRecSize > bytesRead) {
// Record spans across buffer boundary (or is larger than buffer remaining)
// Check if it's larger than entire buffer?
if (totalRecSize > BUFFER_SIZE) {
// Huge record. Rare for buildings. Skip or alloc special.
// Just skip logic:
filePos += bufPos + totalRecSize;
// Refill
bytesRead = fs.readSync(fd, buf, 0, BUFFER_SIZE, filePos);
bufPos = 0;
continue;
}
// Move pointer to filePos += bufPos
filePos += bufPos;
// Read fresh chunk starting at this record
bytesRead = fs.readSync(fd, buf, 0, BUFFER_SIZE, filePos);
bufPos = 0;
if (bytesRead < totalRecSize) break; // Should not happen unless EOF
}
const recOffset = filePos + bufPos;
// Now buf[bufPos] is start of header.
// buf[bufPos+8] is start of content.
const contentOffset = bufPos + 8;
// Parse BBox (32 bytes) at Content+4 (Type)
// Type is at contentOffset (4 bytes LE)
const type = buf.readInt32LE(contentOffset);
// BBox: offset + 4
const bXmin = buf.readDoubleLE(contentOffset + 4);
const bYmin = buf.readDoubleLE(contentOffset + 12);
const bXmax = buf.readDoubleLE(contentOffset + 20);
const bYmax = buf.readDoubleLE(contentOffset + 28);
const disjoint = (bXmin > queryBbox[2] || bXmax < queryBbox[0] || bYmin > queryBbox[3] || bYmax < queryBbox[1]);
if (!disjoint) {
// Match! Parse Geometry.
// Only if Type 5 (Polygon)
if (type === 5) {
const numParts = buf.readInt32LE(contentOffset + 36);
const numPoints = buf.readInt32LE(contentOffset + 40);
if (numPoints > 0 && numPoints < 10000) {
const parts = [];
for (let i = 0; i < numParts; i++) {
parts.push(buf.readInt32LE(contentOffset + 44 + i * 4));
}
parts.push(numPoints);
const pointsOffset = contentOffset + 44 + numParts * 4;
const coords = [];
for (let p = 0; p < numParts; p++) {
const start = parts[p];
const end = parts[p + 1];
const ring = [];
for (let k = start; k < end; k++) {
const px = buf.readDoubleLE(pointsOffset + k * 16);
const py = buf.readDoubleLE(pointsOffset + k * 16 + 8);
const [lon, lat] = proj4(sourceProj, destProj, [px, py]);
ring.push([lon, lat]);
}
coords.push(ring);
}
results.push({
type: "Feature",
properties: { id: "SHP_" + recOffset },
geometry: { type: "Polygon", coordinates: coords }
});
}
}
}
// Advance
bufPos += totalRecSize;
}
} catch (e) {
console.error("Fehler beim Scannen des Buffers:", e);
} finally {
if (fd) fs.closeSync(fd);
}
console.timeEnd("Query");
console.log(`BBox-Abfrage fand ${results.length} Gebäude`);
res.json({ type: "FeatureCollection", features: results });
});
/**
* API: Ruft detaillierte ALKIS-Informationen für einen Punkt ab (GML-Parsing)
*/
app.get('/api/alkis-info', async (req, res) => {
const { lat, lng } = req.query;
if (!lat || !lng) return res.status(400).json({ error: 'Koordinaten fehlen' });
const lats = parseFloat(lat);
const lngs = parseFloat(lng);
const size = 0.0001;
const bbox = `${lats - size},${lngs - size},${lats + size},${lngs + size},urn:ogc:def:crs:EPSG::4326`;
const url = `${ALKIS_WFS_URL}?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=ave:Flurstueck&BBOX=${bbox}&COUNT=1`;
https.get(url, (wfsRes) => {
let data = '';
wfsRes.on('data', (chunk) => data += chunk);
wfsRes.on('end', () => {
try {
// Einfaches Regex-basiertes Parsing für GML (da kein schwerer XML-Parser installiert ist)
const getTag = (tag) => {
const match = data.match(new RegExp(`<${tag}[^>]*>(.*?)<\/${tag}>`, 's'));
return match ? match[1].trim() : null;
};
const info = {
gemarkung: getTag('gemarkung'),
gemeinde: getTag('gemeinde'),
kreis: getTag('kreis'),
regbezirk: getTag('regbezirk'),
flur: getTag('flur'),
flstnrzae: getTag('flstnrzae'),
flstnrnen: getTag('flstnrnen'),
flaeche: getTag('flaeche'),
aktualit: getTag('aktualit'),
lagebeztxt: getTag('lagebeztxt'),
flstkennz: getTag('flstkennz')
};
if (!info.flstkennz) {
return res.json({ found: false });
}
res.json({ found: true, properties: info });
} catch (err) {
res.status(500).json({ error: 'Parsing Fehler', details: err.message });
}
});
}).on('error', (e) => {
res.status(500).json({ error: 'WFS Fehler', details: e.message });
});
});
/**
* API: Ruft ALKIS-Nutzungsinformationen für einen Punkt ab
*/
app.get('/api/alkis-usage', async (req, res) => {
const { lat, lng } = req.query;
if (!lat || !lng) return res.status(400).json({ error: 'Koordinaten fehlen' });
const lats = parseFloat(lat);
const lngs = parseFloat(lng);
const size = 0.00001; // Sehr kleiner BBOX für präzise Punkt-Abfrage (~1m)
const bbox = `${lats - size},${lngs - size},${lats + size},${lngs + size},urn:ogc:def:crs:EPSG::4326`;
const url = `${ALKIS_WFS_URL}?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=ave:Nutzung&BBOX=${bbox}&COUNT=1`;
https.get(url, (wfsRes) => {
let data = '';
wfsRes.on('data', (chunk) => data += chunk);
wfsRes.on('end', () => {
try {
// Regex-Parsing für nutzart und bez
const nutzartMatch = data.match(/<nutzart[^>]*>(.*?)<\/nutzart>/s);
const bezMatch = data.match(/<bez[^>]*>(.*?)<\/bez>/s);
const nutzart = nutzartMatch ? nutzartMatch[1].trim() : null;
const bez = bezMatch ? bezMatch[1].trim() : null;
if (!nutzart && !bez) {
return res.json({ found: false });
}
res.json({ found: true, nutzart, bez });
} catch (err) {
res.status(500).json({ error: 'Parsing Fehler', details: err.message });
}
});
}).on('error', (e) => {
res.status(500).json({ error: 'WFS Fehler', details: e.message });
});
});
/**
* API: Ruft Windenergieanlagen in der Nähe ab (WFS Proxy)
*/
app.get('/api/wind-turbines', async (req, res) => {
const { lat, lng } = req.query;
if (!lat || !lng) return res.status(400).json({ error: 'Koordinaten fehlen' });
const lats = parseFloat(lat);
const lngs = parseFloat(lng);
const size = 0.05; // ~5.5km BBOX für absolute Sicherheit
const bbox = `${lats - size},${lngs - size},${lats + size},${lngs + size},urn:ogc:def:crs:EPSG::4326`;
// Wir nutzen WFS 2.0.0 da dieser stabil Daten liefert
const url = `https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=erneuerbare_energien_wfs:WFS_Windenergie&BBOX=${bbox}&COUNT=100`;
console.log(`[WindProxy] Fetching: ${url}`);
https.get(url, (wfsRes) => {
console.log(`[WindProxy] Status: ${wfsRes.statusCode}`);
let data = '';
wfsRes.on('data', (chunk) => data += chunk);
wfsRes.on('end', () => {
try {
if (data.includes('ExceptionReport')) {
console.error(`[WindProxy] WFS Exception: ${data.substring(0, 500)}`);
return res.status(500).json({ error: 'WFS Exception', details: 'Der Dienst hat einen Fehler gemeldet.' });
}
const features = [];
// Robustes Splitten (Regex handles attributes in member tag)
const blocks = data.split(/<wfs:member[^>]*>/);
for (let i = 1; i < blocks.length; i++) {
const block = blocks[i];
// Extrahiere UTM Koordinaten aus gml:pos
const posMatch = block.match(/<gml:pos[^>]*>(.*?)<\/gml:pos>/);
const ibjahrMatch = block.match(/<erneuerbare_energien_wfs:ibjahr[^>]*>(.*?)<\/erneuerbare_energien_wfs:ibjahr>/);
if (posMatch) {
const coords = posMatch[1].trim().split(/\s+/).map(Number);
const [lon, lat] = proj4(sourceProj, destProj, [coords[0], coords[1]]);
features.push({
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [lon, lat] // [Lon, Lat] in WGS84
},
properties: {
ibjahr: ibjahrMatch ? ibjahrMatch[1].trim() : "Unbekannt"
}
});
}
}
console.log(`[WindProxy] Found ${features.length} turbines for ${lat},${lng}`);
res.json({ features });
} catch (err) {
res.status(500).json({ error: 'Parsing Fehler', details: err.message });
}
});
}).on('error', (e) => {
res.status(500).json({ error: 'WFS Fehler', details: e.message });
});
});
// --- Logik für Potenzialflächen & Regionalplanung ---
const POTENTIAL_ZIP_PATH = path.join(__dirname, 'public/daten/Potenzialkarten-Windenergieanlagen-NRW_EPSG25832_Shape.zip');
const PLANNING_ZIP_PATH = path.join(__dirname, 'public/daten/Windenergiebereiche_NRW.zip');
let potentialFeatures = [];
let potentialLoaded = false;
let planningFeatures = [];
let planningLoaded = false;
let planningError = null;
let turf = null;
/**
* Prüft, ob ein Punkt innerhalb eines Polygons liegt (unter Verwendung von Turf.js)
*/
function checkPointInFeature(pt, feature) {
if (!turf) return false;
if (!feature || !feature.geometry) return false;
try {
const point = turf.point(pt); // pt muss [lng, lat] sein
if (feature.geometry.type === 'Polygon' || feature.geometry.type === 'MultiPolygon') {
return turf.booleanPointInPolygon(point, feature);
}
} catch (e) { }
return false;
}
/**
* Lädt die notwendigen Bibliotheken und Geodaten beim Serverstart
*/
(async () => {
try {
console.log("Lade Bibliotheken & Daten...");
const { default: shp } = await import('shpjs');
const turfModule = await import('@turf/turf');
turf = turfModule.default || turfModule;
// 1. Regionalplanung (Windenergiebereiche) laden
if (fs.existsSync(PLANNING_ZIP_PATH)) {
console.log(`[${new Date().toISOString()}] Lade Planungsdaten von: ${PLANNING_ZIP_PATH}`);
try {
const buffer = fs.readFileSync(PLANNING_ZIP_PATH);
const geojson = await shp(buffer);
if (Array.isArray(geojson)) {
geojson.forEach(fc => { if (fc.features) planningFeatures.push(...fc.features); });
} else {
planningFeatures = geojson.features;
}
planningLoaded = true;
console.log(`[${new Date().toISOString()}] Planungsdaten geladen: ${planningFeatures.length} Features.`);
} catch (err) {
planningError = err.message;
console.warn("Konnte Planungs-ZIP nicht laden:", err);
}
} else {
console.warn("Planungs-ZIP nicht gefunden:", PLANNING_ZIP_PATH);
planningError = "Datei nicht gefunden: " + PLANNING_ZIP_PATH;
}
// 2. Potenzialkarten laden
if (fs.existsSync(POTENTIAL_ZIP_PATH)) {
console.log(`[${new Date().toISOString()}] Lade Potenzialdaten...`);
const buffer = fs.readFileSync(POTENTIAL_ZIP_PATH);
const geojson = await shp(buffer);
if (Array.isArray(geojson)) {
geojson.forEach(fc => { if (fc.features) potentialFeatures.push(...fc.features); });
} else {
potentialFeatures = geojson.features;
}
potentialLoaded = true;
console.log(`[${new Date().toISOString()}] Potenzialdaten geladen: ${potentialFeatures.length} Features.`);
}
} catch (e) {
console.error("Fehler beim Laden der Daten / Libs:", e);
planningError = "Globaler Ladefehler: " + e.message;
}
})();
/**
* API: Prüft, ob ein Standort in einer LANUV-Potenzialfläche liegt
*/
app.get('/api/check-potential', (req, res) => {
const { lat, lng } = req.query;
if (!potentialLoaded) return res.json({ result: 'error', message: 'Daten nicht geladen' });
if (!lat || !lng) return res.json({ result: 'error', message: 'Koordinaten fehlen' });
try {
const pt = [parseFloat(lng), parseFloat(lat)];
if (isNaN(pt[0]) || isNaN(pt[1])) throw new Error("Ungültige Koordinaten");
let found = false;
let props = {};
for (const f of potentialFeatures) {
if (checkPointInFeature(pt, f)) {
found = true;
props = f.properties;
break;
}
}
res.json({
found: found,
properties: found ? props : null
});
} catch (e) {
res.status(500).json({ error: e.toString() });
}
});
/**
* API: Prüft, ob ein Standort in einem Windenergiebereich liegt
*/
app.get('/api/check-planning', (req, res) => {
const { lat, lng } = req.query;
if (!planningLoaded) return res.json({ found: false, message: 'Daten nicht geladen' });
if (!lat || !lng) return res.json({ found: false, message: 'Koordinaten fehlen' });
try {
const pt = [parseFloat(lng), parseFloat(lat)];
let found = false;
let props = {};
for (const f of planningFeatures) {
if (checkPointInFeature(pt, f)) {
found = true;
props = f.properties;
break;
}
}
res.json({ found: found, properties: found ? props : null });
} catch (e) {
res.status(500).json({ error: e.toString() });
}
});
/**
* API: Liefert alle Potenzialflächen als GeoJSON
*/
app.get('/api/potential-data', (req, res) => {
if (!potentialLoaded) return res.status(503).json({ error: 'Daten noch nicht bereit' });
res.json({ type: 'FeatureCollection', features: potentialFeatures });
});
/**
* API: Liefert alle Windenergiebereiche als GeoJSON
*/
app.get('/api/planning-data', (req, res) => {
if (!planningLoaded) {
if (planningError) {
return res.status(500).json({ error: 'Laden der Planungsdaten fehlgeschlagen: ' + planningError });
}
return res.status(503).json({ error: 'Daten werden geladen... bitte erneut versuchen.', retry: true });
}
res.json({ type: 'FeatureCollection', features: planningFeatures });
});
app.listen(PORT, () => {
console.log(`Geodaten-Server läuft auf http://localhost:${PORT} (Buffered Mode)`);
});

5
start_server.bat Normal file
View File

@ -0,0 +1,5 @@
@echo off
cd /d "%~dp0"
echo Starting Development Server...
call npm start
pause

622
style.css Normal file
View File

@ -0,0 +1,622 @@
:root {
--primary-color: #307725; /* 48 119 37 */
--primary-light: #73B076; /* 115 176 118 */
--primary-pale: #D7EAD8; /* 215 234 216 */
--accent-color: #407A95; /* 64 122 149 */
--accent-light: #97C5D4; /* 151 197 212 */
--bg-pale: #EEF5F6; /* 238 245 246 */
--text-dark: #0f172a;
--text-light: #f8fafc;
--bg-dark: #0f172a;
--glass-bg: rgba(238, 245, 246, 0.95);
--glass-border: rgba(48, 119, 37, 0.2);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
--radius-xl: 1rem;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
-webkit-tap-highlight-color: transparent;
}
body {
font-family: 'Outfit', sans-serif;
color: var(--text-dark);
background: var(--bg-dark);
height: 100vh;
width: 100vw;
overflow: hidden;
}
#app {
height: 100%;
width: 100%;
}
.main-content {
height: 100%;
width: 100%;
position: relative;
}
#map {
width: 100%;
height: 100%;
z-index: 1;
}
.top-left-logo {
position: absolute;
top: 20px;
left: 20px;
z-index: 1000;
pointer-events: auto;
display: flex;
flex-direction: column;
gap: 12px;
padding: 12px 16px;
min-width: 240px;
}
.logo-row {
display: flex;
align-items: center;
gap: 10px;
}
.logo-row img {
height: 28px;
width: auto;
}
.logo-divider {
width: 1px;
height: 18px;
background: #cbd5e1;
}
.logo-text {
font-weight: 700;
font-size: 0.85rem;
color: var(--primary-color);
letter-spacing: 0.03em;
}
.info-row {
display: flex;
align-items: center;
gap: 10px;
padding-top: 8px;
border-top: 1px solid rgba(0, 0, 0, 0.05);
}
.info-divider {
width: 1px;
height: 12px;
background: #cbd5e1;
}
.impressum-link {
color: var(--primary-color) !important;
font-weight: 500;
text-decoration: none;
background: none;
border: none;
cursor: pointer;
padding: 0;
font-size: 0.75rem;
}
.impressum-link:hover {
text-decoration: underline;
}
.search-row {
margin-top: 4px;
width: 100%;
}
.search-row .leaflet-control-geocoder {
box-shadow: none !important;
border: 1px solid var(--glass-border) !important;
background: white !important;
width: 100% !important;
border-radius: 8px !important;
margin: 0 !important;
}
.search-row .leaflet-control-geocoder-form input {
font-family: 'Outfit', sans-serif !important;
font-size: 0.85rem !important;
padding: 8px 12px !important;
width: 100% !important;
}
.search-row .leaflet-control-geocoder-icon {
display: none !important; /* Hide search icon if we want clean look, or keep if preferred */
}
.sidebar-btn {
width: 100%;
margin-top: 8px;
padding: 0.6rem 1rem !important;
font-size: 0.85rem !important;
}
.basemap-toggle-row {
display: flex;
gap: 4px;
margin-top: 8px;
background: rgba(0, 0, 0, 0.05);
padding: 3px;
border-radius: 8px;
}
.basemap-btn {
flex: 1;
border: none;
background: none;
padding: 6px;
font-size: 0.75rem;
font-weight: 600;
border-radius: 6px;
cursor: pointer;
color: #64748b;
transition: all 0.2s;
}
.basemap-btn.active {
background: white;
color: var(--primary-color);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}
.primary-btn {
pointer-events: auto;
background: linear-gradient(135deg, var(--primary-color), var(--primary-light));
color: white;
border: none;
padding: 0.8rem 1.8rem;
border-radius: 2rem;
font-weight: 600;
box-shadow: 0 4px 15px rgba(48, 119, 37, 0.3);
transition: all 0.3s ease;
cursor: pointer;
}
.primary-btn:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(48, 119, 37, 0.4);
background: linear-gradient(135deg, var(--primary-light), var(--primary-color));
}
.primary-btn:disabled {
opacity: 0.7;
background: #94a3b8;
cursor: not-allowed;
box-shadow: none;
}
#results-area {
position: absolute;
top: 80px;
left: 50%;
transform: translateX(-50%);
width: 95%;
max-width: 800px;
z-index: 1000;
max-height: 80vh;
overflow-y: auto;
}
.glass-panel {
background: var(--glass-bg);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border: 1px solid var(--glass-border);
box-shadow: var(--shadow-lg);
border-radius: var(--radius-xl);
padding: 1.5rem;
}
.result-card h2 {
font-size: 1.4rem;
color: var(--primary-dark);
}
.category-block {
background: var(--bg-pale);
border-radius: 0.75rem;
padding: 0.6rem 1rem;
margin-bottom: 0.5rem;
border-left: 4px solid var(--primary-color);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.03);
}
.category-block:nth-child(even) {
border-left-color: var(--accent-color);
background: #fdfdfe; /* Very slight variation */
}
.category-title {
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--primary-color);
margin-bottom: 0.3rem;
font-weight: 700;
display: flex;
align-items: center;
gap: 0.5rem;
}
.result-item {
font-size: 0.85rem;
line-height: 1.3;
color: var(--text-dark);
display: flex;
justify-content: space-between;
align-items: flex-start;
padding: 2px 0;
}
.result-item strong {
color: var(--text-dark);
font-weight: 600;
max-width: 60%;
}
.result-item span {
font-weight: 500;
text-align: right;
flex: 1;
padding-left: 1rem;
}
.text-emerald-500 {
color: var(--primary-color);
font-weight: 600;
}
.text-amber-500 {
color: #d97706; /* Branded Amber */
font-weight: 600;
}
.text-red-500 {
color: #dc2626; /* Branded Red */
font-weight: 700;
}
.text-slate-400 {
color: #64748b;
}
.report-note {
background: var(--primary-pale);
border-left: 4px solid var(--primary-color);
padding: 1rem;
margin: 1.5rem 0;
border-radius: 6px;
font-size: 0.9rem;
color: var(--text-dark);
line-height: 1.6;
}
.report-note-title {
display: block;
font-weight: 700;
margin-bottom: 0.25rem;
color: var(--primary-dark);
}
.close-btn {
background: #f1f5f9;
border: none;
font-size: 1.2rem;
width: 32px;
height: 32px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: background 0.2s;
}
.close-btn:hover {
background: #e2e8f0;
}
.export-pdf-btn {
background: white;
border: 1px solid #e2e8f0;
color: #64748b;
font-size: 0.8rem;
padding: 0.4rem 0.8rem;
border-radius: 6px;
cursor: pointer;
display: flex;
align-items: center;
transition: all 0.2s;
font-weight: 500;
}
.export-pdf-btn:hover {
background: #f8fafc;
color: var(--primary-color);
border-color: var(--primary-color);
}
/* PDF Export mode styles */
.pdf-export-mode .export-pdf-btn,
.pdf-export-mode .close-btn {
display: none !important;
}
.pdf-export-mode {
animation: none !important;
transform: none !important;
box-shadow: none !important;
border: none !important;
}
.results-hidden {
display: none;
}
.results-visible {
display: block;
animation: slideUp 0.4s cubic-bezier(0, 0, 0.2, 1);
}
@keyframes slideUp {
from {
transform: translate(-50%, 20px);
opacity: 0;
}
to {
transform: translate(-50%, 0);
opacity: 1;
}
}
.loader {
width: 40px;
height: 40px;
border: 4px solid #e2e8f0;
border-top: 4px solid var(--primary-color);
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 1.5rem auto;
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.dist-tooltip-premium {
background: white !important;
border: 2px solid var(--primary-color) !important;
color: var(--primary-dark) !important;
font-weight: 700 !important;
font-size: 14px !important;
border-radius: 8px;
padding: 6px 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.turbine-rotor {
transform-origin: 30px 40px;
animation: rotate-turbine 3s linear infinite;
}
@keyframes rotate-turbine {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* Scrollbar */
#results-area::-webkit-scrollbar {
width: 6px;
}
#results-area::-webkit-scrollbar-track {
background: transparent;
}
#results-area::-webkit-scrollbar-thumb {
background: #cbd5e1;
border-radius: 10px;
}
/* Intro Overlay */
.intro-overlay {
position: absolute;
top: 80px;
left: 50%;
transform: translateX(-50%);
z-index: 1100;
width: 90%;
max-width: 400px;
pointer-events: none;
}
.hint-content {
background: white;
padding: 1rem 1.5rem;
border-radius: 12px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
border-left: 5px solid var(--primary-color);
pointer-events: auto;
animation: bounceIn 0.8s ease;
}
.hint-content p {
font-size: 0.95rem;
color: var(--text-dark);
line-height: 1.4;
}
@keyframes bounceIn {
0% {
transform: scale(0.9);
opacity: 0;
}
70% {
transform: scale(1.05);
}
100% {
transform: scale(1);
opacity: 1;
}
}
/* --- Status Indicator --- */
.status-indicator {
display: flex;
align-items: center;
gap: 6px;
background: transparent;
padding: 0;
border-radius: 0;
box-shadow: none;
font-size: 0.7rem;
font-weight: 600;
transition: all 0.3s ease;
}
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: #cbd5e1;
}
.status-indicator.online .status-dot {
background: #10b981;
box-shadow: 0 0 8px rgba(16, 185, 129, 0.6);
}
.status-indicator.offline .status-dot {
background: #ef4444;
}
.status-indicator.online .status-text {
color: #059669;
}
.status-indicator.offline .status-text {
color: #dc2626;
}
/* Modal Styling */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(15, 23, 42, 0.4);
backdrop-filter: blur(4px);
z-index: 2000;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.modal-content {
max-width: 700px;
width: 100%;
max-height: 85vh;
overflow-y: auto;
position: relative;
animation: modalAppear 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
@keyframes modalAppear {
from {
opacity: 0;
transform: scale(0.9) translateY(20px);
}
to {
opacity: 1;
transform: scale(1) translateY(0);
}
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.5rem;
position: sticky;
top: 0;
background: var(--glass-bg);
padding-bottom: 10px;
border-bottom: 1px solid var(--glass-border);
}
.modal-header h2 {
color: var(--primary-color);
font-size: 1.5rem;
}
.close-modal-btn {
background: none;
border: none;
font-size: 2rem;
color: var(--text-dark);
cursor: pointer;
line-height: 1;
transition: color 0.2s;
}
.close-modal-btn:hover {
color: var(--primary-color);
}
.modal-body h3 {
font-size: 1.1rem;
color: var(--primary-color);
margin: 1.5rem 0 0.5rem 0;
}
.modal-body p {
font-size: 0.95rem;
line-height: 1.6;
margin-bottom: 1rem;
color: var(--text-dark);
}
.modal-body a {
color: var(--primary-color);
text-decoration: none;
font-weight: 500;
}
.modal-body a:hover {
text-decoration: underline;
}
.hidden {
display: none !important;
}

21
test_refined_usage.cjs Normal file
View File

@ -0,0 +1,21 @@
const https = require('https');
const lat = 51.4332;
const lng = 7.6616;
const size = 0.00001;
const bbox = `${lat - size},${lng - size},${lat + size},${lng + size},urn:ogc:def:crs:EPSG::4326`;
const url = `https://www.wfs.nrw.de/geobasis/wfs_nw_alkis_vereinfacht?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=ave:Nutzung&BBOX=${bbox}&COUNT=1`;
https.get(url, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const nutzartMatch = data.match(/<nutzart[^>]*>(.*?)<\/nutzart>/s);
const bezMatch = data.match(/<bez[^>]*>(.*?)<\/bez>/s);
console.log("Nutzart:", nutzartMatch ? nutzartMatch[1] : "not found");
console.log("Bez:", bezMatch ? bezMatch[1] : "not found");
});
}).on('error', (e) => {
console.error(e);
});

36
test_wind_e2e.cjs Normal file
View File

@ -0,0 +1,36 @@
const proj4 = require('proj4');
const https = require('https');
proj4.defs("EPSG:25832", "+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs");
const pos = { lat: 51.4332, lng: 7.6616 }; // Marker position
const size = 0.02;
const bbox = `${pos.lat - size},${pos.lng - size},${pos.lat + size},${pos.lng + size},urn:ogc:def:crs:EPSG::4326`;
const url = `https://www.wfs.nrw.de/umwelt/erneuerbare_energien_wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=erneuerbare_energien_wfs:WFS_Windenergie&BBOX=${bbox}&COUNT=10`;
https.get(url, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
const markerUtm = proj4("EPSG:4326", "EPSG:25832", [pos.lng, pos.lat]);
console.log("Marker UTM:", markerUtm);
const blocks = data.split(/<wfs:member[^>]*>/);
console.log("Found turbines:", blocks.length - 1);
blocks.slice(1).forEach((block, idx) => {
const posMatch = block.match(/<gml:pos[^>]*>(.*?)<\/gml:pos>/);
const ibjahrMatch = block.match(/<erneuerbare_energien_wfs:ibjahr[^>]*>(.*?)<\/erneuerbare_energien_wfs:ibjahr>/);
const statusMatch = block.match(/<erneuerbare_energien_wfs:status[^>]*>(.*?)<\/erneuerbare_energien_wfs:status>/);
if (posMatch) {
const coords = posMatch[1].trim().split(/\s+/).map(Number);
const d = Math.sqrt(Math.pow(coords[0] - markerUtm[0], 2) + Math.pow(coords[1] - markerUtm[1], 2));
const jahr = ibjahrMatch ? ibjahrMatch[1] : "???";
const status = statusMatch ? statusMatch[1] : "???";
console.log(`Turbine ${idx + 1}: Coords=[${coords}], Dist=${d.toFixed(1)}m, Jahr=${jahr}, Status=${status}`);
}
});
});
});

611
uesg_caps.xml Normal file
View File

@ -0,0 +1,611 @@
<?xml version="1.0" encoding="UTF-8"?>
<WMS_Capabilities version="1.3.0"
xmlns="http://www.opengis.net/wms"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:esri_wms="http://www.esri.com/wms"
xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd http://www.esri.com/wms https://www.wms.nrw.de/umwelt/wasser/uesg?version=1.3.0%26service=WMS%26request=GetSchemaExtension">
<Service>
<Name><![CDATA[WMS]]></Name>
<Title><![CDATA[Überschwemmungsgebiete NRW]]></Title>
<Abstract><![CDATA[Stand: Aktuell. Unabhängig von den Vorgaben der EG-Richtlinie über die Bewertung und das Management von Hochwasserrisiken (EG-HWRM-RL) werden in Nordrhein-Westfalen seit vielen Jahren die Überschwemmungsgebiete von hochwassergefährdeten Gewässern rechnerisch ermittelt und durch ordnungsbehördliche Verordnung festgesetzt bzw. vorläufig gesichert. Berechnungsgrundlage ist dabei bundeseinheitlich ein Hochwasserereignis, wie es statistisch einmal in 100 Jahren zu erwarten ist. Die Ausweisung von Überschwemmungsgebieten gehört zu den strategischen Vorsorgemaßnahmen im Hochwasserschutz mit unmittelbaren planungsrechtlichen Auswirkungen, wie z.B. Restriktionen bei der Ausweisung oder Erweiterung kommunaler Baugebiete. Diese Aufgabe bleibt - unabhängig von der EG-HWRM-RL - weiterhin gesetzliche Pflicht und wird durch die Bezirksregierungen wahrgenommen. Weitere Informationen finden Sie auf den Internetseiten der Bezirksregierungen.]]></Abstract>
<KeywordList><Keyword><![CDATA[]]></Keyword></KeywordList>
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="https://www.wms.nrw.de/umwelt/wasser/uesg?"/>
<ContactInformation>
<ContactPersonPrimary>
<ContactPerson><![CDATA[Bezirksregierungen von NRW]]></ContactPerson>
<ContactOrganization><![CDATA[Landesamt für Natur, Umwelt und Verbraucherschutz NRW - ELWAS-Geschäftsstelle]]></ContactOrganization>
</ContactPersonPrimary>
<ContactPosition><![CDATA[]]></ContactPosition>
<ContactAddress>
<AddressType><![CDATA[postalisch]]></AddressType>
<Address><![CDATA[Leibnizstraße 10]]></Address>
<City><![CDATA[Recklinghausen]]></City>
<StateOrProvince><![CDATA[NRW]]></StateOrProvince>
<PostCode><![CDATA[45659]]></PostCode>
<Country><![CDATA[DE]]></Country>
</ContactAddress>
<ContactVoiceTelephone><![CDATA[+49 (0)211 - 1590 2165 ]]></ContactVoiceTelephone>
<ContactFacsimileTelephone><![CDATA[+49 (0)211 - 1590 2205]]></ContactFacsimileTelephone>
<ContactElectronicMailAddress><![CDATA[elwas-gs@lanuv.nrw.de]]></ContactElectronicMailAddress>
</ContactInformation>
<Fees><![CDATA[keine]]></Fees>
<AccessConstraints><![CDATA[Open Data - Dieses Angebot vom Landesamt für Natur, Umwelt und Verbraucherschutz Nordrhein-Westfalen ist lizensiert unter der Datenlizenz Deutschland Namensnennung 2.0 (https://www.govdata.de/dl-de/by-2-0). Datensätze unter dieser Lizenz müssen bei Weiterverwendung mit dem Quellenverweis „Land NRW“ versehen werden.]]></AccessConstraints>
<MaxWidth>5000</MaxWidth>
<MaxHeight>5000</MaxHeight>
</Service>
<Capability>
<Request>
<GetCapabilities>
<Format>application/vnd.ogc.wms_xml</Format>
<Format>text/xml</Format>
<DCPType>
<HTTP><Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="https://www.wms.nrw.de/umwelt/wasser/uesg?"/></Get></HTTP>
</DCPType>
</GetCapabilities>
<GetMap>
<Format>image/bmp</Format>
<Format>image/jpeg</Format>
<Format>image/tiff</Format>
<Format>image/png</Format>
<Format>image/png8</Format>
<Format>image/png24</Format>
<Format>image/png32</Format>
<Format>image/gif</Format>
<Format>image/svg+xml</Format>
<DCPType>
<HTTP><Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="https://www.wms.nrw.de/umwelt/wasser/uesg?"/></Get></HTTP>
</DCPType>
</GetMap>
<GetFeatureInfo>
<Format>application/vnd.esri.wms_raw_xml</Format>
<Format>application/vnd.esri.wms_featureinfo_xml</Format>
<Format>application/vnd.ogc.wms_xml</Format>
<Format>application/geo+json</Format>
<Format>text/xml</Format>
<Format>text/html</Format>
<Format>text/plain</Format>
<DCPType>
<HTTP><Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="https://www.wms.nrw.de/umwelt/wasser/uesg?"/></Get></HTTP>
</DCPType>
</GetFeatureInfo>
<esri_wms:GetStyles>
<Format>application/vnd.ogc.sld+xml</Format>
<DCPType>
<HTTP><Get><OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="https://www.wms.nrw.de/umwelt/wasser/uesg?"/></Get></HTTP>
</DCPType>
</esri_wms:GetStyles>
</Request>
<Exception>
<Format>application/vnd.ogc.se_xml</Format>
<Format>application/vnd.ogc.se_inimage</Format>
<Format>application/vnd.ogc.se_blank</Format>
<Format>text/xml</Format>
<Format>XML</Format>
</Exception>
<Layer>
<Title><![CDATA[Überschwemmungsgebiete NRW]]></Title>
<CRS>CRS:84</CRS>
<CRS>EPSG:4326</CRS>
<CRS>EPSG:25832</CRS>
<CRS>EPSG:3034</CRS>
<CRS>EPSG:3035</CRS>
<CRS>EPSG:3043</CRS>
<CRS>EPSG:3044</CRS>
<CRS>EPSG:3045</CRS>
<CRS>EPSG:3857</CRS>
<!-- alias 3857 -->
<CRS>EPSG:102100</CRS>
<CRS>EPSG:4258</CRS>
<CRS>EPSG:4647</CRS>
<!-- alias 4647 -->
<CRS>EPSG:102362</CRS>
<CRS>EPSG:5649</CRS>
<CRS>EPSG:5650</CRS>
<CRS>EPSG:5651</CRS>
<CRS>EPSG:5652</CRS>
<CRS>EPSG:5653</CRS>
<CRS>EPSG:25831</CRS>
<CRS>EPSG:25833</CRS>
<CRS>EPSG:28992</CRS>
<CRS>EPSG:31466</CRS>
<!-- alias 31466 -->
<CRS>EPSG:31462</CRS>
<CRS>EPSG:31467</CRS>
<!-- alias 31467 -->
<CRS>EPSG:31463</CRS>
<EX_GeographicBoundingBox><westBoundLongitude>5.766008</westBoundLongitude><eastBoundLongitude>9.468066</eastBoundLongitude><southBoundLatitude>50.342833</southBoundLatitude><northBoundLatitude>52.519758</northBoundLatitude></EX_GeographicBoundingBox>
<BoundingBox CRS="CRS:84" minx="5.766008" miny="50.342833" maxx="9.468066" maxy="52.519758"/>
<BoundingBox CRS="EPSG:4326" minx="50.342833" miny="5.766008" maxx="52.519758" maxy="9.468066"/>
<BoundingBox CRS="EPSG:25832" minx="280374.968000" miny="5581306.307300" maxx="531760.056900" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:3034" minx="2626418.448171" miny="3719216.543717" maxx="2859070.918053" maxy="3965118.138104"/>
<BoundingBox CRS="EPSG:3035" minx="3030252.493646" miny="4030235.136442" maxx="3271281.371938" maxy="4284891.291766"/>
<BoundingBox CRS="EPSG:3043" minx="5580808.041666" miny="687850.523885" maxx="5838430.834726" maxy="958155.698507"/>
<BoundingBox CRS="EPSG:3044" minx="5581306.307300" miny="280374.968000" maxx="5818849.746600" maxy="531760.056900"/>
<BoundingBox CRS="EPSG:3045" minx="5595966.573682" miny="-146071.074841" maxx="5854120.742134" maxy="124787.416673"/>
<BoundingBox CRS="EPSG:3857" minx="641869.116978" miny="6505861.593340" maxx="1053980.236458" maxy="6894655.542144"/>
<BoundingBox CRS="EPSG:102100" minx="641869.116978" miny="6505861.593340" maxx="1053980.236458" maxy="6894655.542144"/>
<BoundingBox CRS="EPSG:4258" minx="50.342833" miny="5.766008" maxx="52.519758" maxy="9.468066"/>
<BoundingBox CRS="EPSG:4647" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:102362" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:5649" minx="31687850.523885" miny="5580808.041666" maxx="31958155.698507" maxy="5838430.834726"/>
<BoundingBox CRS="EPSG:5650" minx="32853928.925159" miny="5595966.573682" maxx="33124787.416673" maxy="5854120.742134"/>
<BoundingBox CRS="EPSG:5651" minx="31687850.523885" miny="5580808.041666" maxx="31958155.698507" maxy="5838430.834726"/>
<BoundingBox CRS="EPSG:5652" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:5653" minx="32853928.925159" miny="5595966.573682" maxx="33124787.416673" maxy="5854120.742134"/>
<BoundingBox CRS="EPSG:25831" minx="687850.523885" miny="5580808.041666" maxx="958155.698507" maxy="5838430.834726"/>
<BoundingBox CRS="EPSG:25833" minx="-146071.074841" miny="5595966.573682" maxx="124787.416673" maxy="5854120.742134"/>
<BoundingBox CRS="EPSG:28992" minx="180704.021066" miny="261420.508086" maxx="443608.161222" maxy="511154.275308"/>
<BoundingBox CRS="EPSG:31466" minx="5578412.972602" miny="2484102.714759" maxx="5826131.056108" maxy="2745089.297693"/>
<BoundingBox CRS="EPSG:31462" minx="5578412.972602" miny="2484102.714759" maxx="5826131.056108" maxy="2745089.297693"/>
<BoundingBox CRS="EPSG:31467" minx="5582967.334653" miny="3280313.877032" maxx="5820578.707326" maxy="3531768.891117"/>
<BoundingBox CRS="EPSG:31463" minx="5582967.334653" miny="3280313.877032" maxx="5820578.707326" maxy="3531768.891117"/>
<Layer queryable="1">
<Title><![CDATA[Sonstige Überschwemmungsgebiete]]></Title>
<Abstract><![CDATA[]]></Abstract>
<CRS>CRS:84</CRS>
<CRS>EPSG:4326</CRS>
<CRS>EPSG:25832</CRS>
<CRS>EPSG:3034</CRS>
<CRS>EPSG:3035</CRS>
<CRS>EPSG:3043</CRS>
<CRS>EPSG:3044</CRS>
<CRS>EPSG:3045</CRS>
<CRS>EPSG:3857</CRS>
<!-- alias 3857 -->
<CRS>EPSG:102100</CRS>
<CRS>EPSG:4258</CRS>
<CRS>EPSG:4647</CRS>
<!-- alias 4647 -->
<CRS>EPSG:102362</CRS>
<CRS>EPSG:5649</CRS>
<CRS>EPSG:5650</CRS>
<CRS>EPSG:5651</CRS>
<CRS>EPSG:5652</CRS>
<CRS>EPSG:5653</CRS>
<CRS>EPSG:25831</CRS>
<CRS>EPSG:25833</CRS>
<CRS>EPSG:28992</CRS>
<CRS>EPSG:31466</CRS>
<!-- alias 31466 -->
<CRS>EPSG:31462</CRS>
<CRS>EPSG:31467</CRS>
<!-- alias 31467 -->
<CRS>EPSG:31463</CRS>
<EX_GeographicBoundingBox><westBoundLongitude>5.766008</westBoundLongitude><eastBoundLongitude>9.468066</eastBoundLongitude><southBoundLatitude>50.342833</southBoundLatitude><northBoundLatitude>52.519758</northBoundLatitude></EX_GeographicBoundingBox>
<BoundingBox CRS="CRS:84" minx="5.766008" miny="50.342833" maxx="9.468066" maxy="52.519758"/>
<BoundingBox CRS="EPSG:4326" minx="50.342833" miny="5.766008" maxx="52.519758" maxy="9.468066"/>
<BoundingBox CRS="EPSG:25832" minx="280374.968000" miny="5581306.307300" maxx="531760.056900" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:3034" minx="2626418.448171" miny="3719216.543717" maxx="2859070.918053" maxy="3965118.138104"/>
<BoundingBox CRS="EPSG:3035" minx="3030252.493646" miny="4030235.136442" maxx="3271281.371938" maxy="4284891.291766"/>
<BoundingBox CRS="EPSG:3043" minx="5580808.041666" miny="687850.523885" maxx="5838430.834726" maxy="958155.698507"/>
<BoundingBox CRS="EPSG:3044" minx="5581306.307300" miny="280374.968000" maxx="5818849.746600" maxy="531760.056900"/>
<BoundingBox CRS="EPSG:3045" minx="5595966.573682" miny="-146071.074841" maxx="5854120.742134" maxy="124787.416673"/>
<BoundingBox CRS="EPSG:3857" minx="641869.116978" miny="6505861.593340" maxx="1053980.236458" maxy="6894655.542144"/>
<BoundingBox CRS="EPSG:102100" minx="641869.116978" miny="6505861.593340" maxx="1053980.236458" maxy="6894655.542144"/>
<BoundingBox CRS="EPSG:4258" minx="50.342833" miny="5.766008" maxx="52.519758" maxy="9.468066"/>
<BoundingBox CRS="EPSG:4647" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:102362" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:5649" minx="31687850.523885" miny="5580808.041666" maxx="31958155.698507" maxy="5838430.834726"/>
<BoundingBox CRS="EPSG:5650" minx="32853928.925159" miny="5595966.573682" maxx="33124787.416673" maxy="5854120.742134"/>
<BoundingBox CRS="EPSG:5651" minx="31687850.523885" miny="5580808.041666" maxx="31958155.698507" maxy="5838430.834726"/>
<BoundingBox CRS="EPSG:5652" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:5653" minx="32853928.925159" miny="5595966.573682" maxx="33124787.416673" maxy="5854120.742134"/>
<BoundingBox CRS="EPSG:25831" minx="687850.523885" miny="5580808.041666" maxx="958155.698507" maxy="5838430.834726"/>
<BoundingBox CRS="EPSG:25833" minx="-146071.074841" miny="5595966.573682" maxx="124787.416673" maxy="5854120.742134"/>
<BoundingBox CRS="EPSG:28992" minx="180704.021066" miny="261420.508086" maxx="443608.161222" maxy="511154.275308"/>
<BoundingBox CRS="EPSG:31466" minx="5578412.972602" miny="2484102.714759" maxx="5826131.056108" maxy="2745089.297693"/>
<BoundingBox CRS="EPSG:31462" minx="5578412.972602" miny="2484102.714759" maxx="5826131.056108" maxy="2745089.297693"/>
<BoundingBox CRS="EPSG:31467" minx="5582967.334653" miny="3280313.877032" maxx="5820578.707326" maxy="3531768.891117"/>
<BoundingBox CRS="EPSG:31463" minx="5582967.334653" miny="3280313.877032" maxx="5820578.707326" maxy="3531768.891117"/>
<Layer queryable="1">
<Name>1</Name>
<Title><![CDATA[Rückgewinnbare Rückhalteflächen]]></Title>
<Abstract><![CDATA[]]></Abstract>
<CRS>CRS:84</CRS>
<CRS>EPSG:4326</CRS>
<CRS>EPSG:25832</CRS>
<CRS>EPSG:3034</CRS>
<CRS>EPSG:3035</CRS>
<CRS>EPSG:3043</CRS>
<CRS>EPSG:3044</CRS>
<CRS>EPSG:3045</CRS>
<CRS>EPSG:3857</CRS>
<!-- alias 3857 -->
<CRS>EPSG:102100</CRS>
<CRS>EPSG:4258</CRS>
<CRS>EPSG:4647</CRS>
<!-- alias 4647 -->
<CRS>EPSG:102362</CRS>
<CRS>EPSG:5649</CRS>
<CRS>EPSG:5650</CRS>
<CRS>EPSG:5651</CRS>
<CRS>EPSG:5652</CRS>
<CRS>EPSG:5653</CRS>
<CRS>EPSG:25831</CRS>
<CRS>EPSG:25833</CRS>
<CRS>EPSG:28992</CRS>
<CRS>EPSG:31466</CRS>
<!-- alias 31466 -->
<CRS>EPSG:31462</CRS>
<CRS>EPSG:31467</CRS>
<!-- alias 31467 -->
<CRS>EPSG:31463</CRS>
<EX_GeographicBoundingBox><westBoundLongitude>5.767005</westBoundLongitude><eastBoundLongitude>9.467921</eastBoundLongitude><southBoundLatitude>50.342833</southBoundLatitude><northBoundLatitude>52.506148</northBoundLatitude></EX_GeographicBoundingBox>
<BoundingBox CRS="CRS:84" minx="5.767005" miny="50.342833" maxx="9.467921" maxy="52.506148"/>
<BoundingBox CRS="EPSG:4326" minx="50.342833" miny="5.767005" maxx="52.506148" maxy="9.467921"/>
<BoundingBox CRS="EPSG:25832" minx="280374.968000" miny="5581306.307300" maxx="531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:3034" minx="2626418.448171" miny="3719216.543717" maxx="2857608.834051" maxy="3965098.122561"/>
<BoundingBox CRS="EPSG:3035" minx="3030252.493646" miny="4030235.136442" maxx="3269767.520179" maxy="4284870.346137"/>
<BoundingBox CRS="EPSG:3043" minx="5580808.041666" miny="687976.127217" maxx="5836918.599953" maxy="958155.698507"/>
<BoundingBox CRS="EPSG:3044" minx="5581306.307300" miny="280374.968000" maxx="5817335.818600" maxy="531760.056900"/>
<BoundingBox CRS="EPSG:3045" minx="5595966.573682" miny="-146071.074841" maxx="5852605.701367" maxy="124661.414182"/>
<BoundingBox CRS="EPSG:3857" minx="641980.088463" miny="6505861.593340" maxx="1053964.141781" maxy="6892165.966479"/>
<BoundingBox CRS="EPSG:102100" minx="641980.088463" miny="6505861.593340" maxx="1053964.141781" maxy="6892165.966479"/>
<BoundingBox CRS="EPSG:4258" minx="50.342833" miny="5.767005" maxx="52.506148" maxy="9.467921"/>
<BoundingBox CRS="EPSG:4647" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:102362" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:5649" minx="31687976.127217" miny="5580808.041666" maxx="31958155.698507" maxy="5836918.599953"/>
<BoundingBox CRS="EPSG:5650" minx="32853928.925159" miny="5595966.573682" maxx="33124661.414182" maxy="5852605.701367"/>
<BoundingBox CRS="EPSG:5651" minx="31687976.127217" miny="5580808.041666" maxx="31958155.698507" maxy="5836918.599953"/>
<BoundingBox CRS="EPSG:5652" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:5653" minx="32853928.925159" miny="5595966.573682" maxx="33124661.414182" maxy="5852605.701367"/>
<BoundingBox CRS="EPSG:25831" minx="687976.127217" miny="5580808.041666" maxx="958155.698507" maxy="5836918.599953"/>
<BoundingBox CRS="EPSG:25833" minx="-146071.074841" miny="5595966.573682" maxx="124661.414182" maxy="5852605.701367"/>
<BoundingBox CRS="EPSG:28992" minx="180779.663459" miny="261420.508086" maxx="443608.161222" maxy="509641.226162"/>
<BoundingBox CRS="EPSG:31466" minx="5578412.972602" miny="2484165.566016" maxx="5824616.994221" maxy="2745089.297693"/>
<BoundingBox CRS="EPSG:31462" minx="5578412.972602" miny="2484165.566016" maxx="5824616.994221" maxy="2745089.297693"/>
<BoundingBox CRS="EPSG:31467" minx="5582967.334653" miny="3280313.877032" maxx="5819064.347428" maxy="3531768.891117"/>
<BoundingBox CRS="EPSG:31463" minx="5582967.334653" miny="3280313.877032" maxx="5819064.347428" maxy="3531768.891117"/>
<Style>
<Name>default</Name>
<Title><![CDATA[Rückgewinnbare Rückhalteflächen]]></Title>
<LegendURL width="18" height="18">
<Format>image/png</Format>
<OnlineResource xlink:href="https://www.wms.nrw.de/umwelt/wasser/uesg?request=GetLegendGraphic%26version=1.3.0%26format=image/png%26layer=1" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" />
</LegendURL>
</Style>
</Layer>
<Layer queryable="1">
<Name>2</Name>
<Title><![CDATA[Überflutetes Gebiet]]></Title>
<Abstract><![CDATA[]]></Abstract>
<CRS>CRS:84</CRS>
<CRS>EPSG:4326</CRS>
<CRS>EPSG:25832</CRS>
<CRS>EPSG:3034</CRS>
<CRS>EPSG:3035</CRS>
<CRS>EPSG:3043</CRS>
<CRS>EPSG:3044</CRS>
<CRS>EPSG:3045</CRS>
<CRS>EPSG:3857</CRS>
<!-- alias 3857 -->
<CRS>EPSG:102100</CRS>
<CRS>EPSG:4258</CRS>
<CRS>EPSG:4647</CRS>
<!-- alias 4647 -->
<CRS>EPSG:102362</CRS>
<CRS>EPSG:5649</CRS>
<CRS>EPSG:5650</CRS>
<CRS>EPSG:5651</CRS>
<CRS>EPSG:5652</CRS>
<CRS>EPSG:5653</CRS>
<CRS>EPSG:25831</CRS>
<CRS>EPSG:25833</CRS>
<CRS>EPSG:28992</CRS>
<CRS>EPSG:31466</CRS>
<!-- alias 31466 -->
<CRS>EPSG:31462</CRS>
<CRS>EPSG:31467</CRS>
<!-- alias 31467 -->
<CRS>EPSG:31463</CRS>
<EX_GeographicBoundingBox><westBoundLongitude>5.767005</westBoundLongitude><eastBoundLongitude>9.467921</eastBoundLongitude><southBoundLatitude>50.342833</southBoundLatitude><northBoundLatitude>52.506148</northBoundLatitude></EX_GeographicBoundingBox>
<BoundingBox CRS="CRS:84" minx="5.767005" miny="50.342833" maxx="9.467921" maxy="52.506148"/>
<BoundingBox CRS="EPSG:4326" minx="50.342833" miny="5.767005" maxx="52.506148" maxy="9.467921"/>
<BoundingBox CRS="EPSG:25832" minx="280374.968000" miny="5581306.307300" maxx="531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:3034" minx="2626418.448171" miny="3719216.543717" maxx="2857608.834051" maxy="3965098.122561"/>
<BoundingBox CRS="EPSG:3035" minx="3030252.493646" miny="4030235.136442" maxx="3269767.520179" maxy="4284870.346137"/>
<BoundingBox CRS="EPSG:3043" minx="5580808.041666" miny="687976.127217" maxx="5836918.599953" maxy="958155.698507"/>
<BoundingBox CRS="EPSG:3044" minx="5581306.307300" miny="280374.968000" maxx="5817335.818600" maxy="531760.056900"/>
<BoundingBox CRS="EPSG:3045" minx="5595966.573682" miny="-146071.074841" maxx="5852605.701367" maxy="124661.414182"/>
<BoundingBox CRS="EPSG:3857" minx="641980.088463" miny="6505861.593340" maxx="1053964.141781" maxy="6892165.966479"/>
<BoundingBox CRS="EPSG:102100" minx="641980.088463" miny="6505861.593340" maxx="1053964.141781" maxy="6892165.966479"/>
<BoundingBox CRS="EPSG:4258" minx="50.342833" miny="5.767005" maxx="52.506148" maxy="9.467921"/>
<BoundingBox CRS="EPSG:4647" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:102362" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:5649" minx="31687976.127217" miny="5580808.041666" maxx="31958155.698507" maxy="5836918.599953"/>
<BoundingBox CRS="EPSG:5650" minx="32853928.925159" miny="5595966.573682" maxx="33124661.414182" maxy="5852605.701367"/>
<BoundingBox CRS="EPSG:5651" minx="31687976.127217" miny="5580808.041666" maxx="31958155.698507" maxy="5836918.599953"/>
<BoundingBox CRS="EPSG:5652" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:5653" minx="32853928.925159" miny="5595966.573682" maxx="33124661.414182" maxy="5852605.701367"/>
<BoundingBox CRS="EPSG:25831" minx="687976.127217" miny="5580808.041666" maxx="958155.698507" maxy="5836918.599953"/>
<BoundingBox CRS="EPSG:25833" minx="-146071.074841" miny="5595966.573682" maxx="124661.414182" maxy="5852605.701367"/>
<BoundingBox CRS="EPSG:28992" minx="180779.663459" miny="261420.508086" maxx="443608.161222" maxy="509641.226162"/>
<BoundingBox CRS="EPSG:31466" minx="5578412.972602" miny="2484165.566016" maxx="5824616.994221" maxy="2745089.297693"/>
<BoundingBox CRS="EPSG:31462" minx="5578412.972602" miny="2484165.566016" maxx="5824616.994221" maxy="2745089.297693"/>
<BoundingBox CRS="EPSG:31467" minx="5582967.334653" miny="3280313.877032" maxx="5819064.347428" maxy="3531768.891117"/>
<BoundingBox CRS="EPSG:31463" minx="5582967.334653" miny="3280313.877032" maxx="5819064.347428" maxy="3531768.891117"/>
<Style>
<Name>default</Name>
<Title><![CDATA[Überflutetes Gebiet]]></Title>
<LegendURL width="18" height="18">
<Format>image/png</Format>
<OnlineResource xlink:href="https://www.wms.nrw.de/umwelt/wasser/uesg?request=GetLegendGraphic%26version=1.3.0%26format=image/png%26layer=2" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" />
</LegendURL>
</Style>
</Layer>
<Layer queryable="1">
<Name>3</Name>
<Title><![CDATA[Ermittelte Überschwemmungsgebiete]]></Title>
<Abstract><![CDATA[]]></Abstract>
<CRS>CRS:84</CRS>
<CRS>EPSG:4326</CRS>
<CRS>EPSG:25832</CRS>
<CRS>EPSG:3034</CRS>
<CRS>EPSG:3035</CRS>
<CRS>EPSG:3043</CRS>
<CRS>EPSG:3044</CRS>
<CRS>EPSG:3045</CRS>
<CRS>EPSG:3857</CRS>
<!-- alias 3857 -->
<CRS>EPSG:102100</CRS>
<CRS>EPSG:4258</CRS>
<CRS>EPSG:4647</CRS>
<!-- alias 4647 -->
<CRS>EPSG:102362</CRS>
<CRS>EPSG:5649</CRS>
<CRS>EPSG:5650</CRS>
<CRS>EPSG:5651</CRS>
<CRS>EPSG:5652</CRS>
<CRS>EPSG:5653</CRS>
<CRS>EPSG:25831</CRS>
<CRS>EPSG:25833</CRS>
<CRS>EPSG:28992</CRS>
<CRS>EPSG:31466</CRS>
<!-- alias 31466 -->
<CRS>EPSG:31462</CRS>
<CRS>EPSG:31467</CRS>
<!-- alias 31467 -->
<CRS>EPSG:31463</CRS>
<EX_GeographicBoundingBox><westBoundLongitude>6.010924</westBoundLongitude><eastBoundLongitude>7.948934</eastBoundLongitude><southBoundLatitude>50.817050</southBoundLatitude><northBoundLatitude>51.970984</northBoundLatitude></EX_GeographicBoundingBox>
<BoundingBox CRS="CRS:84" minx="6.010924" miny="50.817050" maxx="7.948934" maxy="51.970984"/>
<BoundingBox CRS="EPSG:4326" minx="50.817050" miny="6.010924" maxx="51.970984" maxy="7.948934"/>
<BoundingBox CRS="EPSG:25832" minx="294537.049800" miny="5633536.000000" maxx="426008.504600" maxy="5758358.821600"/>
<BoundingBox CRS="EPSG:3034" minx="2678250.421596" miny="3733577.849043" maxx="2800482.491351" maxy="3862153.777909"/>
<BoundingBox CRS="EPSG:3035" minx="3083945.109983" miny="4045107.030105" maxx="3210599.967973" maxy="4178277.836017"/>
<BoundingBox CRS="EPSG:3043" minx="5634011.546946" miny="706964.434276" maxx="5769263.820826" maxy="848304.376712"/>
<BoundingBox CRS="EPSG:3044" minx="5633536.000000" miny="294537.049800" maxx="5758358.821600" maxy="426008.504600"/>
<BoundingBox CRS="EPSG:3045" minx="5656737.177529" miny="-127633.465949" maxx="5792404.841063" maxy="14137.570257"/>
<BoundingBox CRS="EPSG:3857" minx="669133.021159" miny="6588995.576788" maxx="884871.308527" maxy="6794880.649963"/>
<BoundingBox CRS="EPSG:102100" minx="669133.021159" miny="6588995.576788" maxx="884871.308527" maxy="6794880.649963"/>
<BoundingBox CRS="EPSG:4258" minx="50.817050" miny="6.010924" maxx="51.970984" maxy="7.948934"/>
<BoundingBox CRS="EPSG:4647" minx="32294537.049800" miny="5633536.000000" maxx="32426008.504600" maxy="5758358.821600"/>
<BoundingBox CRS="EPSG:102362" minx="32294537.049800" miny="5633536.000000" maxx="32426008.504600" maxy="5758358.821600"/>
<BoundingBox CRS="EPSG:5649" minx="31706964.434276" miny="5634011.546946" maxx="31848304.376712" maxy="5769263.820826"/>
<BoundingBox CRS="EPSG:5650" minx="32872366.534051" miny="5656737.177529" maxx="33014137.570257" maxy="5792404.841063"/>
<BoundingBox CRS="EPSG:5651" minx="31706964.434276" miny="5634011.546946" maxx="31848304.376712" maxy="5769263.820826"/>
<BoundingBox CRS="EPSG:5652" minx="32294537.049800" miny="5633536.000000" maxx="32426008.504600" maxy="5758358.821600"/>
<BoundingBox CRS="EPSG:5653" minx="32872366.534051" miny="5656737.177529" maxx="33014137.570257" maxy="5792404.841063"/>
<BoundingBox CRS="EPSG:25831" minx="706964.434276" miny="5634011.546946" maxx="848304.376712" maxy="5769263.820826"/>
<BoundingBox CRS="EPSG:25833" minx="-127633.465949" miny="5656737.177529" maxx="14137.570257" maxy="5792404.841063"/>
<BoundingBox CRS="EPSG:28992" minx="197855.755926" miny="314270.561853" maxx="335340.417493" maxy="445439.452721"/>
<BoundingBox CRS="EPSG:31466" minx="5631158.631497" miny="2500751.197351" maxx="5761269.162862" maxy="2637232.773075"/>
<BoundingBox CRS="EPSG:31462" minx="5631158.631497" miny="2500751.197351" maxx="5761269.162862" maxy="2637232.773075"/>
<BoundingBox CRS="EPSG:31467" minx="5635211.983296" miny="3294479.914942" maxx="5760070.513610" maxy="3425987.933036"/>
<BoundingBox CRS="EPSG:31463" minx="5635211.983296" miny="3294479.914942" maxx="5760070.513610" maxy="3425987.933036"/>
<Style>
<Name>default</Name>
<Title><![CDATA[Ermittelte Überschwemmungsgebiete]]></Title>
<LegendURL width="18" height="18">
<Format>image/png</Format>
<OnlineResource xlink:href="https://www.wms.nrw.de/umwelt/wasser/uesg?request=GetLegendGraphic%26version=1.3.0%26format=image/png%26layer=3" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" />
</LegendURL>
</Style>
</Layer>
<Layer queryable="1">
<Name>4</Name>
<Title><![CDATA[Überschwemmungsgebiet preuss. Aufnahme]]></Title>
<Abstract><![CDATA[]]></Abstract>
<CRS>CRS:84</CRS>
<CRS>EPSG:4326</CRS>
<CRS>EPSG:25832</CRS>
<CRS>EPSG:3034</CRS>
<CRS>EPSG:3035</CRS>
<CRS>EPSG:3043</CRS>
<CRS>EPSG:3044</CRS>
<CRS>EPSG:3045</CRS>
<CRS>EPSG:3857</CRS>
<!-- alias 3857 -->
<CRS>EPSG:102100</CRS>
<CRS>EPSG:4258</CRS>
<CRS>EPSG:4647</CRS>
<!-- alias 4647 -->
<CRS>EPSG:102362</CRS>
<CRS>EPSG:5649</CRS>
<CRS>EPSG:5650</CRS>
<CRS>EPSG:5651</CRS>
<CRS>EPSG:5652</CRS>
<CRS>EPSG:5653</CRS>
<CRS>EPSG:25831</CRS>
<CRS>EPSG:25833</CRS>
<CRS>EPSG:28992</CRS>
<CRS>EPSG:31466</CRS>
<!-- alias 31466 -->
<CRS>EPSG:31462</CRS>
<CRS>EPSG:31467</CRS>
<!-- alias 31467 -->
<CRS>EPSG:31463</CRS>
<EX_GeographicBoundingBox><westBoundLongitude>6.243344</westBoundLongitude><eastBoundLongitude>9.420324</eastBoundLongitude><southBoundLatitude>50.681060</southBoundLatitude><northBoundLatitude>52.519758</northBoundLatitude></EX_GeographicBoundingBox>
<BoundingBox CRS="CRS:84" minx="6.243344" miny="50.681060" maxx="9.420324" maxy="52.519758"/>
<BoundingBox CRS="EPSG:4326" minx="50.681060" miny="6.243344" maxx="52.519758" maxy="9.420324"/>
<BoundingBox CRS="EPSG:25832" minx="312835.841500" miny="5617707.345000" maxx="528520.524700" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:3034" minx="2661621.349239" miny="3751037.298693" maxx="2858676.192334" maxy="3961987.691298"/>
<BoundingBox CRS="EPSG:3035" minx="3066706.583632" miny="4063182.470041" maxx="3270845.765182" maxy="4281650.758123"/>
<BoundingBox CRS="EPSG:3043" minx="5619715.508548" miny="720199.514867" maxx="5838160.854563" maxy="951965.654395"/>
<BoundingBox CRS="EPSG:3044" minx="5617707.345000" miny="312835.841500" maxx="5818849.746600" maxy="528520.524700"/>
<BoundingBox CRS="EPSG:3045" minx="5632579.967551" miny="-110611.464581" maxx="5851404.737937" maxy="121553.493363"/>
<BoundingBox CRS="EPSG:3857" minx="695005.824493" miny="6565069.709879" maxx="1048665.698691" maxy="6894655.541776"/>
<BoundingBox CRS="EPSG:102100" minx="695005.824493" miny="6565069.709879" maxx="1048665.698691" maxy="6894655.541776"/>
<BoundingBox CRS="EPSG:4258" minx="50.681060" miny="6.243344" maxx="52.519758" maxy="9.420324"/>
<BoundingBox CRS="EPSG:4647" minx="32312835.841500" miny="5617707.345000" maxx="32528520.524700" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:102362" minx="32312835.841500" miny="5617707.345000" maxx="32528520.524700" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:5649" minx="31720199.514867" miny="5619715.508548" maxx="31951965.654395" maxy="5838160.854563"/>
<BoundingBox CRS="EPSG:5650" minx="32889388.535419" miny="5632579.967551" maxx="33121553.493363" maxy="5851404.737937"/>
<BoundingBox CRS="EPSG:5651" minx="31720199.514867" miny="5619715.508548" maxx="31951965.654395" maxy="5838160.854563"/>
<BoundingBox CRS="EPSG:5652" minx="32312835.841500" miny="5617707.345000" maxx="32528520.524700" maxy="5818849.746600"/>
<BoundingBox CRS="EPSG:5653" minx="32889388.535419" miny="5632579.967551" maxx="33121553.493363" maxy="5851404.737937"/>
<BoundingBox CRS="EPSG:25831" minx="720199.514867" miny="5619715.508548" maxx="951965.654395" maxy="5838160.854563"/>
<BoundingBox CRS="EPSG:25833" minx="-110611.464581" miny="5632579.967551" maxx="121553.493363" maxy="5851404.737937"/>
<BoundingBox CRS="EPSG:28992" minx="213114.472811" miny="299357.810097" maxx="438573.671653" maxy="510992.571211"/>
<BoundingBox CRS="EPSG:31466" minx="5616087.740091" miny="2516528.116664" maxx="5825996.295665" maxy="2740375.657973"/>
<BoundingBox CRS="EPSG:31462" minx="5616087.740091" miny="2516528.116664" maxx="5825996.295665" maxy="2740375.657973"/>
<BoundingBox CRS="EPSG:31467" minx="5619378.804109" miny="3312783.790711" maxx="5820578.707572" maxy="3528528.456212"/>
<BoundingBox CRS="EPSG:31463" minx="5619378.804109" miny="3312783.790711" maxx="5820578.707572" maxy="3528528.456212"/>
<Style>
<Name>default</Name>
<Title><![CDATA[Überschwemmungsgebiet preuss. Aufnahme]]></Title>
<LegendURL width="18" height="18">
<Format>image/png</Format>
<OnlineResource xlink:href="https://www.wms.nrw.de/umwelt/wasser/uesg?request=GetLegendGraphic%26version=1.3.0%26format=image/png%26layer=4" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" />
</LegendURL>
</Style>
</Layer>
</Layer>
<Layer queryable="1">
<Name>5</Name>
<Title><![CDATA[vorläufig gesicherte Überschwemmungsgebiete]]></Title>
<Abstract><![CDATA[]]></Abstract>
<CRS>CRS:84</CRS>
<CRS>EPSG:4326</CRS>
<CRS>EPSG:25832</CRS>
<CRS>EPSG:3034</CRS>
<CRS>EPSG:3035</CRS>
<CRS>EPSG:3043</CRS>
<CRS>EPSG:3044</CRS>
<CRS>EPSG:3045</CRS>
<CRS>EPSG:3857</CRS>
<!-- alias 3857 -->
<CRS>EPSG:102100</CRS>
<CRS>EPSG:4258</CRS>
<CRS>EPSG:4647</CRS>
<!-- alias 4647 -->
<CRS>EPSG:102362</CRS>
<CRS>EPSG:5649</CRS>
<CRS>EPSG:5650</CRS>
<CRS>EPSG:5651</CRS>
<CRS>EPSG:5652</CRS>
<CRS>EPSG:5653</CRS>
<CRS>EPSG:25831</CRS>
<CRS>EPSG:25833</CRS>
<CRS>EPSG:28992</CRS>
<CRS>EPSG:31466</CRS>
<!-- alias 31466 -->
<CRS>EPSG:31462</CRS>
<CRS>EPSG:31467</CRS>
<!-- alias 31467 -->
<CRS>EPSG:31463</CRS>
<EX_GeographicBoundingBox><westBoundLongitude>5.974238</westBoundLongitude><eastBoundLongitude>8.863744</eastBoundLongitude><southBoundLatitude>50.492330</southBoundLatitude><northBoundLatitude>52.519339</northBoundLatitude></EX_GeographicBoundingBox>
<BoundingBox CRS="CRS:84" minx="5.974238" miny="50.492330" maxx="8.863744" maxy="52.519339"/>
<BoundingBox CRS="EPSG:4326" minx="50.492330" miny="5.974238" maxx="52.519339" maxy="8.863744"/>
<BoundingBox CRS="EPSG:25832" minx="294536.814500" miny="5597381.500000" maxx="490342.360800" maxy="5818812.667000"/>
<BoundingBox CRS="EPSG:3034" minx="2642487.037325" miny="3733102.092919" maxx="2858863.475934" maxy="3925094.247221"/>
<BoundingBox CRS="EPSG:3035" minx="3046895.936259" miny="4044611.230705" maxx="3271054.463204" maxy="4243460.187643"/>
<BoundingBox CRS="EPSG:3043" minx="5597973.136583" miny="701965.351261" maxx="5834943.435901" maxy="915474.816429"/>
<BoundingBox CRS="EPSG:3044" minx="5597381.500000" miny="294536.814500" maxx="5818812.667000" maxy="490342.360800"/>
<BoundingBox CRS="EPSG:3045" minx="5615375.730794" miny="-130584.858594" maxx="5852898.446297" maxy="83430.527450"/>
<BoundingBox CRS="EPSG:3857" minx="665049.185441" miny="6531979.370340" maxx="986707.473220" maxy="6894578.901701"/>
<BoundingBox CRS="EPSG:102100" minx="665049.185441" miny="6531979.370340" maxx="986707.473220" maxy="6894578.901701"/>
<BoundingBox CRS="EPSG:4258" minx="50.492330" miny="5.974238" maxx="52.519339" maxy="8.863744"/>
<BoundingBox CRS="EPSG:4647" minx="32294536.814500" miny="5597381.500000" maxx="32490342.360800" maxy="5818812.667000"/>
<BoundingBox CRS="EPSG:102362" minx="32294536.814500" miny="5597381.500000" maxx="32490342.360800" maxy="5818812.667000"/>
<BoundingBox CRS="EPSG:5649" minx="31701965.351261" miny="5597973.136583" maxx="31915474.816429" maxy="5834943.435901"/>
<BoundingBox CRS="EPSG:5650" minx="32869415.141406" miny="5615375.730794" maxx="33083430.527450" maxy="5852898.446297"/>
<BoundingBox CRS="EPSG:5651" minx="31701965.351261" miny="5597973.136583" maxx="31915474.816429" maxy="5834943.435901"/>
<BoundingBox CRS="EPSG:5652" minx="32294536.814500" miny="5597381.500000" maxx="32490342.360800" maxy="5818812.667000"/>
<BoundingBox CRS="EPSG:5653" minx="32869415.141406" miny="5615375.730794" maxx="33083430.527450" maxy="5852898.446297"/>
<BoundingBox CRS="EPSG:25831" minx="701965.351261" miny="5597973.136583" maxx="915474.816429" maxy="5834943.435901"/>
<BoundingBox CRS="EPSG:25833" minx="-130584.858594" miny="5615375.730794" maxx="83430.527450" maxy="5852898.446297"/>
<BoundingBox CRS="EPSG:28992" minx="194845.003427" miny="278164.193269" maxx="401414.461792" maxy="509049.598788"/>
<BoundingBox CRS="EPSG:31466" minx="5595042.148956" miny="2498249.978220" maxx="5824371.398980" maxy="2703018.666160"/>
<BoundingBox CRS="EPSG:31462" minx="5595042.148956" miny="2498249.978220" maxx="5824371.398980" maxy="2703018.666160"/>
<BoundingBox CRS="EPSG:31467" minx="5599047.135072" miny="3294479.668063" maxx="5820541.617816" maxy="3490339.675551"/>
<BoundingBox CRS="EPSG:31463" minx="5599047.135072" miny="3294479.668063" maxx="5820541.617816" maxy="3490339.675551"/>
<Style>
<Name>default</Name>
<Title><![CDATA[vorläufig gesicherte Überschwemmungsgebiete]]></Title>
<LegendURL width="18" height="18">
<Format>image/png</Format>
<OnlineResource xlink:href="https://www.wms.nrw.de/umwelt/wasser/uesg?request=GetLegendGraphic%26version=1.3.0%26format=image/png%26layer=5" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" />
</LegendURL>
</Style>
</Layer>
<Layer queryable="1">
<Name>6</Name>
<Title><![CDATA[Festgesetzte Überschwemmungsgebiete]]></Title>
<Abstract><![CDATA[]]></Abstract>
<CRS>CRS:84</CRS>
<CRS>EPSG:4326</CRS>
<CRS>EPSG:25832</CRS>
<CRS>EPSG:3034</CRS>
<CRS>EPSG:3035</CRS>
<CRS>EPSG:3043</CRS>
<CRS>EPSG:3044</CRS>
<CRS>EPSG:3045</CRS>
<CRS>EPSG:3857</CRS>
<!-- alias 3857 -->
<CRS>EPSG:102100</CRS>
<CRS>EPSG:4258</CRS>
<CRS>EPSG:4647</CRS>
<!-- alias 4647 -->
<CRS>EPSG:102362</CRS>
<CRS>EPSG:5649</CRS>
<CRS>EPSG:5650</CRS>
<CRS>EPSG:5651</CRS>
<CRS>EPSG:5652</CRS>
<CRS>EPSG:5653</CRS>
<CRS>EPSG:25831</CRS>
<CRS>EPSG:25833</CRS>
<CRS>EPSG:28992</CRS>
<CRS>EPSG:31466</CRS>
<!-- alias 31466 -->
<CRS>EPSG:31462</CRS>
<CRS>EPSG:31467</CRS>
<!-- alias 31467 -->
<CRS>EPSG:31463</CRS>
<EX_GeographicBoundingBox><westBoundLongitude>5.767005</westBoundLongitude><eastBoundLongitude>9.467921</eastBoundLongitude><southBoundLatitude>50.342833</southBoundLatitude><northBoundLatitude>52.506148</northBoundLatitude></EX_GeographicBoundingBox>
<BoundingBox CRS="CRS:84" minx="5.767005" miny="50.342833" maxx="9.467921" maxy="52.506148"/>
<BoundingBox CRS="EPSG:4326" minx="50.342833" miny="5.767005" maxx="52.506148" maxy="9.467921"/>
<BoundingBox CRS="EPSG:25832" minx="280374.968000" miny="5581306.307300" maxx="531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:3034" minx="2626418.448171" miny="3719216.543717" maxx="2857608.834051" maxy="3965098.122561"/>
<BoundingBox CRS="EPSG:3035" minx="3030252.493646" miny="4030235.136442" maxx="3269767.520179" maxy="4284870.346137"/>
<BoundingBox CRS="EPSG:3043" minx="5580808.041666" miny="687976.127217" maxx="5836918.599953" maxy="958155.698507"/>
<BoundingBox CRS="EPSG:3044" minx="5581306.307300" miny="280374.968000" maxx="5817335.818600" maxy="531760.056900"/>
<BoundingBox CRS="EPSG:3045" minx="5595966.573682" miny="-146071.074841" maxx="5852605.701367" maxy="124661.414182"/>
<BoundingBox CRS="EPSG:3857" minx="641980.088463" miny="6505861.593340" maxx="1053964.141781" maxy="6892165.966479"/>
<BoundingBox CRS="EPSG:102100" minx="641980.088463" miny="6505861.593340" maxx="1053964.141781" maxy="6892165.966479"/>
<BoundingBox CRS="EPSG:4258" minx="50.342833" miny="5.767005" maxx="52.506148" maxy="9.467921"/>
<BoundingBox CRS="EPSG:4647" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:102362" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:5649" minx="31687976.127217" miny="5580808.041666" maxx="31958155.698507" maxy="5836918.599953"/>
<BoundingBox CRS="EPSG:5650" minx="32853928.925159" miny="5595966.573682" maxx="33124661.414182" maxy="5852605.701367"/>
<BoundingBox CRS="EPSG:5651" minx="31687976.127217" miny="5580808.041666" maxx="31958155.698507" maxy="5836918.599953"/>
<BoundingBox CRS="EPSG:5652" minx="32280374.968000" miny="5581306.307300" maxx="32531760.056900" maxy="5817335.818600"/>
<BoundingBox CRS="EPSG:5653" minx="32853928.925159" miny="5595966.573682" maxx="33124661.414182" maxy="5852605.701367"/>
<BoundingBox CRS="EPSG:25831" minx="687976.127217" miny="5580808.041666" maxx="958155.698507" maxy="5836918.599953"/>
<BoundingBox CRS="EPSG:25833" minx="-146071.074841" miny="5595966.573682" maxx="124661.414182" maxy="5852605.701367"/>
<BoundingBox CRS="EPSG:28992" minx="180779.663459" miny="261420.508086" maxx="443608.161222" maxy="509641.226162"/>
<BoundingBox CRS="EPSG:31466" minx="5578412.972602" miny="2484165.566016" maxx="5824616.994221" maxy="2745089.297693"/>
<BoundingBox CRS="EPSG:31462" minx="5578412.972602" miny="2484165.566016" maxx="5824616.994221" maxy="2745089.297693"/>
<BoundingBox CRS="EPSG:31467" minx="5582967.334653" miny="3280313.877032" maxx="5819064.347428" maxy="3531768.891117"/>
<BoundingBox CRS="EPSG:31463" minx="5582967.334653" miny="3280313.877032" maxx="5819064.347428" maxy="3531768.891117"/>
<Style>
<Name>default</Name>
<Title><![CDATA[Festgesetzte Überschwemmungsgebiete]]></Title>
<LegendURL width="18" height="18">
<Format>image/png</Format>
<OnlineResource xlink:href="https://www.wms.nrw.de/umwelt/wasser/uesg?request=GetLegendGraphic%26version=1.3.0%26format=image/png%26layer=6" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink" />
</LegendURL>
</Style>
</Layer>
</Layer>
</Capability>
</WMS_Capabilities>

142
vite.config.js Normal file
View File

@ -0,0 +1,142 @@
import { defineConfig } from 'vite';
export default defineConfig({
server: {
proxy: {
'/api/local': {
target: 'http://localhost:3000',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/local/, '/api')
},
'/api/planning-data': {
target: 'http://localhost:3000',
changeOrigin: true
},
'/api/potential-data': {
target: 'http://localhost:3000',
changeOrigin: true
},
// -- WFS Proxies --
'/api/wfs/linfos': {
target: 'https://www.wfs.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wfs\/linfos/, '/umwelt/linfos'),
secure: false
},
'/api/wfs/alkis': {
target: 'https://www.wfs.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wfs\/alkis/, '/geobasis/wfs_nw_alkis_vereinfacht'),
secure: false
},
'/api/wfs/roads': {
target: 'https://www.wfs.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wfs\/roads/, '/wfs/DE_NW_SBV_INSPIRE_Downloadservice_Strassennetz'),
secure: false
},
// Inspire Schutzgebiete (bisher genutzt)
'/api/nrw/wfs': {
target: 'https://www.wfs.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/nrw\/wfs/, '/umwelt/wfs_nw_inspire-schutzgebiete'),
secure: false
},
// Aviation WFS (HaleConnect)
'/api/wfs/aviation': {
target: 'https://haleconnect.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wfs\/aviation/, '/ows/services/org.732.341f2791-919e-49de-8d86-3b18e040c430_wfs'),
secure: false
},
// NRW Strassennetz WFS (Downloadservice)
'/api/wfs/nrw_roads': {
target: 'http://www.wfs.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wfs\/nrw_roads/, '/wfs/DE_NW_SBV_INSPIRE_Downloadservice_Strassennetz'),
secure: false
},
// ATKIS Basis-DLM (Topographic data)
'/api/wfs/atkis': {
target: 'https://www.wfs.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wfs\/atkis/, '/geobasis/wfs_nw_inspire-verkehrsnetze_atkis-basis-dlm'),
secure: false
},
// Flood Zones (Überschwemmungsgebiete) WMS
'/api/wms/uesg_new': {
target: 'https://www.wms.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wms\/uesg_new/, '/umwelt/wasser/uesg'),
secure: false
},
// Renewable Energy WFS
'/api/wfs/energy': {
target: 'https://www.wfs.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wfs\/energy/, '/umwelt/erneuerbare_energien_wfs'),
secure: false
},
// -- WMS Proxies (Bilder) --
'/api/wms/dop': {
target: 'https://www.wms.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wms\/dop/, '/geobasis/wms_nw_dop'),
secure: false
},
'/api/wms/hu': { // Hausumringe
target: 'https://www.wms.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wms\/hu/, '/geobasis/wms_nw_hu'),
secure: false
},
'/api/wms/energy': { // Erneuerbare Energien
target: 'https://www.wms.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wms\/energy/, '/umwelt/erneuerbare_energien_nrw'),
secure: false
},
'/api/wms/wsg': { // Wasserschutzgebiete
target: 'https://www.wms.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wms\/wsg/, '/umwelt/wasser/wsg'),
secure: false
},
'/api/wfs/wsg': { // Wasserschutzgebiete WFS
target: 'https://www.wfs.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wfs\/wsg/, '/umwelt/wasser/wsg'),
secure: false
},
'/api/wms/roads': { // Strassen NRW Karten
target: 'https://www.wms.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wms\/roads/, '/wms/strassen_nrw_karten'),
secure: false
},
'/api/wms/linfos': { // LINFOS Visual
target: 'https://www.wms.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wms\/linfos/, '/umwelt/linfos'),
secure: false
},
'/api/wms/uesg': { // Überschwemmungsgebiete
target: 'https://www.wms.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wms\/uesg/, '/umwelt/wasser/uesg'),
secure: false
},
'/api/wms/alkis': { // ALKIS WMS
target: 'https://www.wms.nrw.de',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/wms\/alkis/, '/geobasis/wms_nw_alkis'),
secure: false
}
}
}
});

49
wind_schema.xml Normal file
View File

@ -0,0 +1,49 @@
<?xml version='1.0' encoding="UTF-8" ?>
<schema
targetNamespace="http://www.wfs.nrw.de/schemas"
xmlns:erneuerbare_energien_wfs="http://www.wfs.nrw.de/schemas"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:gml="http://www.opengis.net/gml/3.2"
elementFormDefault="qualified" version="0.1" >
<import namespace="http://www.opengis.net/gml/3.2"
schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd" />
<element name="WFS_Windenergie"
type="erneuerbare_energien_wfs:WFS_WindenergieType"
substitutionGroup="gml:AbstractFeature" />
<complexType name="WFS_WindenergieType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="msGeometry" type="gml:GeometryPropertyType" minOccurs="0" maxOccurs="1"/>
<element name="lanuv_id" minOccurs="0" type="string"/>
<element name="anlage" minOccurs="0" type="string"/>
<element name="reg_bezirk" minOccurs="0" type="string"/>
<element name="plan_reg" minOccurs="0" type="string"/>
<element name="gkz" minOccurs="0" type="string"/>
<element name="kreis" minOccurs="0" type="string"/>
<element name="plz" minOccurs="0" type="string"/>
<element name="gemeinde" minOccurs="0" type="string"/>
<element name="utmost" minOccurs="0" type="double"/>
<element name="utmnord" minOccurs="0" type="double"/>
<element name="status" minOccurs="0" type="string"/>
<element name="ibjahr" minOccurs="0" type="string"/>
<element name="gen_dat" minOccurs="0" type="integer"/>
<element name="leistung" minOccurs="0" type="double"/>
<element name="herstell" minOccurs="0" type="string"/>
<element name="anl_typ" minOccurs="0" type="string"/>
<element name="durchmes" minOccurs="0" type="double"/>
<element name="nab_hoeh" minOccurs="0" type="double"/>
<element name="ges_hoeh" minOccurs="0" type="double"/>
<element name="technol" minOccurs="0" type="string"/>
<element name="einspeisg" minOccurs="0" type="string"/>
<element name="Stand" minOccurs="0" type="integer"/>
</sequence>
</extension>
</complexContent>
</complexType>
</schema>

0
wsg_caps.xml Normal file
View File