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

  • Synchronisierung von Lorenz-Systemen III

    23.10.2020

    Nachdem ich in einem vorhergehenden Artikel auf das Problem des kleinen Parameterraums im Zusammenhang mit der Nutzung synchronisierter chaotischer Systeme hingewiesen hatte will ixch hier untersuchen, wie sensibel solche Systeme auf Abweichungen der Parameterwerte zwischen treibendem und getriebenen System reagieren

    Weiterlesen

Neueste Artikel

  • Plugin zur Arbeit mit Markdown für NeoVim

    Ich habe neulich beschrieben, dass ich aktuell mehr und mehr bemerke, dass Dinge, für die ich in meinem NeoVim-Setup Plugins benutzt habe sehr gut auch mit Bordmitteln funktionieren.

    Weiterlesen
  • Raspbian Upgrade von 11 (Bullseye) nach 12 (Bookworm)

    Ich habe neulich wieder einmal eine Upgrade- und Backup-Sitzung mit meinen diversen Linuxinstallationen veranstaltet. Der Zeitpunkt schien mir gekommen, da es eine neue stable Variante von Debian (Trixie) gibt.

    Weiterlesen
  • Meine praktischen Erfahrungen mit ollama (llava)

    Ich diskutiere immer wieder gern über das was heute Machine Intelligence oder Artificial Intelligence ( oder wie die ganzen anderen hohlen Phrasen heißen, die dafür heutzutage als Buzzwords missbraucht werden). Das geschieht online, in meinem $dayjob oder auch privat. Meine Meinung steht fest: das ist alles Quatsch und steht in keiner Relation zum Nutzen

    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.