Blog Name
  • Januar 2020

GeoJSON: Oracle Spatial im JSON Format

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
 

Visit the Oracle Blog

 

Contact Us

Oracle

Integrated Cloud Applications & Platform Services