feat: add internship report

This commit is contained in:
2026-05-29 22:57:41 +02:00
parent 2b35fb7a4b
commit a2543e7ede
84 changed files with 34732 additions and 270 deletions
+1
View File
@@ -3,3 +3,4 @@
*.xyz *.xyz
venv/ venv/
.ipynb_* .ipynb_*
2026_Internship/data/*.geojson
Regular → Executable
+10 -2
View File
@@ -1,11 +1,19 @@
import geopandas as gpd import geopandas as gpd
import pandas as pd import pandas as pd
import argparse
df = pd.read_csv("data/solaranlagen.csv") def main(input, output):
df = pd.read_csv(input)
gdf = gpd.GeoDataFrame( gdf = gpd.GeoDataFrame(
df, df,
geometry=gpd.GeoSeries.from_wkt(df["WKT"]), geometry=gpd.GeoSeries.from_wkt(df["WKT"]),
crs="EPSG:4326" crs="EPSG:4326"
) )
gdf.to_file(output, driver="GeoJSON")
gdf.to_file("data/solaranlagen.geojson", driver="GeoJSON") if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--input")
parser.add_argument("--output")
args = parser.parse_args()
main(args.input, args.ouput)
+16281
View File
File diff suppressed because it is too large Load Diff
+16281
View File
File diff suppressed because it is too large Load Diff
View File
View File
+1123
View File
File diff suppressed because it is too large Load Diff
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
View File
View File
View File
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
View File
+81
View File
@@ -0,0 +1,81 @@
<mxfile host="Electron">
<diagram name="Page-1" id="oOCbWoU86tpWQZzyfC9d">
<mxGraphModel dx="1542" dy="948" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="BF3zpTlwGHYlO4xGZPeB-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" value="" vertex="1">
<mxGeometry height="540" width="420" x="210" y="150" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-12" edge="1" parent="1" source="TwiOutnGLNuovhnggT5G-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" target="TwiOutnGLNuovhnggT5G-11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-29" connectable="0" parent="TwiOutnGLNuovhnggT5G-12" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Bulk download" vertex="1">
<mxGeometry relative="1" x="-0.2759" as="geometry">
<mxPoint x="5" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-7" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="Marktstammdatenregister" vertex="1">
<mxGeometry height="80" width="180" x="250" y="200" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-16" edge="1" parent="1" source="TwiOutnGLNuovhnggT5G-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="TwiOutnGLNuovhnggT5G-11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-38" connectable="0" parent="TwiOutnGLNuovhnggT5G-16" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="REST API" vertex="1">
<mxGeometry relative="1" x="-0.5261" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-8" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="Assets" vertex="1">
<mxGeometry height="80" width="60" x="490" y="200" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-22" edge="1" parent="1" source="TwiOutnGLNuovhnggT5G-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="TwiOutnGLNuovhnggT5G-11">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="520" y="610" />
<mxPoint x="520" y="370" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-33" connectable="0" parent="TwiOutnGLNuovhnggT5G-22" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;span style=&quot;color: rgba(0, 0, 0, 0); font-family: monospace; font-size: 0px; text-align: start; background-color: rgb(236, 236, 236);&quot;&gt;%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20connectable%3D%220%22%20parent%3D%221%22%20style%3D%22edgeLabel%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3B%22%20value%3D%22SQL%20q%26lt%3Bspan%20style%3D%26quot%3Bbackground-color%3A%20light-dark(%23ffffff%2C%20var(--ge-dark-color%2C%20%23121212))%3B%20color%3A%20light-dark(rgb(0%2C%200%2C%200)%2C%20rgb(255%2C%20255%2C%20255))%3B%26quot%3B%26gt%3Bueries%26lt%3B%2Fspan%26gt%3B%22%20vertex%3D%221%22%3E%3CmxGeometry%20x%3D%22450%22%20y%3D%22295.8620689655172%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E&lt;/span&gt;" vertex="1">
<mxGeometry relative="1" x="0.037" y="-1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-39" connectable="0" parent="TwiOutnGLNuovhnggT5G-22" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="SQL q&lt;span style=&quot;color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;ueries&lt;/span&gt;" vertex="1">
<mxGeometry relative="1" x="0.0684" y="-2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-9" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="GDB" vertex="1">
<mxGeometry height="80" width="60" x="400" y="570" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-10" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;GDB&lt;/span&gt;&lt;div&gt;(Stage)&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="60" x="400" y="450" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-11" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Runtime Server" vertex="1">
<mxGeometry height="80" width="80" x="390" y="330" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-19" edge="1" parent="1" source="TwiOutnGLNuovhnggT5G-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" target="TwiOutnGLNuovhnggT5G-10">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-36" connectable="0" parent="TwiOutnGLNuovhnggT5G-19" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="SQL q&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;ueries&lt;/span&gt;" vertex="1">
<mxGeometry relative="1" x="-0.2103" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-21" edge="1" parent="1" source="TwiOutnGLNuovhnggT5G-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" target="TwiOutnGLNuovhnggT5G-9">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-35" connectable="0" parent="TwiOutnGLNuovhnggT5G-21" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Foreign table" vertex="1">
<mxGeometry relative="1" x="-0.1759" y="1" as="geometry">
<mxPoint x="-1" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="BF3zpTlwGHYlO4xGZPeB-3" parent="1" style="shape=mxgraph.basic.arc;html=1;startAngle=0.3;endAngle=0.1;endArrow=classic;endFill=1;" value="Cron-Daemon" vertex="1">
<mxGeometry height="100" width="100" x="600" y="80" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
+81
View File
@@ -0,0 +1,81 @@
<mxfile host="Electron">
<diagram name="Page-1" id="oOCbWoU86tpWQZzyfC9d">
<mxGraphModel dx="731" dy="632" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="BF3zpTlwGHYlO4xGZPeB-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" value="" vertex="1">
<mxGeometry height="510" width="400" x="230" y="150" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-12" edge="1" parent="1" source="TwiOutnGLNuovhnggT5G-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" target="TwiOutnGLNuovhnggT5G-11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-29" connectable="0" parent="TwiOutnGLNuovhnggT5G-12" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;font style=&quot;font-size: 15px;&quot;&gt;Bulk download&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="-0.2759" as="geometry">
<mxPoint x="5" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-7" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontSize=15;" value="Marktstammdatenregister" vertex="1">
<mxGeometry height="80" width="180" x="250" y="200" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-16" edge="1" parent="1" source="TwiOutnGLNuovhnggT5G-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="TwiOutnGLNuovhnggT5G-11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-38" connectable="0" parent="TwiOutnGLNuovhnggT5G-16" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;font style=&quot;font-size: 15px;&quot;&gt;REST API&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="-0.5261" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-8" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontSize=15;" value="Assets" vertex="1">
<mxGeometry height="80" width="60" x="490" y="200" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-22" edge="1" parent="1" source="TwiOutnGLNuovhnggT5G-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="TwiOutnGLNuovhnggT5G-11">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="520" y="610" />
<mxPoint x="520" y="370" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-33" connectable="0" parent="TwiOutnGLNuovhnggT5G-22" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;span style=&quot;color: rgba(0, 0, 0, 0); font-family: monospace; font-size: 0px; text-align: start; background-color: rgb(236, 236, 236);&quot;&gt;%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20connectable%3D%220%22%20parent%3D%221%22%20style%3D%22edgeLabel%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3Bresizable%3D0%3Bpoints%3D%5B%5D%3B%22%20value%3D%22SQL%20q%26lt%3Bspan%20style%3D%26quot%3Bbackground-color%3A%20light-dark(%23ffffff%2C%20var(--ge-dark-color%2C%20%23121212))%3B%20color%3A%20light-dark(rgb(0%2C%200%2C%200)%2C%20rgb(255%2C%20255%2C%20255))%3B%26quot%3B%26gt%3Bueries%26lt%3B%2Fspan%26gt%3B%22%20vertex%3D%221%22%3E%3CmxGeometry%20x%3D%22450%22%20y%3D%22295.8620689655172%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E&lt;/span&gt;" vertex="1">
<mxGeometry relative="1" x="0.037" y="-1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-39" connectable="0" parent="TwiOutnGLNuovhnggT5G-22" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;font style=&quot;font-size: 15px;&quot;&gt;SQL q&lt;span style=&quot;color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;ueries&lt;/span&gt;&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="0.0684" y="-2" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-9" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="&lt;font style=&quot;font-size: 15px;&quot;&gt;GDB&lt;/font&gt;" vertex="1">
<mxGeometry height="80" width="60" x="400" y="570" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-10" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;&lt;font style=&quot;font-size: 15px;&quot;&gt;GDB&lt;/font&gt;&lt;/span&gt;&lt;div&gt;&lt;font style=&quot;font-size: 15px;&quot;&gt;(Stage)&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="60" x="400" y="450" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-11" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="&lt;font style=&quot;font-size: 15px;&quot;&gt;Runtime Server&lt;/font&gt;" vertex="1">
<mxGeometry height="80" width="80" x="390" y="330" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-19" edge="1" parent="1" source="TwiOutnGLNuovhnggT5G-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" target="TwiOutnGLNuovhnggT5G-10">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-36" connectable="0" parent="TwiOutnGLNuovhnggT5G-19" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;font style=&quot;font-size: 15px;&quot;&gt;SQL q&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;ueries&lt;/span&gt;&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="-0.2103" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-21" edge="1" parent="1" source="TwiOutnGLNuovhnggT5G-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" target="TwiOutnGLNuovhnggT5G-9">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="TwiOutnGLNuovhnggT5G-35" connectable="0" parent="TwiOutnGLNuovhnggT5G-21" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;font style=&quot;font-size: 15px;&quot;&gt;Foreign table&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="-0.1759" y="1" as="geometry">
<mxPoint x="-1" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="BF3zpTlwGHYlO4xGZPeB-3" parent="1" style="shape=mxgraph.basic.arc;html=1;startAngle=0.3;endAngle=0.1;endArrow=classic;endFill=1;" value="&lt;font style=&quot;font-size: 15px;&quot;&gt;Cron-Daemon&lt;/font&gt;" vertex="1">
<mxGeometry height="100" width="100" x="600" y="80" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 137 KiB

View File

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

View File

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

+59
View File
@@ -0,0 +1,59 @@
<mxfile host="Electron">
<diagram name="Page-1" id="KcjqhKvhVEtI8t-92g-l">
<mxGraphModel dx="1542" dy="948" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="bfoCak_XsD50kcJhAttg-22" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="" vertex="1">
<mxGeometry height="197.5" width="510" x="135" y="352.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-13" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="bfoCak_XsD50kcJhAttg-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-16" connectable="0" parent="bfoCak_XsD50kcJhAttg-13" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Extraction" vertex="1">
<mxGeometry relative="1" x="0.0125" y="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-4" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="&lt;div&gt;&lt;div&gt;Source Data&lt;/div&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="110" x="155" y="387.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-6" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-11" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" target="bfoCak_XsD50kcJhAttg-4" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="190" y="582.75" as="sourcePoint" />
<mxPoint x="515" y="402.75" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-11" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Updates" vertex="1">
<mxGeometry height="30" width="60" x="180" y="512.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-12" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Transformation" vertex="1">
<mxGeometry height="97.5" width="97.5" x="365" y="379" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-17" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-12" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" target="bfoCak_XsD50kcJhAttg-19" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="465" y="452.75" as="sourcePoint" />
<mxPoint x="625" y="427.75" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-18" connectable="0" parent="bfoCak_XsD50kcJhAttg-17" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Loading" vertex="1">
<mxGeometry relative="1" x="0.0308" as="geometry">
<mxPoint x="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-19" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="Destination&lt;div&gt;Database&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="80" x="535" y="387.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-23" parent="1" style="shape=mxgraph.basic.arc;html=1;startAngle=0.3;endAngle=0.1;endArrow=classic;endFill=1;" value="" vertex="1">
<mxGeometry height="50" width="50" x="615" y="329" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-24" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Periodically" vertex="1">
<mxGeometry height="30" width="60" x="655" y="329" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-25" parent="1" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.gear;" value="" vertex="1">
<mxGeometry height="30" width="30" x="398.75" y="437.75" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 72 KiB

+62
View File
@@ -0,0 +1,62 @@
<mxfile host="Electron">
<diagram name="Page-1" id="KcjqhKvhVEtI8t-92g-l">
<mxGraphModel dx="1542" dy="948" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="bfoCak_XsD50kcJhAttg-22" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="" vertex="1">
<mxGeometry height="197.5" width="510" x="135" y="352.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-13" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="bfoCak_XsD50kcJhAttg-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-16" connectable="0" parent="bfoCak_XsD50kcJhAttg-13" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Extraction" vertex="1">
<mxGeometry relative="1" x="0.0125" y="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-4" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="&lt;div&gt;&lt;div&gt;Source Data&lt;/div&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="110" x="155" y="387.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-6" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-11" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" target="bfoCak_XsD50kcJhAttg-4" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="190" y="582.75" as="sourcePoint" />
<mxPoint x="515" y="402.75" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-11" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Updates" vertex="1">
<mxGeometry height="30" width="60" x="180" y="512.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-12" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Transformation" vertex="1">
<mxGeometry height="97.5" width="97.5" x="365" y="379" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-17" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-12" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" target="bfoCak_XsD50kcJhAttg-19" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="465" y="452.75" as="sourcePoint" />
<mxPoint x="625" y="427.75" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-18" connectable="0" parent="bfoCak_XsD50kcJhAttg-17" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Loading" vertex="1">
<mxGeometry relative="1" x="0.0308" as="geometry">
<mxPoint x="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-19" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="Destination&lt;div&gt;Database&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="80" x="535" y="387.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-23" parent="1" style="shape=mxgraph.basic.arc;html=1;startAngle=0.3;endAngle=0.1;endArrow=classic;endFill=1;" value="" vertex="1">
<mxGeometry height="50" width="50" x="615" y="329" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-24" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Periodically" vertex="1">
<mxGeometry height="30" width="60" x="655" y="329" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-25" parent="1" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.gear;" value="" vertex="1">
<mxGeometry height="30" width="30" x="398.75" y="437.75" as="geometry" />
</mxCell>
<mxCell id="DoDepfaf5ksZ99gq32u4-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;strokeColor=#004682;strokeWidth=4;" value="" vertex="1">
<mxGeometry height="170" width="225" x="145" y="370" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 72 KiB

+62
View File
@@ -0,0 +1,62 @@
<mxfile host="Electron">
<diagram name="Page-1" id="KcjqhKvhVEtI8t-92g-l">
<mxGraphModel dx="1542" dy="948" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="bfoCak_XsD50kcJhAttg-22" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="" vertex="1">
<mxGeometry height="197.5" width="510" x="135" y="352.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-13" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="bfoCak_XsD50kcJhAttg-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-16" connectable="0" parent="bfoCak_XsD50kcJhAttg-13" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Extraction" vertex="1">
<mxGeometry relative="1" x="0.0125" y="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-4" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="&lt;div&gt;&lt;div&gt;Source Data&lt;/div&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="110" x="155" y="387.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-6" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-11" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" target="bfoCak_XsD50kcJhAttg-4" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="190" y="582.75" as="sourcePoint" />
<mxPoint x="515" y="402.75" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-11" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Updates" vertex="1">
<mxGeometry height="30" width="60" x="180" y="512.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-12" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Transformation" vertex="1">
<mxGeometry height="97.5" width="97.5" x="365" y="379" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-17" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-12" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" target="bfoCak_XsD50kcJhAttg-19" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="465" y="452.75" as="sourcePoint" />
<mxPoint x="625" y="427.75" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-18" connectable="0" parent="bfoCak_XsD50kcJhAttg-17" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Loading" vertex="1">
<mxGeometry relative="1" x="0.0308" as="geometry">
<mxPoint x="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-19" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="Destination&lt;div&gt;Database&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="80" x="535" y="387.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-23" parent="1" style="shape=mxgraph.basic.arc;html=1;startAngle=0.3;endAngle=0.1;endArrow=classic;endFill=1;" value="" vertex="1">
<mxGeometry height="50" width="50" x="615" y="329" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-24" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Periodically" vertex="1">
<mxGeometry height="30" width="60" x="655" y="329" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-25" parent="1" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.gear;" value="" vertex="1">
<mxGeometry height="30" width="30" x="398.75" y="437.75" as="geometry" />
</mxCell>
<mxCell id="DoDepfaf5ksZ99gq32u4-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;strokeColor=#004682;strokeWidth=4;" value="" vertex="1">
<mxGeometry height="110" width="160" x="470" y="372.75" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 72 KiB

+62
View File
@@ -0,0 +1,62 @@
<mxfile host="Electron">
<diagram name="Page-1" id="KcjqhKvhVEtI8t-92g-l">
<mxGraphModel dx="1542" dy="948" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="bfoCak_XsD50kcJhAttg-22" parent="1" style="rounded=0;whiteSpace=wrap;html=1;" value="" vertex="1">
<mxGeometry height="197.5" width="510" x="135" y="352.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-13" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="bfoCak_XsD50kcJhAttg-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-16" connectable="0" parent="bfoCak_XsD50kcJhAttg-13" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Extraction" vertex="1">
<mxGeometry relative="1" x="0.0125" y="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-4" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="&lt;div&gt;&lt;div&gt;Source Data&lt;/div&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="110" x="155" y="387.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-6" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-11" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" target="bfoCak_XsD50kcJhAttg-4" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="190" y="582.75" as="sourcePoint" />
<mxPoint x="515" y="402.75" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-11" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Updates" vertex="1">
<mxGeometry height="30" width="60" x="180" y="512.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-12" parent="1" style="whiteSpace=wrap;html=1;aspect=fixed;" value="Transformation" vertex="1">
<mxGeometry height="97.5" width="97.5" x="365" y="379" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-17" edge="1" parent="1" source="bfoCak_XsD50kcJhAttg-12" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" target="bfoCak_XsD50kcJhAttg-19" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="465" y="452.75" as="sourcePoint" />
<mxPoint x="625" y="427.75" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-18" connectable="0" parent="bfoCak_XsD50kcJhAttg-17" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Loading" vertex="1">
<mxGeometry relative="1" x="0.0308" as="geometry">
<mxPoint x="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-19" parent="1" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" value="Destination&lt;div&gt;Database&lt;/div&gt;" vertex="1">
<mxGeometry height="80" width="80" x="535" y="387.75" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-23" parent="1" style="shape=mxgraph.basic.arc;html=1;startAngle=0.3;endAngle=0.1;endArrow=classic;endFill=1;" value="" vertex="1">
<mxGeometry height="50" width="50" x="615" y="329" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-24" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Periodically" vertex="1">
<mxGeometry height="30" width="60" x="655" y="329" as="geometry" />
</mxCell>
<mxCell id="bfoCak_XsD50kcJhAttg-25" parent="1" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.gear;" value="" vertex="1">
<mxGeometry height="30" width="30" x="398.75" y="437.75" as="geometry" />
</mxCell>
<mxCell id="DoDepfaf5ksZ99gq32u4-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;strokeColor=#004682;strokeWidth=4;" value="" vertex="1">
<mxGeometry height="110" width="110" x="358.75" y="372.75" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 72 KiB

View File

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

Regular → Executable
View File

Before

Width:  |  Height:  |  Size: 4.1 MiB

After

Width:  |  Height:  |  Size: 4.1 MiB

Regular → Executable
View File

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 119 KiB

Regular → Executable
View File

Before

Width:  |  Height:  |  Size: 216 KiB

After

Width:  |  Height:  |  Size: 216 KiB

View File

Before

Width:  |  Height:  |  Size: 402 KiB

After

Width:  |  Height:  |  Size: 402 KiB

+54
View File
@@ -0,0 +1,54 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Battery Map</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<style>
html, body, #map {
margin: 0;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="map"></div>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script>
const germanyBounds = [
[47, 5],
[55, 16]
];
const map = L.map('map', {
zoomControl: false
});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '&copy; OpenStreetMap contributors'
}).addTo(map);
fetch('../data/speicher.geojson')
.then(res => res.json())
.then(data => {
L.geoJSON(data, {
pointToLayer: function (feature, latlng) {
return L.circleMarker(latlng, {
radius: 1,
color: '#004682',
weight: 1,
opacity: 1,
fillOpacity: 1
});
}
}).addTo(map);
map.fitBounds(germanyBounds, { padding: [20, 20] });
})
.catch(err => console.error("Failed to load GeoJSON:", err));
</script>
</body>
</html>
+54
View File
@@ -0,0 +1,54 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Solar Map</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<style>
html, body, #map {
margin: 0;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="map"></div>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script>
const germanyBounds = [
[47, 5],
[55, 16]
];
const map = L.map('map', {
zoomControl: false
});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '&copy; OpenStreetMap contributors'
}).addTo(map);
fetch('../data/solar.geojson')
.then(res => res.json())
.then(data => {
L.geoJSON(data, {
pointToLayer: function (feature, latlng) {
return L.circleMarker(latlng, {
radius: 1,
color: '#004682',
weight: 1,
opacity: 1,
fillOpacity: 1
});
}
}).addTo(map);
map.fitBounds(germanyBounds, { padding: [20, 20] });
})
.catch(err => console.error("Failed to load GeoJSON:", err));
</script>
</body>
</html>
+54
View File
@@ -0,0 +1,54 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Solar Map</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<style>
html, body, #map {
margin: 0;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="map"></div>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script>
const germanyBounds = [
[47, 5],
[55, 16]
];
const map = L.map('map', {
zoomControl: false
});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '&copy; OpenStreetMap contributors'
}).addTo(map);
fetch('../data/solaranlagen.geojson')
.then(res => res.json())
.then(data => {
L.geoJSON(data, {
pointToLayer: function (feature, latlng) {
return L.circleMarker(latlng, {
radius: 1,
color: '#004682',
weight: 1,
opacity: 1,
fillOpacity: 1
});
}
}).addTo(map);
map.fitBounds(germanyBounds, { padding: [20, 20] });
})
.catch(err => console.error("Failed to load GeoJSON:", err));
</script>
</body>
</html>
+54
View File
@@ -0,0 +1,54 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Wind Map</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<style>
html, body, #map {
margin: 0;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="map"></div>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script>
const germanyBounds = [
[47, 5],
[55, 16]
];
const map = L.map('map', {
zoomControl: false
});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '&copy; OpenStreetMap contributors'
}).addTo(map);
fetch('../data/wind.geojson')
.then(res => res.json())
.then(data => {
L.geoJSON(data, {
pointToLayer: function (feature, latlng) {
return L.circleMarker(latlng, {
radius: 1,
color: '#004682',
weight: 1,
opacity: 1,
fillOpacity: 1
});
}
}).addTo(map);
map.fitBounds(germanyBounds, { padding: [20, 20] });
})
.catch(err => console.error("Failed to load GeoJSON:", err));
</script>
</body>
</html>
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
Regular → Executable
+272 -147
View File
@@ -8,13 +8,53 @@
<link rel="stylesheet" href="dist/reveal.css"> <link rel="stylesheet" href="dist/reveal.css">
<link rel="stylesheet" href="dist/theme/white.css"> <link rel="stylesheet" href="dist/theme/white.css">
<link rel="stylesheet" href="plugin/highlight/monokai.css"> <link rel="stylesheet" href="plugin/highlight/monokai.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<style> <style>
.reveal h3 { font-size: 32px;} .presentation-footer {
th, td { font-size:24px; } position: fixed;
li{ font-size: 28px; } bottom: 12px;
#map { width: 100%; height: 480px; } left: 0;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 16px;
box-sizing: border-box;
font-size: 24px;
color: #004682;
z-index: 1000;
pointer-events: none;
font-family: sans-serif;
}
.hljs {
font-family: monospace !important;
}
.reveal h3 {
font-size: 32px;
}
th, td {
font-size:24px;
}
li {
font-size: 28px;
}
cite { cite {
font-style: normal;
font-size: 0.5em;
color: #6b7280;
background: #f3f4f6;
padding: 0.05em 0.25em;
border-radius: 0.25em;
margin-left: 0.15em;
white-space: nowrap;
}
.inline_cite {
display: inline;
font-style: normal; font-style: normal;
font-size: 0.5em; font-size: 0.5em;
color: #6b7280; color: #6b7280;
@@ -34,24 +74,23 @@
font-size: 24px; font-size: 24px;
background: none; background: none;
color: #004682; color: #004682;
padding: 0 16px;
} }
</style> </style>
</head> </head>
<body> <body>
<div class="reveal"> <div class="reveal">
<div class="slides"> <div class="slides">
<section data-background-image="images/solarparc.jpg" data-background-opacity="0.40"> <section data-background-image="images/solarparc.jpg" data-background-opacity="0.40"><h3>Building Pipelines for the Solar Industry</h3>
<h3>Building Geodata-Pipelines for the Solar Industry</h3>
<p>Internship Report</p> <p>Internship Report</p>
<hr> <hr>
<small>Joaquin Gottlebe</small> <small>Joaquin Gottlebe</small>
<small>24.04.2026</small> <small class="date"></small>
<br> <br>
<img src="https://www.enerparc.de/img/static/logo_enerparc.png" width="200px"></img> <img src="https://www.enerparc.de/img/static/logo_enerparc.png" width="200px"></img>
</section> </section>
<section > <section><h3>Geographic Information (Geodata)</h3>
<h3>Basics: Geographic Information (Geodata)</h3>
<div class="r-stack"> <div class="r-stack">
<img class="fragment fade-out r-stretch" src="images/geodata_features.png"></img> <img class="fragment fade-out r-stretch" src="images/geodata_features.png"></img>
@@ -105,116 +144,253 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<p><cite>Minn, Michael. Visualizing Terrain in ArcGIS Pro. https://michaelminn.net/tutorials/arcgis-pro-terrain/</cite></p> <p><b>Definition: </b>[...] Information about locations on or near the surface of the Earth [...]"</p>
<p>Data and information which has an <b>association with a location relative to Earth</b></p> <p><cite>michaelminn.net/tutorials/arcgis-pro-terrain/</cite> <cite>Liu & Özsu, 2009: Encyclopedia of Database Systems</cite></p>
</section> </section>
<section> <section><h3>Basics: Spatial Operations</h3>
<h3>Basics: Geographic Information Systems (GIS)</h3> <img src="https://geopandas.org/en/stable/_images/overlay_operations.png" ></img>
<p><b>Definition: </b>(Spatial) operations refer to the operations that an end user
performs on maps stored in a database.</p>
<p><cite>geopandas.org</cite> <cite>Liu & Özsu, 2009: Encyclopedia of Database Systems</cite></p>
</section>
<section><h3>Basics: Geographic Information Systems (GIS)</h3>
<img src="images/qgis.png" class="r-stretch"></img> <img src="images/qgis.png" class="r-stretch"></img>
<p>Consists of integrated computer hardware and software that <b>store, manage, analyze, edit, output, and visualize geographic data.</b></p> <p><b>Definition: </b>"[...] is a computer application designed to perform a wide range of operations on geographic information. [...] A GIS includes functions to input, store, visualize, export, and analyze (geographic) information."</p>
<p><cite>©OpenStreetMap contributors</cite></p> <p><cite>©OpenStreetMap contributors</cite> <cite>Liu & Özsu, 2009: Encyclopedia of Database Systems</cite></p>
</section> </section>
<section> <section><h3>Internship Overview</h3>
<h3>Internship Overview</h3> <p><b>Company: </b>Enerparc AG</p>
<p class="fragment">Company: <b>Enerparc AG</b></p> <p><b>Industry domain: </b>Solar industry</p>
<p class="fragment">Industry domain: <b>Solar industry</b></p> <p><b>Duration: </b>360 hours over 4 months</p>
<p class="fragment">Duration: <b>360 hours over 4 months</b></p> <p><b>Role: </b>GIS Developer</p>
<p class="fragment">Role: <b>GIS Developer</b></p>
</section> </section>
<section> <section><h3>My Background</h3>
<h3>My Background</h3> <p><b>Bachelor in Geography: </b>Specialised in Remote Sensing and Geographic Information Systems and had 4 years of experience tutoring RS/GIS</p>
<p class="fragment">Bachelor in <b>Geography</b></p> <p><b>Master in Computational Science: </b>Currently pursuing, in my 4th semester</p>
<p class="fragment">Specialised in <b>Remote Sensing</b> and <b>Geographic Information Systems</b></p>
<p class="fragment"><b>4</b> years of experience in <b>tutoring</b> RS/GIS</p>
<p class="fragment">Currently pursuing Master in <b>Computational Science</b></p>
</section> </section>
<section> <section><h3>Why Enerparc</h3>
<h3>Motivation</h3> <p>First industry <b>experience</b></p>
<p class="fragment">First industry <b>experience</b></p> <p>How is the dev experience in a <b>non-tech company</b>?</p>
<p class="fragment">How to handle <b>geodata pipelines</b>?</p>
<p class="fragment">How is the dev experience in a <b>non-tech company</b>?</p>
</section> </section>
<section> <section><h5>Enerparc Expertise</h5>
<h5>Enerparc Expertise</h5> <p>The company is involved in every stage of <b>solar energy projects</b>, acting as both a <b>project developer, operator and service provider</b> for third parties.</p>
<p>ENERPARC AG is involved in every stage of <b>solar energy projects</b>, acting as both a <b>project developer, operator and a service provider</b> for third parties.</p>
<img src="images/enerparc_expertise.png" class="r-stretch"></img> <img src="images/enerparc_expertise.png" class="r-stretch"></img>
<p><cite>ENERPARC AG. https://www.enerparc.de</cite></p> <p><cite>ENERPARC AG. enerparc.de</cite></p>
</section> </section>
<section> <section><h5>Enerparc in numbers</h5>
<h5>Enerparc in numbers</h5>
<img src="images/enerparc_overview.png" class="r-stretch"></img> <img src="images/enerparc_overview.png" class="r-stretch"></img>
<p>Covers the electricity needs of <b>1.2 million households</b></p> <p>Covers the electricity needs of <b>1.2 million households</b></p>
<p><cite>ENERPARC AG. https://www.enerparc.de</cite></p> <p><cite>ENERPARC AG. enerparc.de</cite></p>
</section> </section>
<section> <section><h5>Enerparc Solar Parcs in Germany</h5>
<h5>Enerparc Solar Parcs in Germany</h5> <iframe
<div id="map"></div> src="maps/solar_enerparc.html"
<p><cite>ENERPARC AG. https://www.enerparc.de/en/projects#solar-parks-germany</cite></p> style="width: 100%; height: 480px; border: 0;"
loading="lazy">
</iframe>
<p><cite>ENERPARC AG. enerparc.de/en/projects#solar-parks-germany</cite></p>
</section> </section>
<section> <section><h3>My Team</h3>
<h3>My Team</h3> <p><b>Department: </b>GIS Development & Administration</p>
<p class="fragment">Project Development: <b>GIS Development & Administration</b></p> <p><b>Personnel: </b>1 Team lead, 1 Full time, 2 Working students</p>
<p class="fragment"><b>4 Persons</b>: 1 Team lead, 1 Full time, 2 Working Students</p> <p><b>Tasks: </b>GIS Plugin development, Geodata engineering, WebGIS administration, Geodatabase administration</p>
</section> </section>
<section> <section><h3>Project</h3>
<h3>Problem Statement</h3> <p><b>Research question: </b>How to handle geodata pipelines?</p>
<b class="fragment">Use cases</b> <p><b>Needed: </b>Daily updated geodata on energy assets of Germany</p>
<p class="fragment">Identification of <b>development possibilities</b></p> <p><b>Use cases: </b>Monitoring of market activity</p>
<p class="fragment">Monitoring of <b>market activity</b></p> <p><b>Architecture: </b>ETL (extract, transform, load)</p>
<b class="fragment">Needed</b>
<p class="fragment">Daily updated geodata on <b>energy assets of Germany</b></p>
<b class="fragment">Approach</b>
<p class="fragment">A process where geodata is periodicaly <b>extracted</b> from an input source, <b>transformed</b> with buisness logic, and <b>loaded</b> into a geodatabase. <b>(ETL)</b></p>
</section> </section>
<section> <section><h3>ETL Pipeline</h3>
<h3>Input Source</h3> <img src="images/etl_flow.svg" height="500px"></img>
<div class="r-stack r-stretch"> <p><cite>own illustration</cite></p>
<img src="https://www.marktstammdatenregister.de/MaStR/Assets/img/MaStR_Logo.svg" class="fragment fade-in-then-out" width="600px"></img>
<p class="fragment fade-in-then-out">Is an official registry of <b>all facilities and units in the German energy system</b>. It is maintained by the Bundesnetzagentur. </p>
<img src="images/rdm.png" class="fragment"></img>
</div>
<cite>www.marktstammdatenregister.de</cite>
</section> </section>
<section> <section><h3>Extraction</h3>
<h3>Output Destination</h3> <img src="images/etl_flow_extraction.svg" height="500px"></img>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Postgresql_elephant.svg/500px-Postgresql_elephant.svg.png" height="200px"></img> <p><cite>own illustration</cite></p>
</section> </section>
<section> <section><h3>Extraction: Marktstammdatenregister</h3>
<h3>Extraction Methods</h3> <img src="https://www.marktstammdatenregister.de/MaStR/Assets/img/MaStR_Logo.svg" width="600px"></img>
<table> <p><b>Description: </b>Official registry of all facilities and units in the German energy system</p>
<th>Methods</th> <p><b>Provider: </b>Bundesnetzagentur</p>
<th>Advantage</th> <p><b>Access Methods: </b>SOAP API (Simple Object Access Protocol) / XML bulk download</p>
<th>Disadvantage</th> <p><cite>marktstammdatenregister.de</cite></p>
<tr>
<td>Simple Object Access Protocol (SOAP)</td>
</tr>
<tr>
<td>Bulk download (ZIP)</td>
</tr>
</table>
</section> </section>
<section> <section><h3>Extraction: Marktstammdatenregister</h3>
<h3>Transformation Methods</h3> <img src="images/rdm.png" width="800px"></img>
<img src="https://geopandas.org/en/stable/_static/geopandas_logo_web.svg" height="200px"></img> <p><cite>marktstammdatenregister.de</cite></p>
<img src="https://upload.wikimedia.org/wikipedia/en/6/60/PostGIS_logo.png" height="200px"></img>
</section> </section>
<section> <section><h3>Extraction: Marktstammdatenregister</h3>
<h3>Loading Methods</h3> <p><b>Development:</b></p>
<ol>
<li class="fragment">Tried out the SOAP API</li>
<li class="fragment">Realised an API is made for small extractions</li>
<li class="fragment">Tried out the bulk download with hundreds of XML files</li>
<li class="fragment">Realised the XML's are relational to each other and encoded</li>
<li class="fragment">Wrote a whole library to handle the XML dump</li>
<li class="fragment"><b>Found out there is already an open source library for this (open-mastr)</b></li>
</ol>
</section> </section>
<section> <section><h3>Extraction: Enerparc Assets</h3>
<p>"Those who do not understand SQL are condemned to reinvent it, poorly."</p> <p><b>Description: </b>Current photovoltaic systems owned by Enerparc AG</p>
<cite>Adapted from Henry Spencer</cite> <p><b>Provider: </b>Enerparc AG Engineering</p>
<p><b>Access Methods: </b>REST API (Representational State Transfer)</p>
</section>
<section><h3>Extraction: Enerparc Assets</h3>
<p><b>Development:</b></p>
<ol>
<li class="fragment">Asked the engineering department for the list of IDs</li>
<li class="fragment">Realised they always change</li>
<li class="fragment">Asked the engineering department for access to the DB</li>
<li class="fragment">They created a new REST API endpoint for this</li>
<li class="fragment"><b>Accessed this endpoint over a simple http request</b></li>
</ol>
</section>
<section><h3>Extraction: Borders</h3>
<p><b>Description: </b>Country & Municipality Borders</p>
<p><b>Provider: </b>Enerparc AG GIS</p>
<p><b>Access Methods: </b>SQL Queries</p>
<p><b>Database Model: </b>Relational</p>
</section>
<section><h3>Extraction: Borders</h3>
<p><b>Development:</b></p>
<ol>
<li class="fragment">Added the data manually to the repository</li>
<li class="fragment">Realised borders can also change</li>
<li class="fragment"><b>Accessed them using SQL statements during the processing</b></li>
</ol>
</section>
<section><h3>Transformation</h3>
<img src="images/etl_flow_transformation.svg" height="500px"></img>
<p><cite>own illustration</cite></p>
</section>
<section><h3>Transformation</h3>
<p><b>Development:</b></p>
<ol>
<li class="fragment">Started with Python and GeoPandas (GeoDataFrames)</li>
<li class="fragment">Unknowingly reinvented SQL in Python</li>
<li class="fragment">Realised SQL is way better for stuff like this</li>
<li class="fragment">Used a local SQLite DB for processing</li>
<li class="fragment">But still needed to do some spatial operations in python</li>
<li class="fragment">Realised the destination server has PostGIS (SQL for spatial operations)</li>
<li class="fragment">Moved whole pipeline into the database with some absurdly long SQL aka "I replaced my entire stack with PostgreSQL"</li>
<li class="fragment">Processing took over a day and crashed the server</li>
<li class="fragment">Realised the database server only has 4 GB RAM and a weak CPU</li>
<li class="fragment"><b>Moved everything back to Python</b></li>
<li class="fragment"><b>They lived happily ever after</b></li>
</ol>
</section>
<section><h3>Loading</h3>
<img src="images/etl_flow_loading.svg" height="500px"></img>
<p><cite>own illustration</cite></p>
</section>
<section><h3>Loading</h3>
<p><b>Development:</b></p>
<ol>
<li class="fragment">Used GeoPandas built in upload functionality</li>
<li class="fragment">Found out open-mastr can load it directly to the PostgreSQL database</li>
<li class="fragment">Since I moved everything to the DB anyway, this was fitting</li>
<li class="fragment"><b>But then again I moved everything back</b></li>
</ol>
</section>
<section><h3>Architecture</h3>
<img src="images/architecture.svg" height="525px"></img>
<p><cite>own illustration</cite></p>
</section>
<section><h5>Results: Photovoltaic Systems</h5>
<iframe
src="maps/solar.html"
style="width: 100%; height: 480px; border: 0;"
loading="lazy">
</iframe>
<p><cite>Data: Marktstammdatenregister</cite></p>
</section>
<section><h5>Results: Battery Storage Systems</h5>
<iframe
src="maps/battery.html"
style="width: 100%; height: 480px; border: 0;"
loading="lazy">
</iframe>
<p><cite>Data: Marktstammdatenregister</cite></p>
</section>
<section><h5>Results: Wind Turbines</h5>
<iframe
src="maps/wind.html"
style="width: 100%; height: 480px; border: 0;"
loading="lazy">
</iframe>
<p><cite>Data: Marktstammdatenregister</cite></p>
</section>
<section><h3>Reflections: Building ETL Pipelines</h3>
<ul>
<li>
<p>"Those who do not understand SQL are condemned to reinvent it, poorly." <span id="inline_cite">Adapted from Henry Spencer</span></p>
</li>
<li>
<p>Check your system specifications before you change architectures.</p>
</li>
<li>There is still a lot to learn ...</li>
</ul>
</section>
<section><h3>Reflections: First Industry Experience</h3>
<p><b>Positive</b></p>
<ul>
<li>Reduced pressure to perform</li>
<li>Satisfaction of seeing your creation in production</li>
<li>Obstkorb</li>
</ul>
<p><b>Negative</b></p>
<ul>
<li>A lot of meetings</li>
<li>Slow processes</li>
<li>Rigid structures</li>
</ul>
</section>
<section><h3>Reflections: Dev Experience in a Non-Tech Company</h3>
<p><b>Positive</b></p>
<ul>
<li>You can learn a lot</li>
<li>More independence</li>
<li>More control over your projects</li>
<li>Access to more important projects</li>
</ul>
<p><b>Negative</b></p>
<ul>
<li>More responsibilities</li>
<li>More task switching</li>
<li>Less supervision</li>
</ul>
</section>
<section><h3>Next Project</h3>
<p><b>Geo-ETL library for WFS Services</b></p>
<ul>
<li><b>Amtliches Liegenschaftskatasterinformationssystem</b> (Gemarkungen, Flure, Flurstuecke, Gebaeudedaten, ...)</li>
<li><b>Bundesamt fuer Naturschutz</b> (Vogelschutzgebiete, Nationalparke, Naturschutzgebiete,...)</li>
<li><b>Biotope</b></li>
<li><b>...</b></li>
</ul>
<br></br>
<small>WFS (Web Feature Service): This standard defines direct fine-grained access to geographic information <span class="inline_cite">ogc.org/standards/wfs/</span></small>
</section>
<section><h3>Acknowledgments</h3>
<p>Thanks to my team and Enerparc AG.</p>
<img src="https://www.enerparc.de/img/static/logo_enerparc.png" width="200px"></img>
<p>And thank you for listening.</p>
</section> </section>
</div> </div>
</div> </div>
<div class="presentation-footer">
<span class="footer-left">Joaquin Gottlebe / Building Pipelines for the Solar Industry / <span class="date"></span></span>
<span class="footer-right" id="footer-date"></span>
</div>
<script src="dist/reveal.js"></script> <script src="dist/reveal.js"></script>
<script src="plugin/notes/notes.js"></script> <script src="plugin/notes/notes.js"></script>
<script src="plugin/markdown/markdown.js"></script> <script src="plugin/markdown/markdown.js"></script>
<script src="plugin/highlight/highlight.js"></script> <script src="plugin/highlight/highlight.js"></script>
<script src="plugin/title-footer/title-footer.js"></script> <script src="plugin/title-footer/title-footer.js"></script>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script> <script>
Reveal.initialize({ Reveal.initialize({
controls: false, controls: false,
@@ -224,63 +400,12 @@
plugins: [ RevealMarkdown, RevealHighlight, RevealNotes ] plugins: [ RevealMarkdown, RevealHighlight, RevealNotes ]
}); });
</script> </script>
<script> <script>
let map; const formattedDate = new Date().toLocaleDateString("de-DE");
let mapLayer;
function initMapOnce() { document.querySelectorAll(".date").forEach(el => {
if (map) return; el.textContent = formattedDate;
map = L.map('map', { zoomControl: false }).setView([52.52, 13.405], 6);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '&copy; OpenStreetMap contributors'
}).addTo(map);
const germanyBounds = [
[47, 5],
[55, 16]
];
map.fitBounds(germanyBounds);
fetch("data/solaranlagen.geojson")
.then(res => res.json())
.then(data => {
mapLayer = L.geoJSON(data, {
pointToLayer: function (feature, latlng) {
return L.circleMarker(latlng, {
radius: 3,
color: '#004682',
weight: 1,
opacity: 0.0,
fillOpacity: 1
});
const b = mapLayer.getBounds();
if (b.isValid()) map.fitBounds(b, { padding: [20, 20] });
}
}).addTo(map);
})
.catch(err => console.error("Failed to load GeoJSON:", err));
}
Reveal.on('ready', event => {
if (document.getElementById('map')) {
initMapOnce();
setTimeout(() => map.invalidateSize(), 0);
}
});
Reveal.on('slidechanged', event => {
if (event.currentSlide.querySelector('#map')) {
initMapOnce();
setTimeout(() => map.invalidateSize(), 200);
}
}); });
</script> </script>
</body> </body>
</html> </html>