Kann man Oracle Spatial Geometrien in einem offenen leichter lesbaren Format wie JSON ausgeben? Das Format 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
      }
    }

Wie man erkennen kann, gibt es ein vorgegebenes 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 bzw. in das unterschiedliche Format “umgewandelt” werden: also von Spatial (also SDO_GEOMETRY) nach GeoJSON bzw. umgekehrt. Besitzt man Daten im GeoJSON Format lässt sich darauf auch ein 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 – sogar 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 zur Speicherung ein leicht lesbares offenes Format zur Verfügung zu haben. Dazu wurde in Oracle Database 12.2 der Datentyp SDO_GEOMTRY um die Methode GET_GEOJSON erweitert. Folgendes Beispiel zeigt eine Verwendung: Die Tabelle DUS_RIDE_AND_BIKE_STATIONEN speichert dabei die Punkt-Geometrien in der Spalte LOCATION.

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 zweite 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. 

Ausführlicher und vollständig beschrieben ist das verwendete Beispiel in folgendem Tipp. Neugierig geworden, dann einfach einmal ausprobieren!