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
venv/
.ipynb_*
2026_Internship/data/*.geojson
Regular → Executable
+10 -2
View File
@@ -1,11 +1,19 @@
import geopandas as gpd
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(
df,
geometry=gpd.GeoSeries.from_wkt(df["WKT"]),
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/theme/white.css">
<link rel="stylesheet" href="plugin/highlight/monokai.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<style>
.reveal h3 { font-size: 32px;}
th, td { font-size:24px; }
li{ font-size: 28px; }
#map { width: 100%; height: 480px; }
.presentation-footer {
position: fixed;
bottom: 12px;
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 {
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-size: 0.5em;
color: #6b7280;
@@ -34,24 +74,23 @@
font-size: 24px;
background: none;
color: #004682;
padding: 0 16px;
}
</style>
</head>
<body>
<div class="reveal">
<div class="slides">
<section data-background-image="images/solarparc.jpg" data-background-opacity="0.40">
<h3>Building Geodata-Pipelines for the Solar Industry</h3>
<section data-background-image="images/solarparc.jpg" data-background-opacity="0.40"><h3>Building Pipelines for the Solar Industry</h3>
<p>Internship Report</p>
<hr>
<small>Joaquin Gottlebe</small>
<small>24.04.2026</small>
<small class="date"></small>
<br>
<img src="https://www.enerparc.de/img/static/logo_enerparc.png" width="200px"></img>
</section>
<section >
<h3>Basics: Geographic Information (Geodata)</h3>
<section><h3>Geographic Information (Geodata)</h3>
<div class="r-stack">
<img class="fragment fade-out r-stretch" src="images/geodata_features.png"></img>
@@ -105,116 +144,253 @@
</tbody>
</table>
</div>
<p><cite>Minn, Michael. Visualizing Terrain in ArcGIS Pro. https://michaelminn.net/tutorials/arcgis-pro-terrain/</cite></p>
<p>Data and information which has an <b>association with a location relative to Earth</b></p>
<p><b>Definition: </b>[...] Information about locations on or near the surface of the Earth [...]"</p>
<p><cite>michaelminn.net/tutorials/arcgis-pro-terrain/</cite> <cite>Liu & Özsu, 2009: Encyclopedia of Database Systems</cite></p>
</section>
<section>
<h3>Basics: Geographic Information Systems (GIS)</h3>
<section><h3>Basics: Spatial Operations</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>
<p>Consists of integrated computer hardware and software that <b>store, manage, analyze, edit, output, and visualize geographic data.</b></p>
<p><cite>©OpenStreetMap contributors</cite></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> <cite>Liu & Özsu, 2009: Encyclopedia of Database Systems</cite></p>
</section>
<section>
<h3>Internship Overview</h3>
<p class="fragment">Company: <b>Enerparc AG</b></p>
<p class="fragment">Industry domain: <b>Solar industry</b></p>
<p class="fragment">Duration: <b>360 hours over 4 months</b></p>
<p class="fragment">Role: <b>GIS Developer</b></p>
<section><h3>Internship Overview</h3>
<p><b>Company: </b>Enerparc AG</p>
<p><b>Industry domain: </b>Solar industry</p>
<p><b>Duration: </b>360 hours over 4 months</p>
<p><b>Role: </b>GIS Developer</p>
</section>
<section>
<h3>My Background</h3>
<p class="fragment">Bachelor in <b>Geography</b></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><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><b>Master in Computational Science: </b>Currently pursuing, in my 4th semester</p>
</section>
<section>
<h3>Motivation</h3>
<p class="fragment">First industry <b>experience</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><h3>Why Enerparc</h3>
<p>First industry <b>experience</b></p>
<p>How is the dev experience in a <b>non-tech company</b>?</p>
</section>
<section>
<h5>Enerparc Expertise</h5>
<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>
<section><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>
<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>
<h5>Enerparc in numbers</h5>
<section><h5>Enerparc in numbers</h5>
<img src="images/enerparc_overview.png" class="r-stretch"></img>
<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>
<h5>Enerparc Solar Parcs in Germany</h5>
<div id="map"></div>
<p><cite>ENERPARC AG. https://www.enerparc.de/en/projects#solar-parks-germany</cite></p>
<section><h5>Enerparc Solar Parcs in Germany</h5>
<iframe
src="maps/solar_enerparc.html"
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>
<h3>My Team</h3>
<p class="fragment">Project Development: <b>GIS Development & Administration</b></p>
<p class="fragment"><b>4 Persons</b>: 1 Team lead, 1 Full time, 2 Working Students</p>
<section><h3>My Team</h3>
<p><b>Department: </b>GIS Development & Administration</p>
<p><b>Personnel: </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>
<h3>Problem Statement</h3>
<b class="fragment">Use cases</b>
<p class="fragment">Identification of <b>development possibilities</b></p>
<p class="fragment">Monitoring of <b>market activity</b></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><h3>Project</h3>
<p><b>Research question: </b>How to handle geodata pipelines?</p>
<p><b>Needed: </b>Daily updated geodata on energy assets of Germany</p>
<p><b>Use cases: </b>Monitoring of market activity</p>
<p><b>Architecture: </b>ETL (extract, transform, load)</p>
</section>
<section>
<h3>Input Source</h3>
<div class="r-stack r-stretch">
<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><h3>ETL Pipeline</h3>
<img src="images/etl_flow.svg" height="500px"></img>
<p><cite>own illustration</cite></p>
</section>
<section>
<h3>Output Destination</h3>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Postgresql_elephant.svg/500px-Postgresql_elephant.svg.png" height="200px"></img>
<section><h3>Extraction</h3>
<img src="images/etl_flow_extraction.svg" height="500px"></img>
<p><cite>own illustration</cite></p>
</section>
<section>
<h3>Extraction Methods</h3>
<table>
<th>Methods</th>
<th>Advantage</th>
<th>Disadvantage</th>
<tr>
<td>Simple Object Access Protocol (SOAP)</td>
</tr>
<tr>
<td>Bulk download (ZIP)</td>
</tr>
</table>
<section><h3>Extraction: Marktstammdatenregister</h3>
<img src="https://www.marktstammdatenregister.de/MaStR/Assets/img/MaStR_Logo.svg" width="600px"></img>
<p><b>Description: </b>Official registry of all facilities and units in the German energy system</p>
<p><b>Provider: </b>Bundesnetzagentur</p>
<p><b>Access Methods: </b>SOAP API (Simple Object Access Protocol) / XML bulk download</p>
<p><cite>marktstammdatenregister.de</cite></p>
</section>
<section>
<h3>Transformation Methods</h3>
<img src="https://geopandas.org/en/stable/_static/geopandas_logo_web.svg" height="200px"></img>
<img src="https://upload.wikimedia.org/wikipedia/en/6/60/PostGIS_logo.png" height="200px"></img>
<section><h3>Extraction: Marktstammdatenregister</h3>
<img src="images/rdm.png" width="800px"></img>
<p><cite>marktstammdatenregister.de</cite></p>
</section>
<section>
<h3>Loading Methods</h3>
<section><h3>Extraction: Marktstammdatenregister</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>
<p>"Those who do not understand SQL are condemned to reinvent it, poorly."</p>
<cite>Adapted from Henry Spencer</cite>
<section><h3>Extraction: Enerparc Assets</h3>
<p><b>Description: </b>Current photovoltaic systems owned by Enerparc AG</p>
<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>
</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="plugin/notes/notes.js"></script>
<script src="plugin/markdown/markdown.js"></script>
<script src="plugin/highlight/highlight.js"></script>
<script src="plugin/title-footer/title-footer.js"></script>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script>
Reveal.initialize({
controls: false,
@@ -224,63 +400,12 @@
plugins: [ RevealMarkdown, RevealHighlight, RevealNotes ]
});
</script>
<script>
let map;
let mapLayer;
const formattedDate = new Date().toLocaleDateString("de-DE");
function initMapOnce() {
if (map) return;
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);
}
document.querySelectorAll(".date").forEach(el => {
el.textContent = formattedDate;
});
</script>
</body>
</html>