feat: add internship report
@@ -3,3 +3,4 @@
|
||||
*.xyz
|
||||
venv/
|
||||
.ipynb_*
|
||||
2026_Internship/data/*.geojson
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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="<span style="color: rgba(0, 0, 0, 0); font-family: monospace; font-size: 0px; text-align: start; background-color: rgb(236, 236, 236);">%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</span>" 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<span style="color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">ueries</span>" 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="<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">GDB</span><div>(Stage)</div>" 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<span style="background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">ueries</span>" 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>
|
||||
@@ -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="<font style="font-size: 15px;">Bulk download</font>" 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="<font style="font-size: 15px;">REST API</font>" 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="<span style="color: rgba(0, 0, 0, 0); font-family: monospace; font-size: 0px; text-align: start; background-color: rgb(236, 236, 236);">%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</span>" 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="<font style="font-size: 15px;">SQL q<span style="color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">ueries</span></font>" 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="<font style="font-size: 15px;">GDB</font>" 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="<span style="background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"><font style="font-size: 15px;">GDB</font></span><div><font style="font-size: 15px;">(Stage)</font></div>" 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="<font style="font-size: 15px;">Runtime Server</font>" 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="<font style="font-size: 15px;">SQL q<span style="background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">ueries</span></font>" 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="<font style="font-size: 15px;">Foreign table</font>" 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="<font style="font-size: 15px;">Cron-Daemon</font>" vertex="1">
|
||||
<mxGeometry height="100" width="100" x="600" y="80" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
|
After Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 178 KiB |
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB |
@@ -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="<div><div>Source Data</div></div>" 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<div>Database</div>" 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>
|
||||
|
After Width: | Height: | Size: 72 KiB |
@@ -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="<div><div>Source Data</div></div>" 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<div>Database</div>" 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>
|
||||
|
After Width: | Height: | Size: 72 KiB |
@@ -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="<div><div>Source Data</div></div>" 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<div>Database</div>" 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>
|
||||
|
After Width: | Height: | Size: 72 KiB |
@@ -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="<div><div>Source Data</div></div>" 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<div>Database</div>" 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>
|
||||
|
After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 273 KiB |
|
Before Width: | Height: | Size: 4.1 MiB After Width: | Height: | Size: 4.1 MiB |
|
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 119 KiB |
|
Before Width: | Height: | Size: 216 KiB After Width: | Height: | Size: 216 KiB |
|
Before Width: | Height: | Size: 402 KiB After Width: | Height: | Size: 402 KiB |
@@ -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: '© 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>
|
||||
@@ -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: '© 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>
|
||||
@@ -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: '© 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>
|
||||
@@ -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: '© 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>
|
||||
@@ -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: '© 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>
|
||||
|
||||