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

Artikel, die hierher verlinken

GUI für Bounding Boxes (Polygons) in der sQLshell

08.03.2025

Wie bereits in einem früheren Artikel beschrieben arbeite ich zur Zeit daran, die Unterstützung für Geo-Daten in der sQLshell Stück für Stück zu verbessern

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


Vor 5 Jahren hier im Blog

  • 8TB Raid5 mit Raspberry Pi

    25.04.2020

    Ich habe mir neulich überlegt, ob man einen Pi als Raid benutzen könnte - aber nicht mit dem ewig gleichen Setup mit 4 USB-Sticks...

    Weiterlesen...

Neueste Artikel

  • Watch David Byrne Lead a Massive Choir in Singing David Bowie’s “Heroes”

    Durch die Seite Open Culture bin ich auf diesen spektakulären Auftritt aufmerksam geworden:

    Weiterlesen
  • Zufälliges Füllen der Ebene

    Ich fand neulich einen sehr interessanten Artikel Zum Thema der algorithmischen Erzeugung von dekorativen (obwohl - das liegt im Auge des Betrachters) Bildern.

    Weiterlesen
  • Sicherheit beim Fernzugang per SSH

    Ich habe vor einiger Zeit bereits zwei Vorträge gestaltet und dafür meine Ideen zur unkomplizierten Erstellung von Präsentationen genutzt - nun ist ein weiterer hinzugekommen.

    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.