30 March 2026
Was wäre ein Spatial-ETL ohne Rasterunterstützung? Wir haben die gdal-java-bindings und das hop-gdal-plugin, das bis jetzt «nur» einen OGR-Input- und -Output-Transform bereitstellt. Wenn wir Rasterprocessing in Apache Hop wollen, müssen wir uns überlegen, wie wir das strukturieren. Ich habe mich entschieden, mich an der Struktur der neuen GDAL-Tools zu orientieren. D.h. nicht mehr ein gdal_translate und gdalwarp, die fast alles können und vor Optionen nur so strotzen, sondern «do one thing and do it well».
Et voilà, neu gibt es im hop-gdal-plugin folgende Raster-Transforms:
Als Beispiel will ich für unser Bürogebäude die Höhe berechnen:
Als erstes lese ich mit einem OGR-Input-Transform die Gebäude eines bestimmten Ausschnittes aus einer GeoPackage-Datei. Gleichzeitig clippe ich mit dem Raster Clip Transform von einer extern gehosteten Cloud Optimized GeoTIFF-Datei (mit den Gebäudehöhen aus LiDAR-Daten) den gleichen Ausschnitt und speichere die Datei temporär:
Weil der Raster Clip Transform nur eine einzige Row zurückliefert, können wir mit dem Stream aus dem OGR-Input einfach das kartesische Produkt bilden, damit erhält jede Row des OGR-Inputs auch den Pfad der temporären, geclippten Rasterdatei. Anschliessend können wir diesen Stream mit dem Raster Zonal Stats Transform verbinden. Das GUI dieses Transforms (und auch anderer) ist noch verbesserungswürdig und irgendwie verwirrend (was ist hier was?). Erstes weil einfach schlecht strukturiert und zweites hat es wirklich viele Optionen und Möglichkeiten, weil vieles auch aus seinem Field eines Streams übernommen werden kann:
Es fehlt in SWT so etwas wie der <details>-Tag in HTML. Aber hey, es geht noch schlimmer und ich denke da an das Leuchturmprojekt (Zeit- und Leistungserfassung) der «digitalen Transformation» im Kanton:
Ich meine, wer um Herrgottswillen kommt auf eine solche Idee?! Aber egal, weiter mit Apache Hop.
In diesem Transform sind alle Statistiken gemäss dem GDAL-Rastertool möglich. Wir wählen Durchschnitt und Maximum (pro Gebäude):
Eine Berechnungsvariante in diesem Transform ist Row-By-Row (Geometrie für Geometrie im Stream). Anschliessend entfernen wir noch ein paar Attribute aus dem Stream und speichern die Daten in einer GeoPackage-Datei mit dem OGR-Output-Transform. Das Resultat:
Probiert es aus und meldet Fehler. Das Komplettpaket wurde mit dem verbesserten GDAL-Plugin upgedatet. Und das kostet euch gar nichts. Nicht mal ein Kafi/Gipfeli pro Tag. Wow.
HOP_JAVA_HOME=/Users/stefan/.sdkman/candidates/java/25.0.1-tem \
HOP_OPTIONS="--enable-native-access=ALL-UNNAMED -Xmx2048m" \
./hop-gui.sh