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):
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:
Mapping von Spalten auf die Elemente eines GeoJson-Feature
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
Ticketsysteme sind lebende Wesen
29.03.2020
Hier zunächst wieder eine Triggerwarnung: Dieser Artikel wird meine Meinung abbilden. es kann sein, dass sie dem einen oder anderen nicht gefällt - das ist mir aber egal. Und wenn hier irgendwelche Schneeflocken mitlesen, dann sind die selber schuld.
Weiterlesen...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Jupyter JupyterBinder Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Präsentationen Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
Ich berichtete hier bereits über Experimente mit dem Clifford-Attractor, allerdings war ich noch Experimente unter geringfügig geänderten Parametern schuldig...
WeiterlesenEs wurde wieder einmal Zeit für ein neues Feature in meinem Static Site Generator mittels dessen ich ja auch meine Heimatseite im Zwischennetz gestalte und verwalte...
WeiterlesenEs kamen mehrere Faktoren zusammen: die Tatsache, dass ich nicht mehr ganz so kürzlich die 50 überschritten habe hatte ebenso darauf Einfluss wie das heutige trübe Wetter und auch der Fakt, dass ich bereits beinahe alle Wochenendpflichten erledigt habe. Der letzte Stein des Anstoßes war dann aber, dass sich heute zum 125. Mal der Geburtstag von Erich Fromm jährt.
WeiterlesenManche 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.