Erster Upload Planungstool

This commit is contained in:
Johannes Baumeister 2026-03-24 13:03:21 +01:00
commit cde6609044
61 changed files with 3548 additions and 0 deletions

Binary file not shown.

View File

@ -0,0 +1 @@
UTF-8

BIN
Shapefile/Eigentümer.dbf Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
PROJCS["ETRS_1989_UTM_Zone_32N",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]

44
Shapefile/Eigentümer.qmd Normal file
View File

@ -0,0 +1,44 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis version="3.40.10-Bratislava">
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type>dataset</type>
<title></title>
<abstract></abstract>
<contact>
<name></name>
<organization></organization>
<position></position>
<voice></voice>
<fax></fax>
<email></email>
<role></role>
</contact>
<links/>
<dates/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys nativeFormat="Wkt">
<wkt>PROJCRS["ETRS89 / UTM zone 32N",BASEGEOGCRS["ETRS89",ENSEMBLE["European Terrestrial Reference System 1989 ensemble",MEMBER["European Terrestrial Reference Frame 1989"],MEMBER["European Terrestrial Reference Frame 1990"],MEMBER["European Terrestrial Reference Frame 1991"],MEMBER["European Terrestrial Reference Frame 1992"],MEMBER["European Terrestrial Reference Frame 1993"],MEMBER["European Terrestrial Reference Frame 1994"],MEMBER["European Terrestrial Reference Frame 1996"],MEMBER["European Terrestrial Reference Frame 1997"],MEMBER["European Terrestrial Reference Frame 2000"],MEMBER["European Terrestrial Reference Frame 2005"],MEMBER["European Terrestrial Reference Frame 2014"],MEMBER["European Terrestrial Reference Frame 2020"],ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[0.1]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4258]],CONVERSION["UTM zone 32N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",9,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Engineering survey, topographic mapping."],AREA["Europe between 6°E and 12°E: Austria; Denmark - onshore and offshore; Germany - onshore and offshore; Italy - onshore and offshore; Norway including Svalbard - onshore and offshore; Spain - offshore."],BBOX[36.53,6,84.01,12.01]],USAGE[SCOPE["Pan-European conformal mapping at scales larger than 1:500,000."],AREA["Europe between 6°E and 12°E and approximately 36°30'N to 84°N."],BBOX[36.53,6,84.01,12.01]],ID["EPSG",25832]]</wkt>
<proj4>+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs</proj4>
<srsid>2105</srsid>
<srid>25832</srid>
<authid>EPSG:25832</authid>
<description>ETRS89 / UTM zone 32N</description>
<projectionacronym>utm</projectionacronym>
<ellipsoidacronym>EPSG:7019</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent>
<spatial minx="0" miny="0" dimensions="2" minz="0" maxy="0" maxx="0" crs="EPSG:25832" maxz="0"/>
<temporal>
<period>
<start></start>
<end></end>
</period>
</temporal>
</extent>
</qgis>

BIN
Shapefile/Eigentümer.shp Normal file

Binary file not shown.

BIN
Shapefile/Eigentümer.shx Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
UTF-8

Binary file not shown.

View File

@ -0,0 +1 @@
PROJCS["ETRS_1989_UTM_Zone_32N",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]

View File

@ -0,0 +1,27 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis version="3.40.10-Bratislava">
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type></type>
<title></title>
<abstract></abstract>
<links/>
<dates/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys nativeFormat="Wkt">
<wkt></wkt>
<proj4></proj4>
<srsid>0</srsid>
<srid>0</srid>
<authid></authid>
<description></description>
<projectionacronym></projectionacronym>
<ellipsoidacronym></ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent/>
</qgis>

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
UTF-8

Binary file not shown.

View File

@ -0,0 +1 @@
PROJCS["ETRS_1989_UTM_Zone_32N",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]

View File

@ -0,0 +1,44 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis version="3.40.10-Bratislava">
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type></type>
<title></title>
<abstract></abstract>
<contact>
<name></name>
<organization></organization>
<position></position>
<voice></voice>
<fax></fax>
<email></email>
<role></role>
</contact>
<links/>
<dates/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys nativeFormat="Wkt">
<wkt>PROJCRS["RGSH2020 / UTM zone 32N",BASEGEOGCRS["RGSH2020",DATUM["Sonatrach Reference Frame 2020",ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",10299]],CONVERSION["UTM zone 32N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",9,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Oil and gas exploration and production."],AREA["Algeria - east of 6°E (of Greenwich), onshore and offshore."],BBOX[19.6,6,38.8,11.99]],ID["EPSG",22232]]</wkt>
<proj4>+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs</proj4>
<srsid>66925</srsid>
<srid>520006925</srid>
<authid>EPSG:22232</authid>
<description>RGSH2020 / UTM zone 32N</description>
<projectionacronym>utm</projectionacronym>
<ellipsoidacronym>EPSG:7019</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent>
<spatial minx="0" miny="0" dimensions="2" minz="0" maxy="0" maxx="0" crs="EPSG:22232" maxz="0"/>
<temporal>
<period>
<start></start>
<end></end>
</period>
</temporal>
</extent>
</qgis>

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
UTF-8

BIN
Shapefile/Freileitungen.dbf Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
PROJCS["ETRS_1989_UTM_Zone_32N",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]

View File

@ -0,0 +1,44 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis version="3.40.10-Bratislava">
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type>dataset</type>
<title></title>
<abstract></abstract>
<contact>
<name></name>
<organization></organization>
<position></position>
<voice></voice>
<fax></fax>
<email></email>
<role></role>
</contact>
<links/>
<dates/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys nativeFormat="Wkt">
<wkt>PROJCRS["RGSH2020 / UTM zone 32N",BASEGEOGCRS["RGSH2020",DATUM["Sonatrach Reference Frame 2020",ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",10299]],CONVERSION["UTM zone 32N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",9,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Oil and gas exploration and production."],AREA["Algeria - east of 6°E (of Greenwich), onshore and offshore."],BBOX[19.6,6,38.8,11.99]],ID["EPSG",22232]]</wkt>
<proj4>+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs</proj4>
<srsid>66925</srsid>
<srid>520006925</srid>
<authid>EPSG:22232</authid>
<description>RGSH2020 / UTM zone 32N</description>
<projectionacronym>utm</projectionacronym>
<ellipsoidacronym>EPSG:7019</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent>
<spatial minx="0" miny="0" dimensions="2" minz="0" maxy="0" maxx="0" crs="EPSG:22232" maxz="0"/>
<temporal>
<period>
<start></start>
<end></end>
</period>
</temporal>
</extent>
</qgis>

BIN
Shapefile/Freileitungen.shp Normal file

Binary file not shown.

BIN
Shapefile/Freileitungen.shx Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
UTF-8

BIN
Shapefile/WEA_Standorte.dbf Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
PROJCS["ETRS_1989_UTM_Zone_32N",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]

View File

@ -0,0 +1,44 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis version="3.40.10-Bratislava">
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type>dataset</type>
<title></title>
<abstract></abstract>
<contact>
<name></name>
<organization></organization>
<position></position>
<voice></voice>
<fax></fax>
<email></email>
<role></role>
</contact>
<links/>
<dates/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys nativeFormat="Wkt">
<wkt>PROJCRS["ETRS89 / UTM zone 32N",BASEGEOGCRS["ETRS89",ENSEMBLE["European Terrestrial Reference System 1989 ensemble",MEMBER["European Terrestrial Reference Frame 1989"],MEMBER["European Terrestrial Reference Frame 1990"],MEMBER["European Terrestrial Reference Frame 1991"],MEMBER["European Terrestrial Reference Frame 1992"],MEMBER["European Terrestrial Reference Frame 1993"],MEMBER["European Terrestrial Reference Frame 1994"],MEMBER["European Terrestrial Reference Frame 1996"],MEMBER["European Terrestrial Reference Frame 1997"],MEMBER["European Terrestrial Reference Frame 2000"],MEMBER["European Terrestrial Reference Frame 2005"],MEMBER["European Terrestrial Reference Frame 2014"],MEMBER["European Terrestrial Reference Frame 2020"],ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[0.1]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4258]],CONVERSION["UTM zone 32N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",9,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Engineering survey, topographic mapping."],AREA["Europe between 6°E and 12°E: Austria; Denmark - onshore and offshore; Germany - onshore and offshore; Italy - onshore and offshore; Norway including Svalbard - onshore and offshore; Spain - offshore."],BBOX[36.53,6,84.01,12.01]],USAGE[SCOPE["Pan-European conformal mapping at scales larger than 1:500,000."],AREA["Europe between 6°E and 12°E and approximately 36°30'N to 84°N."],BBOX[36.53,6,84.01,12.01]],ID["EPSG",25832]]</wkt>
<proj4>+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs</proj4>
<srsid>2105</srsid>
<srid>25832</srid>
<authid>EPSG:25832</authid>
<description>ETRS89 / UTM zone 32N</description>
<projectionacronym>utm</projectionacronym>
<ellipsoidacronym>EPSG:7019</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent>
<spatial minx="0" miny="0" dimensions="2" minz="0" maxy="0" maxx="0" crs="EPSG:25832" maxz="0"/>
<temporal>
<period>
<start></start>
<end></end>
</period>
</temporal>
</extent>
</qgis>

BIN
Shapefile/WEA_Standorte.shp Normal file

Binary file not shown.

BIN
Shapefile/WEA_Standorte.shx Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
UTF-8

Binary file not shown.

View File

@ -0,0 +1 @@
PROJCS["ETRS_1989_UTM_Zone_32N",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]

View File

@ -0,0 +1,44 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis version="3.40.10-Bratislava">
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type>dataset</type>
<title></title>
<abstract></abstract>
<contact>
<name></name>
<organization></organization>
<position></position>
<voice></voice>
<fax></fax>
<email></email>
<role></role>
</contact>
<links/>
<dates/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys nativeFormat="Wkt">
<wkt>PROJCRS["ETRS89 / UTM zone 32N",BASEGEOGCRS["ETRS89",ENSEMBLE["European Terrestrial Reference System 1989 ensemble",MEMBER["European Terrestrial Reference Frame 1989"],MEMBER["European Terrestrial Reference Frame 1990"],MEMBER["European Terrestrial Reference Frame 1991"],MEMBER["European Terrestrial Reference Frame 1992"],MEMBER["European Terrestrial Reference Frame 1993"],MEMBER["European Terrestrial Reference Frame 1994"],MEMBER["European Terrestrial Reference Frame 1996"],MEMBER["European Terrestrial Reference Frame 1997"],MEMBER["European Terrestrial Reference Frame 2000"],MEMBER["European Terrestrial Reference Frame 2005"],MEMBER["European Terrestrial Reference Frame 2014"],MEMBER["European Terrestrial Reference Frame 2020"],ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[0.1]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4258]],CONVERSION["UTM zone 32N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",9,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Engineering survey, topographic mapping."],AREA["Europe between 6°E and 12°E: Austria; Denmark - onshore and offshore; Germany - onshore and offshore; Italy - onshore and offshore; Norway including Svalbard - onshore and offshore; Spain - offshore."],BBOX[36.53,6,84.01,12.01]],USAGE[SCOPE["Pan-European conformal mapping at scales larger than 1:500,000."],AREA["Europe between 6°E and 12°E and approximately 36°30'N to 84°N."],BBOX[36.53,6,84.01,12.01]],ID["EPSG",25832]]</wkt>
<proj4>+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs</proj4>
<srsid>2105</srsid>
<srid>25832</srid>
<authid>EPSG:25832</authid>
<description>ETRS89 / UTM zone 32N</description>
<projectionacronym>utm</projectionacronym>
<ellipsoidacronym>EPSG:7019</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent>
<spatial minx="179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" miny="179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" dimensions="2" minz="0" maxy="-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" maxx="-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" crs="EPSG:25832" maxz="0"/>
<temporal>
<period>
<start></start>
<end></end>
</period>
</temporal>
</extent>
</qgis>

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
UTF-8

BIN
Shapefile/Wohnbebauung.dbf Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
PROJCS["ETRS_1989_UTM_Zone_32N",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]

View File

@ -0,0 +1,44 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis version="3.40.10-Bratislava">
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type>dataset</type>
<title></title>
<abstract></abstract>
<contact>
<name></name>
<organization></organization>
<position></position>
<voice></voice>
<fax></fax>
<email></email>
<role></role>
</contact>
<links/>
<dates/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys nativeFormat="Wkt">
<wkt>PROJCRS["ETRS89 / UTM zone 32N",BASEGEOGCRS["ETRS89",ENSEMBLE["European Terrestrial Reference System 1989 ensemble",MEMBER["European Terrestrial Reference Frame 1989"],MEMBER["European Terrestrial Reference Frame 1990"],MEMBER["European Terrestrial Reference Frame 1991"],MEMBER["European Terrestrial Reference Frame 1992"],MEMBER["European Terrestrial Reference Frame 1993"],MEMBER["European Terrestrial Reference Frame 1994"],MEMBER["European Terrestrial Reference Frame 1996"],MEMBER["European Terrestrial Reference Frame 1997"],MEMBER["European Terrestrial Reference Frame 2000"],MEMBER["European Terrestrial Reference Frame 2005"],MEMBER["European Terrestrial Reference Frame 2014"],MEMBER["European Terrestrial Reference Frame 2020"],ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[0.1]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4258]],CONVERSION["UTM zone 32N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",9,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Engineering survey, topographic mapping."],AREA["Europe between 6°E and 12°E: Austria; Denmark - onshore and offshore; Germany - onshore and offshore; Italy - onshore and offshore; Norway including Svalbard - onshore and offshore; Spain - offshore."],BBOX[36.53,6,84.01,12.01]],USAGE[SCOPE["Pan-European conformal mapping at scales larger than 1:500,000."],AREA["Europe between 6°E and 12°E and approximately 36°30'N to 84°N."],BBOX[36.53,6,84.01,12.01]],ID["EPSG",25832]]</wkt>
<proj4>+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs</proj4>
<srsid>2105</srsid>
<srid>25832</srid>
<authid>EPSG:25832</authid>
<description>ETRS89 / UTM zone 32N</description>
<projectionacronym>utm</projectionacronym>
<ellipsoidacronym>EPSG:7019</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent>
<spatial minx="179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" miny="179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" dimensions="2" minz="0" maxy="-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" maxx="-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" crs="EPSG:25832" maxz="0"/>
<temporal>
<period>
<start></start>
<end></end>
</period>
</temporal>
</extent>
</qgis>

BIN
Shapefile/Wohnbebauung.shp Normal file

Binary file not shown.

BIN
Shapefile/Wohnbebauung.shx Normal file

Binary file not shown.

1474
app.js Normal file

File diff suppressed because it is too large Load Diff

54
config/layers.js Normal file
View File

@ -0,0 +1,54 @@
window.LAYER_CONFIG = [
{
"name": "Eigentümer",
"file": "Eigentümer",
"color": "#000000",
"fillColor": "transparent",
"weight": 2.0,
"fillOpacity": 0
},
{
"name": "Erdleitung (OGE)",
"file": "Erdleitung_OGE",
"color": "#9400d3",
"weight": 2.5,
"fillOpacity": 0
},
{
"name": "Erdleitung (Thyssengas)",
"file": "Erdleitung_Thyssengas",
"color": "#9400d3",
"weight": 2.5,
"fillOpacity": 0
},
{
"name": "Freileitungen",
"file": "Freileitungen",
"color": "#ccaa00",
"weight": 3.0,
"fillOpacity": 0
},
{
"name": "WEA Standorte",
"file": "WEA_Standorte",
"color": "#ff00ff",
"weight": 2,
"fillOpacity": 1
},
{
"name": "Windeignungsgebiet",
"file": "Windeignungsgebiet",
"color": "#ff0000",
"weight": 3,
"fillOpacity": 0,
"fillColor": "transparent"
},
{
"name": "Wohnbebauung",
"file": "Wohnbebauung",
"color": "#ff4444",
"weight": 1.5,
"fillOpacity": 0.6,
"isResidential": true
}
];

51
config/layers.json Normal file
View File

@ -0,0 +1,51 @@
[
{
"name": "Eigentümer",
"file": "Eigentümer",
"color": "#00ff00",
"weight": 1.5,
"fillOpacity": 0.2
},
{
"name": "Erdleitung (OGE)",
"file": "Erdleitung_OGE",
"color": "#ff5500",
"weight": 2,
"fillOpacity": 0
},
{
"name": "Erdleitung (Thyssengas)",
"file": "Erdleitung_Thyssengas",
"color": "#ffaa00",
"weight": 2,
"fillOpacity": 0
},
{
"name": "Freileitungen",
"file": "Freileitungen",
"color": "#ffff00",
"weight": 1,
"fillOpacity": 0
},
{
"name": "WEA Standorte",
"file": "WEA_Standorte",
"color": "#ff00ff",
"weight": 2,
"fillOpacity": 1
},
{
"name": "Windeignungsgebiet",
"file": "Windeignungsgebiet",
"color": "#00aaff",
"weight": 2,
"fillOpacity": 0.3
},
{
"name": "Wohnbebauung",
"file": "Wohnbebauung",
"color": "#ff0000",
"weight": 1.5,
"fillOpacity": 0.2
}
]

View File

@ -0,0 +1,11 @@
{
"projektName": "Neues Wind-Projekt",
"bundesland": "NRW",
"parameter": {
"wakeZoneWinkel": 225,
"wakeZoneLaengeFaktorMin": 3,
"wakeZoneLaengeFaktorMax": 4,
"technischerAbstandFaktor": 2.5,
"auflastenRadiusFaktor": 0.3
}
}

1
data/baked_layers.js Normal file

File diff suppressed because one or more lines are too long

250
index.html Normal file
View File

@ -0,0 +1,250 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WindPlaner Standalone</title>
<!-- Config and Standalone Data (Bypass CORS) -->
<script src="config/layers.js"></script>
<script src="data/baked_layers.js"></script>
<!-- Dependencies -->
<link rel="stylesheet" href="libs/leaflet.css">
<link rel="stylesheet" href="libs/leaflet.draw.css">
<link rel="stylesheet" href="style.css">
<!-- Fonts -->
<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=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
</head>
<body>
<aside class="sidebar">
<div class="sidebar-header">
<h1>WindPlaner</h1>
</div>
<div class="sidebar-content">
<div class="section">
<h2>Varianten-Management</h2>
<div class="variant-tabs" id="variantTabs">
<div class="variant-tab active" data-variant="A">Var A</div>
<div class="variant-tab" data-variant="B">Var B</div>
<div class="variant-tab" data-variant="C">Var C</div>
</div>
</div>
<div class="section">
<h2>Anlagen-Konfiguration</h2>
<div class="control-group">
<label for="turbineType">Anlagentyp</label>
<input type="text" id="turbineType" class="input-styled" placeholder="z.B. Vestas V162">
</div>
<div class="control-group">
<label for="rotorDiameter">Rotordurchmesser (m)</label>
<input type="number" id="rotorDiameter" class="input-styled" value="160">
</div>
<div class="control-group">
<label for="hubHeight">Nabenhöhe (m)</label>
<input type="number" id="hubHeight" class="input-styled" value="165">
</div>
<div class="control-group">
<label for="foundationRadius">Fundament Radius (m)</label>
<input type="number" id="foundationRadius" class="input-styled" value="15">
</div>
<div class="section">
<h2>Werkzeuge</h2>
<div class="control-group" style="display: flex; gap: 8px; flex-wrap: wrap;">
<button class="btn-primary" id="btnPlaceTurbine" style="flex: 1; min-width: 140px;">
<span>📍</span> Anlage setzen
</button>
<button class="btn-secondary" id="btnManageOwners"
style="flex: 1; min-width: 140px; margin-top: 0;">
<span>👥</span> Eigentümer verwalten
</button>
<button class="btn-secondary" id="btnMeasureDist" title="Distanz messen"
style="flex: 0.5; padding: 10px; margin-top: 0;">📏</button>
<button class="btn-secondary" id="btnMeasureArea" title="Fläche messen"
style="flex: 0.5; padding: 10px; margin-top: 0;">📐</button>
</div>
</div>
<!-- UTM Coordinate Input -->
<div class="section"
style="border: 1px solid var(--border-color); padding: 12px; border-radius: 10px; background: rgba(255, 255, 255, 0.02);">
<h2 style="margin-bottom: 10px;">Manuelle Koordinaten (UTM)</h2>
<div style="display: flex; gap: 8px; margin-bottom: 10px;">
<div style="flex: 1;">
<label
style="font-size: 0.75rem; color: var(--text-dim); display: block; margin-bottom: 3px;">Rechtswert
(E)</label>
<input type="number" id="utm-e" class="input-styled" placeholder="32..." step="0.01">
</div>
<div style="flex: 1;">
<label
style="font-size: 0.75rem; color: var(--text-dim); display: block; margin-bottom: 3px;">Hochwert
(N)</label>
<input type="number" id="utm-n" class="input-styled" placeholder="5..." step="0.01">
</div>
</div>
<button class="btn-primary" id="btnCreateAtUTM" style="font-size: 0.8rem; padding: 8px;">
An UTM-Position erzeugen
</button>
</div>
<!-- Daten-Laden Section -->
<div class="section" id="importSection">
<h2>Daten-Laden & Automatik</h2>
<div
style="background: rgba(255, 136, 0, 0.1); border: 1px dashed #ff8800; padding: 10px; border-radius: 8px;">
<p style="font-size: 0.75rem; color: #ff8800; margin-bottom: 8px;">
<b>1. Einmalig:</b> Dateien (.shp + .dbf) wählen ODER auf Karte ziehen.<br>
<b>2. Dauerhaft machen:</b> Unten auf "Daten-Bundle speichern" klicken und in /data als
<i>baked_layers.js</i> speichern.
</p>
<button class="btn-secondary" id="btnManualImport"
style="border-color: #ff8800; color: #ff8800;">
📂 Dateien wählen
</button>
<input type="file" id="manualShpInput" style="display: none;" multiple accept=".shp,.dbf">
<button class="btn-secondary" id="btnExportBundle"
style="margin-top: 10px; background: #ff8800; color: white; border: none;">
💾 Daten-Bundle speichern
</button>
</div>
</div>
<div class="section">
<h2>Projektverwaltung</h2>
<button class="btn-secondary" id="btnSaveProject">Projekt speichern</button>
<button class="btn-secondary" id="btnLoadProject">Projekt laden</button>
<input type="file" id="projectInput" style="display: none;" accept=".json">
</div>
<div id="statusInfo"
style="margin-top: auto; padding-top: 20px; font-size: 0.8rem; color: var(--text-dim);">
Bereit.
</div>
</div>
</aside>
<!-- Floating Edit Panel -->
<div id="editPanel" style="display: none;">
<div class="edit-panel-content">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;">
<h2 style="margin: 0; font-size: 1.1rem; color: var(--primary-color);">WEA bearbeiten</h2>
<button id="btnCloseEdit"
style="background: transparent; border: none; color: white; cursor: pointer; font-size: 1.2rem;">✕</button>
</div>
<div class="edit-rows-container">
<div class="edit-row">
<label>Nr:</label>
<input type="text" id="edit-wea-nr" class="edit-input">
</div>
<div class="edit-row separator">
<label>Typ:</label>
<input type="text" id="edit-wea-type" class="edit-input">
</div>
<div class="edit-row">
<label>RD (m):</label>
<input type="number" id="edit-wea-rd" class="edit-input">
</div>
<div class="edit-row separator">
<label>NH (m):</label>
<input type="number" id="edit-wea-nh" class="edit-input">
</div>
<div class="edit-row">
<label>Fund (m):</label>
<input type="number" id="edit-wea-fr" class="edit-input">
</div>
<div class="edit-row separator">
<label>Wink (°):</label>
<input type="number" id="edit-wea-ksf-angle" class="edit-input" value="0">
</div>
<div class="edit-row" style="margin-top: 5px;">
<label
style="cursor: pointer; display: flex; align-items: center; gap: 8px; font-weight: normal; font-size: 0.8rem; width: 100%;">
<input type="checkbox" id="edit-wea-ksf-mirrored"> Spiegeln (KSF)
</label>
</div>
</div>
<div style="display: flex; flex-direction: column; gap: 6px; margin-top: 10px;">
<button class="btn-primary-mini" id="btnSaveEdit">Speichern</button>
<button class="btn-danger-mini" id="btnDeleteWEA">Anlage löschen</button>
</div>
</div>
</div>
<!-- Floating Legend -->
<div id="floatingLegend" class="floating-panel collapsible">
<div class="panel-header" id="legendHeader">
<span>📑 Legende</span>
<button class="toggle-btn" id="btnToggleLegend"></button>
</div>
<div class="panel-content" id="legendContent">
<!-- Dynamic content injected via JS -->
</div>
</div>
<!-- Owner Management Modal -->
<div id="ownerModal" class="modal-overlay" style="display: none;">
<div class="modal-content">
<div class="modal-header">
<h2>Eigentümer-Management</h2>
<button id="btnCloseOwnerModal" class="modal-close"></button>
</div>
<!-- Stage 1: Column Mapping (Shown if not configured) -->
<div id="ownerMappingSection" style="display: none;">
<p>Bitte ordnen Sie die Spalten für Namen aus dem Layer "Eigentümer" zu:</p>
<div style="display: flex; gap: 15px; justify-content: center; margin-top: 15px;">
<div>
<label style="display: block; font-size: 0.8rem; margin-bottom: 5px;">Vorname</label>
<select id="selectFirstName" class="input-styled" style="width: 150px;"></select>
</div>
<div>
<label style="display: block; font-size: 0.8rem; margin-bottom: 5px;">Nachname</label>
<select id="selectLastName" class="input-styled" style="width: 150px;"></select>
</div>
</div>
<button class="btn-primary" id="btnConfirmMapping"
style="margin-top: 20px; width: auto; padding: 10px 30px;">
Konfiguration bestätigen
</button>
</div>
<!-- Stage 2: Owner List -->
<div id="ownerListSection" style="display: none;">
<div style="padding: 15px; border-bottom: 1px solid var(--border-color);">
<input type="text" id="ownerSearch" class="input-styled" placeholder="Eigentümer suchen...">
</div>
<div class="owner-table-container">
<table id="ownerTable">
<thead>
<tr>
<th>Name</th>
<th>Flächen</th>
<th>Status</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<main id="map"></main>
<!-- JS Dependencies -->
<script src="libs/proj4.js"></script>
<script src="libs/shp.min.js"></script>
<script src="libs/leaflet.js"></script>
<script src="libs/turf.min.js"></script>
<script src="app.js"></script>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
libs/images/marker-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

BIN
libs/images/spritesheet.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

661
libs/leaflet.css Normal file
View File

@ -0,0 +1,661 @@
/* required styles */
.leaflet-pane,
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile-container,
.leaflet-pane > svg,
.leaflet-pane > canvas,
.leaflet-zoom-box,
.leaflet-image-layer,
.leaflet-layer {
position: absolute;
left: 0;
top: 0;
}
.leaflet-container {
overflow: hidden;
}
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
-webkit-user-drag: none;
}
/* Prevents IE11 from highlighting tiles in blue */
.leaflet-tile::selection {
background: transparent;
}
/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
.leaflet-safari .leaflet-tile {
image-rendering: -webkit-optimize-contrast;
}
/* hack that prevents hw layers "stretching" when loading new tiles */
.leaflet-safari .leaflet-tile-container {
width: 1600px;
height: 1600px;
-webkit-transform-origin: 0 0;
}
.leaflet-marker-icon,
.leaflet-marker-shadow {
display: block;
}
/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
.leaflet-container .leaflet-overlay-pane svg {
max-width: none !important;
max-height: none !important;
}
.leaflet-container .leaflet-marker-pane img,
.leaflet-container .leaflet-shadow-pane img,
.leaflet-container .leaflet-tile-pane img,
.leaflet-container img.leaflet-image-layer,
.leaflet-container .leaflet-tile {
max-width: none !important;
max-height: none !important;
width: auto;
padding: 0;
}
.leaflet-container img.leaflet-tile {
/* See: https://bugs.chromium.org/p/chromium/issues/detail?id=600120 */
mix-blend-mode: plus-lighter;
}
.leaflet-container.leaflet-touch-zoom {
-ms-touch-action: pan-x pan-y;
touch-action: pan-x pan-y;
}
.leaflet-container.leaflet-touch-drag {
-ms-touch-action: pinch-zoom;
/* Fallback for FF which doesn't support pinch-zoom */
touch-action: none;
touch-action: pinch-zoom;
}
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
-ms-touch-action: none;
touch-action: none;
}
.leaflet-container {
-webkit-tap-highlight-color: transparent;
}
.leaflet-container a {
-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
}
.leaflet-tile {
filter: inherit;
visibility: hidden;
}
.leaflet-tile-loaded {
visibility: inherit;
}
.leaflet-zoom-box {
width: 0;
height: 0;
-moz-box-sizing: border-box;
box-sizing: border-box;
z-index: 800;
}
/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
.leaflet-overlay-pane svg {
-moz-user-select: none;
}
.leaflet-pane { z-index: 400; }
.leaflet-tile-pane { z-index: 200; }
.leaflet-overlay-pane { z-index: 400; }
.leaflet-shadow-pane { z-index: 500; }
.leaflet-marker-pane { z-index: 600; }
.leaflet-tooltip-pane { z-index: 650; }
.leaflet-popup-pane { z-index: 700; }
.leaflet-map-pane canvas { z-index: 100; }
.leaflet-map-pane svg { z-index: 200; }
.leaflet-vml-shape {
width: 1px;
height: 1px;
}
.lvml {
behavior: url(#default#VML);
display: inline-block;
position: absolute;
}
/* control positioning */
.leaflet-control {
position: relative;
z-index: 800;
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
.leaflet-top,
.leaflet-bottom {
position: absolute;
z-index: 1000;
pointer-events: none;
}
.leaflet-top {
top: 0;
}
.leaflet-right {
right: 0;
}
.leaflet-bottom {
bottom: 0;
}
.leaflet-left {
left: 0;
}
.leaflet-control {
float: left;
clear: both;
}
.leaflet-right .leaflet-control {
float: right;
}
.leaflet-top .leaflet-control {
margin-top: 10px;
}
.leaflet-bottom .leaflet-control {
margin-bottom: 10px;
}
.leaflet-left .leaflet-control {
margin-left: 10px;
}
.leaflet-right .leaflet-control {
margin-right: 10px;
}
/* zoom and fade animations */
.leaflet-fade-anim .leaflet-popup {
opacity: 0;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
opacity: 1;
}
.leaflet-zoom-animated {
-webkit-transform-origin: 0 0;
-ms-transform-origin: 0 0;
transform-origin: 0 0;
}
svg.leaflet-zoom-animated {
will-change: transform;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
-moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
transition: transform 0.25s cubic-bezier(0,0,0.25,1);
}
.leaflet-zoom-anim .leaflet-tile,
.leaflet-pan-anim .leaflet-tile {
-webkit-transition: none;
-moz-transition: none;
transition: none;
}
.leaflet-zoom-anim .leaflet-zoom-hide {
visibility: hidden;
}
/* cursors */
.leaflet-interactive {
cursor: pointer;
}
.leaflet-grab {
cursor: -webkit-grab;
cursor: -moz-grab;
cursor: grab;
}
.leaflet-crosshair,
.leaflet-crosshair .leaflet-interactive {
cursor: crosshair;
}
.leaflet-popup-pane,
.leaflet-control {
cursor: auto;
}
.leaflet-dragging .leaflet-grab,
.leaflet-dragging .leaflet-grab .leaflet-interactive,
.leaflet-dragging .leaflet-marker-draggable {
cursor: move;
cursor: -webkit-grabbing;
cursor: -moz-grabbing;
cursor: grabbing;
}
/* marker & overlays interactivity */
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-image-layer,
.leaflet-pane > svg path,
.leaflet-tile-container {
pointer-events: none;
}
.leaflet-marker-icon.leaflet-interactive,
.leaflet-image-layer.leaflet-interactive,
.leaflet-pane > svg path.leaflet-interactive,
svg.leaflet-image-layer.leaflet-interactive path {
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
/* visual tweaks */
.leaflet-container {
background: #ddd;
outline-offset: 1px;
}
.leaflet-container a {
color: #0078A8;
}
.leaflet-zoom-box {
border: 2px dotted #38f;
background: rgba(255,255,255,0.5);
}
/* general typography */
.leaflet-container {
font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
font-size: 12px;
font-size: 0.75rem;
line-height: 1.5;
}
/* general toolbar styles */
.leaflet-bar {
box-shadow: 0 1px 5px rgba(0,0,0,0.65);
border-radius: 4px;
}
.leaflet-bar a {
background-color: #fff;
border-bottom: 1px solid #ccc;
width: 26px;
height: 26px;
line-height: 26px;
display: block;
text-align: center;
text-decoration: none;
color: black;
}
.leaflet-bar a,
.leaflet-control-layers-toggle {
background-position: 50% 50%;
background-repeat: no-repeat;
display: block;
}
.leaflet-bar a:hover,
.leaflet-bar a:focus {
background-color: #f4f4f4;
}
.leaflet-bar a:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.leaflet-bar a:last-child {
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
border-bottom: none;
}
.leaflet-bar a.leaflet-disabled {
cursor: default;
background-color: #f4f4f4;
color: #bbb;
}
.leaflet-touch .leaflet-bar a {
width: 30px;
height: 30px;
line-height: 30px;
}
.leaflet-touch .leaflet-bar a:first-child {
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.leaflet-touch .leaflet-bar a:last-child {
border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px;
}
/* zoom control */
.leaflet-control-zoom-in,
.leaflet-control-zoom-out {
font: bold 18px 'Lucida Console', Monaco, monospace;
text-indent: 1px;
}
.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
font-size: 22px;
}
/* layers control */
.leaflet-control-layers {
box-shadow: 0 1px 5px rgba(0,0,0,0.4);
background: #fff;
border-radius: 5px;
}
.leaflet-control-layers-toggle {
background-image: url(images/layers.png);
width: 36px;
height: 36px;
}
.leaflet-retina .leaflet-control-layers-toggle {
background-image: url(images/layers-2x.png);
background-size: 26px 26px;
}
.leaflet-touch .leaflet-control-layers-toggle {
width: 44px;
height: 44px;
}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
display: none;
}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
display: block;
position: relative;
}
.leaflet-control-layers-expanded {
padding: 6px 10px 6px 6px;
color: #333;
background: #fff;
}
.leaflet-control-layers-scrollbar {
overflow-y: scroll;
overflow-x: hidden;
padding-right: 5px;
}
.leaflet-control-layers-selector {
margin-top: 2px;
position: relative;
top: 1px;
}
.leaflet-control-layers label {
display: block;
font-size: 13px;
font-size: 1.08333em;
}
.leaflet-control-layers-separator {
height: 0;
border-top: 1px solid #ddd;
margin: 5px -10px 5px -6px;
}
/* Default icon URLs */
.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */
background-image: url(images/marker-icon.png);
}
/* attribution and scale controls */
.leaflet-container .leaflet-control-attribution {
background: #fff;
background: rgba(255, 255, 255, 0.8);
margin: 0;
}
.leaflet-control-attribution,
.leaflet-control-scale-line {
padding: 0 5px;
color: #333;
line-height: 1.4;
}
.leaflet-control-attribution a {
text-decoration: none;
}
.leaflet-control-attribution a:hover,
.leaflet-control-attribution a:focus {
text-decoration: underline;
}
.leaflet-attribution-flag {
display: inline !important;
vertical-align: baseline !important;
width: 1em;
height: 0.6669em;
}
.leaflet-left .leaflet-control-scale {
margin-left: 5px;
}
.leaflet-bottom .leaflet-control-scale {
margin-bottom: 5px;
}
.leaflet-control-scale-line {
border: 2px solid #777;
border-top: none;
line-height: 1.1;
padding: 2px 5px 1px;
white-space: nowrap;
-moz-box-sizing: border-box;
box-sizing: border-box;
background: rgba(255, 255, 255, 0.8);
text-shadow: 1px 1px #fff;
}
.leaflet-control-scale-line:not(:first-child) {
border-top: 2px solid #777;
border-bottom: none;
margin-top: -2px;
}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
border-bottom: 2px solid #777;
}
.leaflet-touch .leaflet-control-attribution,
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
box-shadow: none;
}
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
border: 2px solid rgba(0,0,0,0.2);
background-clip: padding-box;
}
/* popup */
.leaflet-popup {
position: absolute;
text-align: center;
margin-bottom: 20px;
}
.leaflet-popup-content-wrapper {
padding: 1px;
text-align: left;
border-radius: 12px;
}
.leaflet-popup-content {
margin: 13px 24px 13px 20px;
line-height: 1.3;
font-size: 13px;
font-size: 1.08333em;
min-height: 1px;
}
.leaflet-popup-content p {
margin: 17px 0;
margin: 1.3em 0;
}
.leaflet-popup-tip-container {
width: 40px;
height: 20px;
position: absolute;
left: 50%;
margin-top: -1px;
margin-left: -20px;
overflow: hidden;
pointer-events: none;
}
.leaflet-popup-tip {
width: 17px;
height: 17px;
padding: 1px;
margin: -10px auto 0;
pointer-events: auto;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
}
.leaflet-popup-content-wrapper,
.leaflet-popup-tip {
background: white;
color: #333;
box-shadow: 0 3px 14px rgba(0,0,0,0.4);
}
.leaflet-container a.leaflet-popup-close-button {
position: absolute;
top: 0;
right: 0;
border: none;
text-align: center;
width: 24px;
height: 24px;
font: 16px/24px Tahoma, Verdana, sans-serif;
color: #757575;
text-decoration: none;
background: transparent;
}
.leaflet-container a.leaflet-popup-close-button:hover,
.leaflet-container a.leaflet-popup-close-button:focus {
color: #585858;
}
.leaflet-popup-scrolled {
overflow: auto;
}
.leaflet-oldie .leaflet-popup-content-wrapper {
-ms-zoom: 1;
}
.leaflet-oldie .leaflet-popup-tip {
width: 24px;
margin: 0 auto;
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
}
.leaflet-oldie .leaflet-control-zoom,
.leaflet-oldie .leaflet-control-layers,
.leaflet-oldie .leaflet-popup-content-wrapper,
.leaflet-oldie .leaflet-popup-tip {
border: 1px solid #999;
}
/* div icon */
.leaflet-div-icon {
background: #fff;
border: 1px solid #666;
}
/* Tooltip */
/* Base styles for the element that has a tooltip */
.leaflet-tooltip {
position: absolute;
padding: 6px;
background-color: #fff;
border: 1px solid #fff;
border-radius: 3px;
color: #222;
white-space: nowrap;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
pointer-events: none;
box-shadow: 0 1px 3px rgba(0,0,0,0.4);
}
.leaflet-tooltip.leaflet-interactive {
cursor: pointer;
pointer-events: auto;
}
.leaflet-tooltip-top:before,
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
position: absolute;
pointer-events: none;
border: 6px solid transparent;
background: transparent;
content: "";
}
/* Directions */
.leaflet-tooltip-bottom {
margin-top: 6px;
}
.leaflet-tooltip-top {
margin-top: -6px;
}
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-top:before {
left: 50%;
margin-left: -6px;
}
.leaflet-tooltip-top:before {
bottom: 0;
margin-bottom: -12px;
border-top-color: #fff;
}
.leaflet-tooltip-bottom:before {
top: 0;
margin-top: -12px;
margin-left: -6px;
border-bottom-color: #fff;
}
.leaflet-tooltip-left {
margin-left: -6px;
}
.leaflet-tooltip-right {
margin-left: 6px;
}
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
top: 50%;
margin-top: -6px;
}
.leaflet-tooltip-left:before {
right: 0;
margin-right: -12px;
border-left-color: #fff;
}
.leaflet-tooltip-right:before {
left: 0;
margin-left: -12px;
border-right-color: #fff;
}
/* Printing */
@media print {
/* Prevent printers from removing background-images of controls. */
.leaflet-control {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
}

10
libs/leaflet.draw.css vendored Normal file
View File

@ -0,0 +1,10 @@
.leaflet-draw-section{position:relative}.leaflet-draw-toolbar{margin-top:12px}.leaflet-draw-toolbar-top{margin-top:0}.leaflet-draw-toolbar-notop a:first-child{border-top-right-radius:0}.leaflet-draw-toolbar-nobottom a:last-child{border-bottom-right-radius:0}.leaflet-draw-toolbar a{background-image:url('images/spritesheet.png');background-image:linear-gradient(transparent,transparent),url('images/spritesheet.svg');background-repeat:no-repeat;background-size:300px 30px;background-clip:padding-box}.leaflet-retina .leaflet-draw-toolbar a{background-image:url('images/spritesheet-2x.png');background-image:linear-gradient(transparent,transparent),url('images/spritesheet.svg')}
.leaflet-draw a{display:block;text-align:center;text-decoration:none}.leaflet-draw a .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.leaflet-draw-actions{display:none;list-style:none;margin:0;padding:0;position:absolute;left:26px;top:0;white-space:nowrap}.leaflet-touch .leaflet-draw-actions{left:32px}.leaflet-right .leaflet-draw-actions{right:26px;left:auto}.leaflet-touch .leaflet-right .leaflet-draw-actions{right:32px;left:auto}.leaflet-draw-actions li{display:inline-block}
.leaflet-draw-actions li:first-child a{border-left:0}.leaflet-draw-actions li:last-child a{-webkit-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.leaflet-right .leaflet-draw-actions li:last-child a{-webkit-border-radius:0;border-radius:0}.leaflet-right .leaflet-draw-actions li:first-child a{-webkit-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.leaflet-draw-actions a{background-color:#919187;border-left:1px solid #AAA;color:#FFF;font:11px/19px "Helvetica Neue",Arial,Helvetica,sans-serif;line-height:28px;text-decoration:none;padding-left:10px;padding-right:10px;height:28px}
.leaflet-touch .leaflet-draw-actions a{font-size:12px;line-height:30px;height:30px}.leaflet-draw-actions-bottom{margin-top:0}.leaflet-draw-actions-top{margin-top:1px}.leaflet-draw-actions-top a,.leaflet-draw-actions-bottom a{height:27px;line-height:27px}.leaflet-draw-actions a:hover{background-color:#a0a098}.leaflet-draw-actions-top.leaflet-draw-actions-bottom a{height:26px;line-height:26px}.leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:-2px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline{background-position:0 -1px}
.leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-31px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon{background-position:-29px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-62px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle{background-position:-60px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-92px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle{background-position:-90px -1px}
.leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-122px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker{background-position:-120px -1px}.leaflet-draw-toolbar .leaflet-draw-draw-circlemarker{background-position:-273px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circlemarker{background-position:-271px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-152px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit{background-position:-150px -1px}
.leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-182px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove{background-position:-180px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-212px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled{background-position:-210px -1px}.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-242px -2px}.leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled{background-position:-240px -2px}
.leaflet-mouse-marker{background-color:#fff;cursor:crosshair}.leaflet-draw-tooltip{background:#363636;background:rgba(0,0,0,0.5);border:1px solid transparent;-webkit-border-radius:4px;border-radius:4px;color:#fff;font:12px/18px "Helvetica Neue",Arial,Helvetica,sans-serif;margin-left:20px;margin-top:-21px;padding:4px 8px;position:absolute;visibility:hidden;white-space:nowrap;z-index:6}.leaflet-draw-tooltip:before{border-right:6px solid black;border-right-color:rgba(0,0,0,0.5);border-top:6px solid transparent;border-bottom:6px solid transparent;content:"";position:absolute;top:7px;left:-7px}
.leaflet-error-draw-tooltip{background-color:#f2dede;border:1px solid #e6b6bd;color:#b94a48}.leaflet-error-draw-tooltip:before{border-right-color:#e6b6bd}.leaflet-draw-tooltip-single{margin-top:-12px}.leaflet-draw-tooltip-subtext{color:#f8d5e4}.leaflet-draw-guide-dash{font-size:1%;opacity:.6;position:absolute;width:5px;height:5px}.leaflet-edit-marker-selected{background-color:rgba(254,87,161,0.1);border:4px dashed rgba(254,87,161,0.6);-webkit-border-radius:4px;border-radius:4px;box-sizing:content-box}
.leaflet-edit-move{cursor:move}.leaflet-edit-resize{cursor:pointer}.leaflet-oldie .leaflet-draw-toolbar{border:1px solid #999}

10
libs/leaflet.draw.js Normal file

File diff suppressed because one or more lines are too long

6
libs/leaflet.js Normal file

File diff suppressed because one or more lines are too long

1
libs/proj4.js Normal file

File diff suppressed because one or more lines are too long

1
libs/shp.min.js vendored Normal file

File diff suppressed because one or more lines are too long

88
libs/turf.min.js vendored Normal file

File diff suppressed because one or more lines are too long

625
style.css Normal file
View File

@ -0,0 +1,625 @@
:root {
--primary-color: #00c8ff;
--primary-hover: #0099cc;
--bg-dark: #121212;
--panel-bg: rgba(30, 30, 30, 0.85);
--text-main: #f0f0f0;
--text-dim: #b0b0b0;
--border-color: rgba(255, 255, 255, 0.1);
--accent-glow: 0 0 15px rgba(0, 200, 255, 0.3);
--font-family: 'Inter', system-ui, -apple-system, sans-serif;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: var(--font-family);
background-color: var(--bg-dark);
color: var(--text-main);
overflow: hidden;
height: 100vh;
display: flex;
}
#map {
flex-grow: 1;
height: 100%;
z-index: 1;
}
/* Sidebar Styling */
.sidebar {
width: 260px;
height: 100%;
background: var(--panel-bg);
backdrop-filter: blur(12px);
border-right: 1px solid var(--border-color);
z-index: 100;
display: flex;
flex-direction: column;
box-shadow: 4px 0 15px rgba(0, 0, 0, 0.5);
}
.sidebar-header {
padding: 15px;
border-bottom: 1px solid var(--border-color);
}
.sidebar-header h1 {
font-size: 1.2rem;
font-weight: 700;
background: linear-gradient(135deg, #fff 0%, var(--primary-color) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.sidebar-content {
flex-grow: 1;
overflow-y: auto;
padding: 12px;
}
.section {
margin-bottom: 15px;
}
.section h2 {
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-dim);
margin-bottom: 8px;
}
/* Control Elements */
.control-group {
margin-bottom: 12px;
}
.control-group label {
display: block;
font-size: 0.8rem;
margin-bottom: 4px;
color: var(--text-main);
}
.input-styled {
width: 100%;
background: rgba(255, 255, 255, 0.05);
border: 1px solid var(--border-color);
padding: 6px 8px;
border-radius: 6px;
color: white;
font-size: 0.85rem;
transition: all 0.3s ease;
}
.input-styled option {
background: #1e1e1e;
color: white;
}
/* Compact number inputs */
.input-number {
width: 80px !important;
}
.input-styled:focus {
outline: none;
border-color: var(--primary-color);
box-shadow: var(--accent-glow);
}
.btn-primary {
width: 100%;
background: var(--primary-color);
color: #000;
border: none;
padding: 8px;
border-radius: 6px;
font-weight: 600;
font-size: 0.85rem;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
}
.btn-primary:hover {
background: var(--primary-hover);
transform: translateY(-1px);
}
.btn-secondary {
width: 100%;
background: transparent;
border: 1px solid var(--primary-color);
color: var(--primary-color);
padding: 6px;
border-radius: 6px;
font-weight: 500;
font-size: 0.8rem;
cursor: pointer;
transition: all 0.3s ease;
margin-top: 5px;
}
.btn-secondary:hover {
background: rgba(0, 200, 255, 0.1);
}
/* Variant Switcher */
.variant-tabs {
display: flex;
background: rgba(255, 255, 255, 0.05);
border-radius: 10px;
padding: 4px;
margin-bottom: 20px;
}
.variant-tab {
flex: 1;
text-align: center;
padding: 8px;
border-radius: 6px;
cursor: pointer;
font-size: 0.85rem;
transition: all 0.2s ease;
}
.variant-tab.active {
background: var(--primary-color);
color: #000;
font-weight: 600;
}
/* Legend */
.legend-item {
display: flex;
align-items: center;
gap: 10px;
font-size: 0.85rem;
margin-bottom: 8px;
color: var(--text-main);
}
.color-box {
width: 14px;
height: 14px;
border-radius: 3px;
display: inline-block;
}
/* WEA Labels */
.wea-label {
background: rgba(18, 18, 18, 0.8) !important;
backdrop-filter: blur(4px);
border: 1px solid var(--primary-color) !important;
color: white !important;
border-radius: 4px !important;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3) !important;
padding: 4px 8px !important;
}
.wea-label::before {
border-right-color: var(--primary-color) !important;
}
/* UI States */
.btn-secondary.active {
color: var(--primary-color) !important;
border-color: var(--primary-color) !important;
}
/* Disable interaction with other layers during turbine placement to allow clicking 'through' them */
#map.placement-active .leaflet-interactive:not(.turbine-icon-container, .turbine-icon-container *) {
pointer-events: none !important;
}
/* Floating Panels General */
.floating-panel {
position: absolute;
z-index: 1000;
background: var(--panel-bg);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border: 1px solid var(--border-color);
border-radius: 12px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
overflow: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.panel-header {
background: rgba(255, 255, 255, 0.05);
padding: 10px 15px;
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
border-bottom: 1px solid var(--border-color);
font-size: 0.85rem;
font-weight: 600;
}
.panel-content {
padding: 12px;
max-height: 300px;
overflow-y: auto;
}
/* Floating Legend Specific */
#floatingLegend {
bottom: 20px;
right: 20px;
width: 220px;
}
#floatingLegend.collapsed .panel-content {
display: none;
}
.toggle-btn {
background: transparent;
border: none;
color: var(--text-dim);
cursor: pointer;
font-size: 0.7rem;
transition: transform 0.3s;
}
.collapsed .toggle-btn {
transform: rotate(180deg);
}
/* Floating Edit Panel Tweak */
#editPanel {
position: absolute;
z-index: 2000;
display: none;
}
.edit-panel-content {
background: var(--panel-bg);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border: 1px solid var(--primary-color);
border-radius: 8px;
padding: 10px;
width: 210px;
/* Slimmer */
max-height: 85vh;
/* DON'T CUT OFF */
overflow-y: auto;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5), var(--accent-glow);
}
.edit-rows-container {
display: flex;
flex-direction: column;
gap: 4px;
}
.edit-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
margin-bottom: 2px;
}
.edit-row.separator {
margin-top: 12px;
border-top: 1px solid rgba(255, 255, 255, 0.1);
padding-top: 8px;
}
.edit-row label {
font-size: 0.75rem;
color: var(--text-dim);
margin: 0;
white-space: nowrap;
width: 65px;
text-align: left;
}
.edit-input {
flex: 1;
background: rgba(255, 255, 255, 0.1);
border: 1px solid var(--border-color);
padding: 4px 8px;
border-radius: 4px;
color: white;
font-size: 0.85rem;
text-align: left;
width: 100px;
}
.btn-primary-mini {
background: var(--primary-color);
color: #000;
border: none;
padding: 10px;
border-radius: 6px;
font-weight: 700;
font-size: 0.85rem;
cursor: pointer;
transition: all 0.2s;
margin-top: 8px;
}
.btn-danger-mini {
background: rgba(255, 68, 68, 0.1);
border: 1px solid #ff4444;
color: #ff4444;
padding: 8px;
border-radius: 6px;
font-size: 0.8rem;
cursor: pointer;
transition: all 0.2s;
}
/* Scrollbar styling */
::-webkit-scrollbar {
width: 6px;
}
.leaflet-control-layers {
background: var(--panel-bg) !important;
backdrop-filter: blur(12px);
border: 1px solid var(--border-color) !important;
color: white !important;
border-radius: 12px !important;
padding: 10px !important;
}
/* Proximity Tooltips - Compact & Integrated */
.proximity-tooltip {
background: rgba(255, 136, 0, 0.8) !important;
border: 1px solid rgba(255, 255, 255, 0.5) !important;
color: #000 !important;
font-weight: 700 !important;
font-size: 0.7rem !important;
border-radius: 3px !important;
padding: 1px 4px !important;
pointer-events: none !important;
box-shadow: none !important;
}
.proximity-tooltip::before {
display: none !important;
}
.proximity-tooltip-red {
background: rgba(220, 0, 0, 0.8) !important;
border: 1px solid rgba(255, 255, 255, 0.5) !important;
color: #fff !important;
font-weight: 700 !important;
font-size: 0.7rem !important;
border-radius: 3px !important;
padding: 1px 4px !important;
pointer-events: none !important;
box-shadow: none !important;
}
.proximity-tooltip-red::before {
display: none !important;
}
.proximity-tooltip-yellow {
background: rgba(204, 180, 0, 0.8) !important;
border: 1px solid rgba(255, 255, 255, 0.5) !important;
color: #000 !important;
font-weight: 700 !important;
font-size: 0.7rem !important;
border-radius: 3px !important;
padding: 1px 4px !important;
pointer-events: none !important;
box-shadow: none !important;
}
.proximity-tooltip-yellow::before {
display: none !important;
}
.proximity-tooltip-violet {
background: rgba(148, 0, 211, 0.8) !important;
border: 1px solid rgba(255, 255, 255, 0.5) !important;
color: #fff !important;
font-weight: 700 !important;
font-size: 0.7rem !important;
border-radius: 3px !important;
padding: 1px 4px !important;
pointer-events: none !important;
box-shadow: none !important;
}
.proximity-tooltip-violet::before {
display: none !important;
}
/* Custom Turbine Symbol (Professional SVG) */
.turbine-icon-container {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
transition: transform 0.2s ease;
}
.turbine-icon-container svg {
filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.5));
width: 100%;
height: 100%;
}
.turbine-icon-container:hover {
transform: scale(1.15);
cursor: grab;
}
.turbine-icon-container:active {
cursor: grabbing;
}
/* Modal System */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.75);
backdrop-filter: blur(8px);
display: flex;
align-items: center;
justify-content: center;
z-index: 2000;
}
.modal-content {
background: var(--panel-bg);
border: 1px solid var(--border-color);
border-radius: 16px;
width: 800px;
max-width: 90%;
max-height: 85vh;
display: flex;
flex-direction: column;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.6);
overflow: hidden;
/* Contain children and scrollbars */
}
.modal-header {
padding: 20px;
border-bottom: 1px solid var(--border-color);
display: flex;
justify-content: space-between;
align-items: center;
}
.modal-header h2 {
font-size: 1.3rem;
color: var(--primary-color);
}
.modal-close {
background: transparent;
border: none;
color: var(--text-dim);
font-size: 1.5rem;
cursor: pointer;
transition: color 0.2s;
}
.modal-close:hover {
color: white;
}
/* Owner Table & Mapping Scrollability */
#ownerListSection {
display: none;
/* Controlled by JS */
flex-direction: column;
overflow: hidden;
flex-grow: 1;
min-height: 0;
/* Critical for flex scrolling */
}
.owner-table-container,
#ownerMappingSection {
padding: 0;
overflow-y: auto;
flex-grow: 1;
}
#ownerMappingSection {
display: none;
/* Controlled by JS */
flex-direction: column;
align-items: center;
padding: 20px;
min-height: 0;
/* Critical for flex scrolling */
}
#ownerTable {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;
}
#ownerTable th {
text-align: left;
padding: 12px 15px;
background: rgba(255, 255, 255, 0.03);
color: var(--text-dim);
text-transform: uppercase;
font-size: 0.75rem;
letter-spacing: 0.5px;
border-bottom: 1px solid var(--border-color);
}
#ownerTable td {
padding: 8px 15px;
border-bottom: 1px solid var(--border-color);
}
#ownerTable tr:hover {
background: rgba(255, 255, 255, 0.02);
}
/* Status Selector */
.status-select {
padding: 5px 8px;
border-radius: 6px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid var(--border-color);
color: white;
font-size: 0.8rem;
cursor: pointer;
width: 100%;
}
/* Status Indicators (UI & Legend) */
.status-gbr {
color: #2ecc71;
}
/* Green */
.status-external {
color: #e74c3c;
}
/* Red */
.status-declined {
color: #f1c40f;
}
/* Yellow */
.status-positive {
color: #5efd9c;
}
/* Light Green */
.status-undecided {
color: #95a5a6;
}
/* Grey */
/* Selection specific styles */
select.status-select option {
background: #1e1e1e;
color: white;
}