GeoJSON-Datenfunktionen verwenden

Die GeoJson-Spezifikation definiert die Struktur und den Inhalt von JSON-Objekten, die geografische Formen auf der Erde darstellen sollen (Geometrien genannt). Gemäß der GeoJson-Spezifikation muss ein JSON-Objekt ein Geometrieobjekt mit zwei Feldern namens Typ und Koordinaten sein, wobei der Wert des Typfeldes die Art der Geometrie angibt und der Wert der Koordinaten ein Array sein muss, dessen Elemente die geometrische Form definieren.

Alle Arten von Geometrien werden in Bezug auf eine Reihe von Positionen angegeben. Für Linienstränge und Polygone wird jedoch die eigentliche geometrische Form durch die Linien gebildet, die ihre Positionen verbinden. Die GeoJson-Spezifikation definiert eine Linie zwischen zwei Punkten als die gerade Linie, die die Punkte im (flachen) kartesischen Koordinatensystem verbindet, deren horizontale und vertikale Achsen der Längen- bzw. Breitengrad sind.

Es gibt verschiedene integrierte Funktionen, die JSON-Objekte als Geometrien interpretieren und das Durchsuchen der Zeilen mit Geometrien ermöglichen, die bestimmte Bedingungen erfüllen.

Um die Beispiele zu befolgen, erstellen Sie eine Tabelle über die OCI-Konsole im erweiterten DDL-Eingabemodus. Die DDL-Anweisung wird unten angegeben.

CREATE TABLE IF NOT EXISTS PointsOfInterest (
    id INTEGER, poi JSON,
PRIMARY KEY(id));

Die Schritte zum Erstellen einer Tabelle mit einer DDL-Anweisung finden Sie unter Singleton-Tabelle erstellen: Erweiterter DDL-Eingabemodus.

Um Daten in die Tabelle zu laden, die über die OCI-Konsole erstellt wurde, klicken Sie auf den Tabellennamen. Die Details der Tabelle werden angezeigt. Klicken Sie auf Daten hochladen. Klicken Sie auf Datei zum Hochladen auswählen, und geben Sie die hochzuladende JSON-Datei an. Sie können die DDL- und JSON-Datei für die GeoJSON-Daten hier herunterladen

Geo_innen

Bestimmt Geometrien innerhalb einer begrenzenden GeoJSON-Geometrie.

boolean geo_inside(any*, any*)

Die Funktion bestimmt, ob die Geometrie, auf die der erste Parameter zeigt, vollständig im Polygon enthalten ist, auf das der zweite Parameter zeigt.

Wenn einer der beiden Parameter kein einzelnes gültiges Geometrieobjekt zurückgibt und zur Kompilierungszeit erkannt werden kann, löst die Funktion einen Fehler aus.

Das Laufzeitverhalten ist wie folgt:

Hinweis: Das Innere eines Polygons sind alle Punkte im Polygonbereich, mit Ausnahme der Punkte auf dem linearen Ring, die den Polygonrand definieren.

Beispiel:Suchen Sie nach Naturparks in Nordkalifornien.

SELECT t.poi.name AS park_name,
t.poi.address.street AS park_location
FROM PointsOfInterest t
WHERE t.poi.kind = "nature park"
AND geo_inside(t.poi.location,
              { "type" : "polygon",
                "coordinates": [[
                  [-
120.1135253906249, 36.99816565700228],
                  [-119.0972900390625, 37.391981943533544],
                  [-119.2840576171875, 37.97451499202459],
                  [-120.2069091796874, 38.035112420612975],
                  [-122.3822021484375, 37.74031329210266],
                  [-122.2283935546875, 37.15156050223665],
                  [-121.5362548828124, 36.85325222344018],
                  [-120.1135253906249, 36.99816565700228]
                ]]
             });

Erklärung:

Ergebnis:

{"park_name":"portola redwoods state park",
"park_location":"15000 Skyline Blvd"}

geo_intersect

Bestimmt Geometrien, die sich mit einer GeoJSON-Geometrie überschneiden.

boolean geo_intersect(any*, any*)

Der erste und der zweite Parameter any* können beliebige geometrische Objekte sein.

Die Funktion bestimmt, ob zwei Geometrien, die als Parameter angegeben sind, Punkte gemeinsam haben. Wenn einer der beiden Parameter kein einzelnes gültiges Geometrieobjekt zurückgibt und zur Kompilierungszeit erkannt werden kann, löst die Funktion einen Fehler aus.

Das Laufzeitverhalten ist wie folgt:

Wenn beide Parameter jeweils ein einzelnes Geometrieobjekt zurückgeben, gibt die Funktion "true" zurück, wenn die 2 Geometrien Punkte gemeinsam haben, andernfalls "false".

Beispiel:Texas erwägt, den Zugang zur unterirdischen Wasserversorgung zu regulieren. Ein Grundwasserleiter ist eine unterirdische Schicht aus wasserhaltigem, durchlässigem Gestein, Felsbrüchen oder unkonsolidierten Materialien. Die Regierung will neue Vorschriften für Orte erlassen, die einem Aquifer sehr nahe stehen.

Die Koordinaten des Aquifers sind bereits abgebildet. Sie möchten alle Bezirke im Bundesstaat Texas kennen, die sich mit diesem Grundwasserleiter überschneiden, damit Sie die Bezirksregierung für jeden betroffenen Bezirk benachrichtigen können, um an Gesprächen über die neuen Vorschriften teilzunehmen.

SELECT t.poi.county AS County_needs_regulation,
t.poi.contact AS Contact_phone
FROM PointsOfInterest t WHERE
geo_intersect(
    t.poi.location,
    {

     "type" : "polygon",
      "coordinates": [
          [
            [-97.668457031249, 29.34387539941801],
            [-95.207519531258, 29.19053283229458],
            [-92.900390625653, 30.37287518811801],
            [-94.636230468752, 32.21280106801518],
            [-97.778320312522, 32.45415593941475],
            [-99.799804687541, 31.18460913574325],
            [-97.668457031249, 29.34387539941801]
          ]
        ]
    }
);

Erklärung:

Ergebnis:

{"County_needs_regulation":"Tarrant","Contact_phone":"469 745 5687"}
{"County_needs_regulation":"Kinga","Contact_phone":"469 384 7612"}

Geoweite

Bestimmt den Abstand zwischen zwei räumlichen Objekten.

double geo_distance(any*, any*)

Der erste und der zweite Parameter any* können beliebige geometrische Objekte sein.

Die Funktion gibt den geodätischen Abstand zwischen den beiden Eingabegeometrien zurück. Der zurückgegebene Abstand ist der Mindestabstand zwischen den Abständen eines beliebigen Punktpaares, bei dem der erste Punkt zur ersten Geometrie und der zweite Punkt zur zweiten Geometrie gehört. Zwischen zwei solchen Punkten ist ihr Abstand die Länge der geodätischen Linie, die die Punkte verbindet.

Geodätische Linie - Übersicht

Eine geodätische Linie zwischen 2 Punkten ist die kürzeste Linie, die zwischen den 2 Punkten auf der ellipsoidalen Oberfläche der Erde gezogen werden kann. Für eine vereinfachte, aber illustrativere Definition, nehmen Sie für einen Moment an, dass die Erdoberfläche eine Kugel ist. Dann ist die geodätische Linie zwischen zwei Punkten auf der Erde der kleinere Bogen zwischen den beiden Punkten auf dem großen Kreis, der den Punkten entspricht, d.h. dem Kreis, der durch den Schnittpunkt der Kugel und der durch den Mittelpunkt der Erde und die beiden Punkte definierten Ebene gebildet wird.

Die folgende Abbildung zeigt den Unterschied zwischen den geodätischen und geraden Linien zwischen Los Angeles und London.

Beschreibung von geodetic-vs-straight-line.jpg folgt

Beschreibung der Abbildung geodetic-vs-straight-line.jpg

Wenn einer der beiden Parameter kein einzelnes gültiges Geometrieobjekt zurückgibt und zur Kompilierungszeit erkannt werden kann, löst die Funktion einen Fehler aus.

Das Laufzeitverhalten ist wie folgt:

Andernfalls gibt die Funktion den geodätischen Abstand in Metern zwischen den 2 Eingabegeometrien zurück.

Hinweis: Die Ergebnisse werden aufsteigend nach Entfernung sortiert (der kürzeste Abstand wird zuerst angezeigt).

Beispiel:Wie weit ist das nächste Restaurant vom angegebenen Standort entfernt?

SELECT
t.poi.name AS restaurant_name,
t.poi.address.street AS street_name,
geo_distance(
    t.poi.location,
    {
       "type" : "point",
       "coordinates": [-
121.94034576416016,37.2812239247177]
    }
) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "restaurant" ;

Erklärung:

Ergebnis:

{"restaurant_name":"Coach Sports Bar & Grill","street_name":"80 Edward St","distance_in_meters":799.2645323337218}
{"restaurant_name":"Ricos Taco","street_name":"80 East Boulevard St","distance_in_meters":976.5361117138553}
{"restaurant_name":"Effie's Restaurant and Bar","street_name":"80 Woodeard St","distance_in_meters":2891.0508307646282}

Der Abstand zwischen dem aktuellen Standort und dem nächsten Restaurant beträgt 799 Meter.

Geo_inner_distanz

Bestimmt räumliche Objekte in der Nähe eines Punktes.

boolean geo_within_distance(any*, any*,double)

Der erste und der zweite Parameter any* können beliebige geometrische Objekte sein.

Die Funktion bestimmt, ob die erste Geometrie in einem Abstand von N Metern von der zweiten Geometrie liegt.

Wenn einer der beiden Parameter kein einzelnes gültiges Geometrieobjekt zurückgibt und zur Kompilierungszeit erkannt werden kann, löst die Funktion einen Fehler aus.

Das Laufzeitverhalten ist wie folgt:

Wenn beide Parameter jeweils ein einzelnes Geometrieobjekt zurückgeben, wird "true" zurückgegeben, wenn sich die erste Geometrie in einem Abstand von N Metern von der zweiten Geometrie befindet, wobei "N" die vom dritten Parameter zurückgegebene Zahl ist, andernfalls "false". Der Abstand zwischen 2 Geometrien ist definiert als der Mindestabstand zwischen den Abständen eines beliebigen Punktpaares, bei dem der erste Punkt zur ersten Geometrie und der zweite Punkt zur zweiten Geometrie gehört. Wenn N eine negative Zahl ist, wird sie auf 0 gesetzt.

Beispiel:Gibt es in den nächsten 5 km ein Rathaus? Wie weit ist es?

SELECT t.poi.address.street AS city_hall_address,
geo_distance(
    t.poi.location,
    {
        "type" : "point",
        "coordinates" : [-120.653828125,38.85682013474361]
    }

) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "city hall" AND
geo_within_distance(
    t.poi.location,
    {
        "type" : "point",
        "coordinates" : [-120.653828125,38.85682013474361]
    },
    5000
);

Erklärung:

Ergebnis:

{"city_hall_address":"70 North 1st street","distance_in_meters":1736.0144040331768}

Das Rathaus ist 1736 m (1,73 km) vom aktuellen Standort entfernt.

Geo_nähe

Bestimmt räumliche Objekte in der Nähe eines Punktes.

boolean geo_near(any*, any*, double)

Der erste und der zweite Parameter any* können beliebige geometrische Objekte sein.

Die Funktion bestimmt, ob die erste Geometrie in einem Abstand von N Metern von der zweiten Geometrie liegt.

Wenn einer der beiden Parameter kein einzelnes gültiges Geometrieobjekt zurückgibt und zur Kompilierungszeit erkannt werden kann, löst die Funktion einen Fehler aus.

Das Laufzeitverhalten ist wie folgt:

Wenn beide der ersten beiden Parameter jeweils ein einzelnes Geometrieobjekt zurückgeben, wird "true" zurückgegeben, wenn sich die erste Geometrie in einem Abstand von N Metern von der zweiten Geometrie befindet, wobei "N" die vom dritten Parameter zurückgegebene Zahl ist, andernfalls "false".

Hinweis: Geo_near wird intern in geo_within_distance plus eine (implizite) Reihenfolge nach dem Abstand zwischen den beiden Geometrien konvertiert. Wenn die Abfrage jedoch bereits ein (explizites) Order-by aufweist, wird keine Sortierung nach Entfernung durchgeführt. Die Funktion geo_near kann nur in der WHERE-Klausel angezeigt werden, wobei es sich um ein Prädikat der obersten Ebene handeln muss, d.h. nicht unter einem OR- oder NOT-Operator verschachtelt ist.

Beispiel 1:Gibt es ein Krankenhaus innerhalb von 3 km vom angegebenen Standort?

SELECT
t.poi.name AS hospital_name,
t.poi.address.street AS hospital_address
FROM PointsOfInterest t
WHERE t.poi.kind = "hospital"
AND
geo_near(
    t.poi.location,
    {"type" : "point",
     "coordinates" : [-122.03493933105469,37.32949164059004]
    },
    3000
);

Erklärung:

Ergebnis:

{"hospital_name":"St. Marthas hospital","hospital_address":"18000 West Blvd"}
{"hospital_name":"Memorial hospital","hospital_address":"10500 South St"}

Beispiel 2: Wie weit ist eine Tankstelle innerhalb der nächsten Meile vom angegebenen Standort entfernt?

SELECT
t.poi.address.street AS gas_station_address,
geo_distance(
    t.poi.location,
    {
        "type" : "point",
        "coordinates" : [-121.90768646240233,37.292081740702365]
    }
) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "gas station" AND
geo_near(
    t.poi.location,
    {
        "type" : "point",
        "coordinates" : [-121.90768646240233,37.292081740702365]
    },
    1600
);

Erklärung:

Ergebnis:

{"gas_station_address":"33 North Avenue","distance_in_meters":886.7004173859665}

Die tatsächliche Entfernung zur nächsten Tankstelle innerhalb der nächsten Meile beträgt 886m.

geo_is_geometrie

Validiert ein Geodatenobjekt.

boolean geo_is_geometry(any*)

Der Parameter any* kann ein beliebiges geometrisches Objekt sein.

Die Funktion bestimmt, ob die angegebene Eingabe ein gültiges Geometrieobjekt ist.

Beispiel: Bestimmen Sie, ob die Position, die auf die Ortshalle zeigt, ein gültiges geometrisches Objekt ist.

SELECT geo_is_geometry(t.poi.location) AS city_hall
FROM PointsOfInterest t
WHERE t.poi.kind = "city hall"

Erläuterung: Mit der Funktion geo_is_geometry können Sie bestimmen, ob ein bestimmter Speicherort ein gültiges geometrisches Objekt ist oder nicht.

Ergebnis:

{ "city_hall" : true}

Verwandte Themen