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
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...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Jupyter Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
In eigener Sache...
Weiterlesen...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...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.