Integration von EBMap4D in die sQLshell

16.11.2024

Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.

Bisher musste dafür ein eher krudes Skript dafür herhalten, die Daten aus einer SQL-Abfrage in ein GeoJson-Fragment zu konvertieren, das dann als einer der Layer in einer auf EBMap4D basierenden Komponente angezeigt werden konnte.

Dazu war viel fehleranfällige Handarbeit nötig. Mit der nun erfolgten Verbesserung verschwindet diese Handarbeit komplett - das Skript wird wesentlich kürzer und muss auch nicht mehr von Abfrage zu Abfrage angepasst werden. Herzstück der neuen Integration ist die Möglichkeit, CSV-Dateien direkt in EBMap4D zu visualisieren: Dazu werden diese mittels des CSV JDBC Treibers aus dem Projekt sQLshell in ein javax.swing.table.TableModel umgewandelt. Dieses wird dann mittels einer dedizierten GUI auf die in einem GeoJson-Fragment benötigten Felder gemappt und basierend auf diesem Mapping wird das GeoJson-Fragment erstellt, das dann als Layer in einer Visualsierung benutzt werden kann. Der Punkt, an dem das javax.swing.table.TableModel weiterverarbeitet wird ist der, an dem die Integration mit der sQLshell greift: Die Inhalte der einzelnen Views sind als javax.swing.table.TableModel über die BeanShell-API zugreifbar.

Hat man also eine hinreichend komplexe Abfrage geschrieben wie etwa diese hier:

select measured_value,st_y(the_geom)as latitude,st_x(the_geom)as longitude,json_object('fill',case
			 when measured_value >10
             then 'red'
             when measured_value >2
             then 'yellow'
             when measured_value is not NULL
             then 'green'
        end) as style,name,json_object(
			'type',	'Feature',
			'id', id,
			'geometry',json(asgeojson(the_geom)),
'style',json_object('fill',case
			 when measured_value >10
             then 'red'
             when measured_value >2
             then 'yellow'
             when measured_value is not NULL
             then 'green'
        end),
'properties',json_object('name',name,'measured_value',measured_value))
AS JSON from test_geom WHERE the_geom is not null

Diese liefert dann beispielsweise folgendes Resultat:

test_geom.measured_value latitude longitude style test_geom.name JSON 1.23456 2.02 1.01 {"fill":"green"} first point {"type":"Feature","id":1,"geometry":{"type":"Point","coordinates":[1.01,2.02]},"style":{"fill":"green"},"properties":{"name":"first point","measured_value":1.23456}} 2.34567 3.03 2.02 {"fill":"yellow"} second point {"type":"Feature","id":2,"geometry":{"type":"Point","coordinates":[2.02,3.03]},"style":{"fill":"yellow"},"properties":{"name":"second point","measured_value":2.34567}} 10.123456789 10.02 10.01 {"fill":"red"} tenth point {"type":"Feature","id":10,"geometry":{"type":"Point","coordinates":[10.01,10.02]},"style":{"fill":"red"},"properties":{"name":"tenth point","measured_value":10.123456789}} 11.123456789 11.02 11.01 {"fill":"red"} eleventh point {"type":"Feature","id":11,"geometry":{"type":"Point","coordinates":[11.01,11.02]},"style":{"fill":"red"},"properties":{"name":"eleventh point","measured_value":11.123456789}}

Die Integration über folgendes Skript

javax.swing.JFrame f = new javax.swing.JFrame();
javax.swing.table.TableModel tm=sQLshellAPI.getCurrentlyVisibleShell().getVisibleView().getSortedAndFilteredData();
java.net.URL stem=new java.net.URL("https://b.tile.opentopomap.org//$ZOOM$/$X$/$Y$.png");
int zoomOffset=0;
f.setContentPane(new de.elbosso.db.scratch.GeoPrototype(stem,zoomOffset,"geoJsonContent",tm));
f.pack();
f.setVisible(true);

öffnet dann folgenden Dialog, der es gestattet, einerseits eine Spalte auszuwählen, die bereits fertige GeoJson-Features enthält (in unserem Beispiel die Spalte JSON):

Screenshot Auswahl einer Spalte, die bereits fertige GeoJson-Features enthält

Falls noch keine GeoJson-Features im Ergebnis der Abfrage enthalten sein sollten, kann man auch einfach solche Features definieren, indem man wichtige Pflichtfelder für solche Features über ein Mapping der einzelnen Spalten des Ergebnisses definiert:

Screenshot Mapping von Spalten auf die Elemente eines GeoJson-Feature

Alle Artikel rss Wochenübersicht Monatsübersicht Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Multi-User-WebDAV, Docker, GitHub

    17.11.2019

    Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...

    Weiterlesen...

Neueste Artikel

  • Migration der Webseite und aller OpenSource Projekte

    In eigener Sache...

    Weiterlesen...
  • AutoHideToolbar für Java Swing

    Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.

    Weiterlesen...
  • Gif-Animationen in Java

    Nachdem ich neulich auf einen sehr interessanten Link gestoßen war, habe ich mich dafür interessiert, ob es möglich wäre - und falls ja: wie einfach - GIF-Animationen aus Java heraus zu erzeugen - und zwar mit Bordmitelln und ohne Zuhilfenahme externer Biblioheken

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen Codeberg-Repositories findet man hier.