Kann man Oracle Spatial Geometrien in einem offenen leichter lesbaren Format wie JSON ausgeben? GeoJSON gibt die Antwort darauf.
Für alle diejeniegen, die das Format nicht kennen: Eine Definition und Beschreibung findet sich im RFC 7946 der Geographic JSON Working Group vom August 2016.
Dort heißt es:
"GeoJSON ist ein Geodatenaustauschformat, das auf der JavaScriptObject-Notation (JSON) basiert. Es definiert verschiedene Typen von JSON-Objekten
und die Art und Weise, in der sie kombiniert werden, um Daten über geografische Merkmale,
ihre Eigenschaften und ihre räumliche Ausdehnung darzustellen. Das Koordinatenbezugssystem für alle GeoJSON-Koordinaten ist ein geographisches
Koordinatensystem, unter Verwendung von WGS 84 [WGS84] und mit Längen- und Breiteneinheiten von Dezimalgraden."
Ein Beispiel im Format GeoJSON sieht dann folgendermassen aus.
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": {"type": "Point", "coordinates": [102.0, 0.5]}, "properties": {"prop0": "value0"} }, { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [ [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] ] }, "properties": { "prop0": "value0", "prop1": 0.0 } }
GeoJSON ist ein vordefiniertes Format, das mit einem Eintrag zum GeoJSON Typ (hier FeatureCollection) beginnt.
Die Informationen zu den Geometrien tauchen dann nach dem Eintrag geometry type (im obigem Code in Zeile 4) auf.
Dabei können übrigens neun verschiedene Eingaben wie "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" und
"GeometryCollection" gemacht werden. (Bitte unbedingt die Schreibweise beachten!) Mehr dazu kann man im RFC Dokument nachlesen.
Was bedeutet das für Oracle JSON und die Oracle Spatial Geometrien? Beide Techniken können ganz einfach kombiniert werden bzw. in unterschiedliche
Formen "umgewandelt" werden: also von Spatial (also SDO_GEOMETRY) nach GeoJSON bzw. umgekehrt. Besitzt man Daten im GeoJSON Format lässt
sich darauf auch einen Spatial Index anlegen. Dazu wird die SQL/JSON Funktion JSON_VALUE verwendet. Auch Abfragen mit SQL/JSON Funktionen wie JSON_TABLE, JSON_VALUE, JSON_ARRAYAGG usw. können wie gewohnt durchgeführt werden. Einen guten Überblick über diese Möglichkeiten mit
Beispielcode findet man in der Präsentation "GeoJSON and the Oracle Database" von Albert Godfrind.
Besonders interessant für Oracle Spatial Nutzer ist sicherlich die Möglichkeit aus gespeicherten Geometrien, das Format GeoJSON zu generieren und
somit beispielsweise zur Speicherung ein leicht lesbares offenes Format zur Verfügung zu haben. Dazu wurde in Oracle Database 12.2 der Datentyp
SDO_GEOMETRY um die Methode GET_GEOJSON erweitert.
An einem kurzen Beispiel soll die Funktionsweise demonstriert werden. Als Ausgangsbasis nehmen wir die Informationen aus dem Tipp "Nutzung von Geodaten
in der Oracle Datenbank" von Karin Patenge. Damit wird die Tabelle DUS_RIDE_AND_BIKE_STATIONEN mit den entsprechenden Geodaten erzeugt,
die in der Spalte LOCATION gespeichert sind.
SQL> desc dus_ride_and_bike_stationen Name Null? Typ --------------------------------------------------------------------------------------- -------- ----------------------------------------------------------- ID NOT NULL NUMBER(10) LONGITUDE NUMBER(10,6) LATITUDE NUMBER(10,6) ALTITUDE NUMBER(3) GEOMETRY VARCHAR2(20) NAME VARCHAR2(100) ANSCHRIFT VARCHAR2(100) STRASSE VARCHAR2(100) PLZ CHAR(5) ORT VARCHAR2(100) HALTESTELLE_OEPNV VARCHAR2(100) KAPAZITAET VARCHAR2(50) TELEFON VARCHAR2(20) EMAIL VARCHAR2(50) FAX VARCHAR2(20) OEFFNUNGSZEITEN VARCHAR2(255) RADVERKAUF VARCHAR2(50) ZUBEHOERVERKAUF VARCHAR2(50) WARTUNG_REPARATUR VARCHAR2(50) SELF_SERVICE VARCHAR2(50) RADVERLEIH VARCHAR2(50) SONSTIGES VARCHAR2(50) LOCATION PUBLIC.SDO_GEOMETRY
Die Spalte LOCATION ist dabei vom Typ SDO_GEOMETRY. Die Zeileninhalte der Spalte NAME und LOCATION sehen dann folgendermassen aus.
SQL> select name, location from dus_ride_and_bike_stationen; NAME LOCATION(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES) -------------------------------------------------- -------------------------------------------------------------------------------- Bike+Ride Aachener Straße - Aachener Platz SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(6,768617, 51,195687, NULL), NULL, NULL) Bike+Ride Am Seestern U SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(6,73752, 51,241592, NULL), NULL, NULL) Bike+Ride An den Kämpen SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(6,775968, 51,326056, NULL), NULL, NULL)
Um nun GeoJSON zu erhalten, kann man einfach die Methode GET_GEOJSON von SDO_GEOMETRY verwenden.
Hinweis: Es wird die Punktnotation und der Tabellenalias verwendet.
SQL> select name, c.location.get_geojson() as json from dus_ride_and_bike_stationen c; NAME -------------------------------------------------------------------------------- JSON -------------------------------------------------------------------------------- Bike+Ride Aachener Straße - Aachener Platz { "type": "Point", "coordinates": [6.768617, 51.195687] } Bike+Ride Am Seestern U { "type": "Point", "coordinates": [6.73752, 51.241592] } Bike+Ride An den Kämpen { "type": "Point", "coordinates": [6.775968, 51.326056] }
Eine weitere Möglichkeit besteht darin die Funktion TO_GEOJSON des Utility Package SDO_UTIL zu verwenden. Folgendes Beispiel zeigt auch hier die einfache Verwendung.
SQL> select name, sdo_util.to_geojson(location) as json from dus_ride_and_bike_stationen; NAME -------------------------------------------------------------------------------- JSON -------------------------------------------------------------------------------- Bike+Ride Aachener Straße - Aachener Platz { "type": "Point", "coordinates": [6.768617, 51.195687] } Bike+Ride Am Seestern U { "type": "Point", "coordinates": [6.73752, 51.241592] } Bike+Ride An den Kämpen { "type": "Point", "coordinates": [6.775968, 51.326056] }
So lassen sich auf einfache Art und Weise gespeicherte Spatial Geometrien in JSON Format ausgeben. Ürigens ist es dabei auch völlig unerheblich, ob man Oracle Database On-Premises, in der Cloud, Autonomous oder Non Autonomous verwendet. Einzige Voraussetzung ist das Datenbank Release: Diese Funktion ist ab Oracle Database 12.2 verfügbar.
Weitere Informationen und Artikel
Zurück zur Community-Seite