Kategorien:

Geodatenfunktionen

ST_INTERSECTION

Gibt bei zwei GEOGRAPHY-Eingabeobjekten ein GEOGRAPHY-Objekt zurück, das die Form mit der Menge der Punkte darstellt, die beiden Eingabeobjekten gemeinsam sind (d. h. die Schnittmenge der beiden Objekte).

Siehe auch:

ST_UNION, ST_DIFFERENCE, ST_SYMDIFFERENCE

Syntax

ST_INTERSECTION( <geography_expression_1> , <geography_expression_2> )
Copy

Argumente

geography_expression_1

Ein GEOGRAPHY-Objekt.

geography_expression_2

Ein GEOGRAPHY-Objekt.

Rückgabewerte

Gibt einen Wert vom Typ GEOGRAPHY zurück.

Nutzungshinweise

  • Befindet sich ein beliebiger Punkt eines Eingabeobjekts auf der Grenze des anderen Eingabeobjekts (ohne Punkte), kann die Ausgabe diesen Punkt möglicherweise enthalten oder auch nicht.

    Nehmen wir zum Beispiel an, geography_expression_1 ist POINT(1 1) und geography_expression_2 ist LINESTRING(1 0, 1 2). In diesem Fall liegt geography_expression_1 auf der Grenze von geography_expression_2, ist aber kein Punkt davon.

    In diesem Beispiel ist die erwartete Ausgabe POINT(1 1), aber die tatsächliche Ausgabe könnte ein leeres geographisches Objekt sein (dargestellt durch NULL).

    Um diese Fälle zu erkennen und zu umgehen, könnte beispielsweise mit ST_DWITHIN festgestellt werden, ob der Mindestabstand zwischen den beiden Eingabeobjekten 0 beträgt. Sie können auch prüfen, ob ein Punkt auf einem LineString liegt, indem Sie prüfen, ob der Mindestabstand zwischen den beiden Objekten null ist:

    SELECT TO_GEOGRAPHY('POLYGON((0 0, 1 0, 2 1, 1 2, 2 3, 1 4, 0 4, 0 0))') AS polygon,
           TO_GEOGRAPHY('POINT(0 2)') AS point,
           ST_DWITHIN(polygon, point, 0) AS point_is_on_top_of_polygon,
           ST_INTERSECTION(polygon, point);
    
    Copy

    Diese Anweisung erzeugt die folgende Ausgabe:

    +--------------------------------------------+------------+----------------------------+---------------------------------+
    | POLYGON                                    | POINT      | POINT_IS_ON_TOP_OF_POLYGON | ST_INTERSECTION(POLYGON, POINT) |
    |--------------------------------------------+------------+----------------------------+---------------------------------|
    | POLYGON((0 0,1 0,2 1,1 2,2 3,1 4,0 4,0 0)) | POINT(0 2) | True                       | NULL                            |
    +--------------------------------------------+------------+----------------------------+---------------------------------+
    
    Copy

    Es wird nicht garantiert, dass die Funktion normalisierte und/oder minimale Ergebnisse liefert. Eine Ausgabe könnte zum Beispiel aus einem LineString-Objekt bestehen, das mehrere Punkte enthält, die eigentlich nur ein gerades Segment bilden.

Beispiele

Im folgende Beispiel wird ein GEOGRAPHY-Objekt zurückgegeben, das die Schnittmenge der beiden GEOGRAPHY-Eingabeobjekte darstellt:

ALTER SESSION SET GEOGRAPHY_OUTPUT_FORMAT = 'WKT';

SELECT ST_INTERSECTION(
  TO_GEOGRAPHY('POLYGON((0 0, 1 0, 2 1, 1 2, 2 3, 1 4, 0 4, 0 0))'),
  TO_GEOGRAPHY('POLYGON((3 0, 3 4, 2 4, 1 3, 2 2, 1 1, 2 0, 3 0))'))
AS intersection_of_objects;
Copy

Dieses Beispiel ergibt die folgende Ausgabe:

+-----------------------------------------------------------------------------------------------------------------------------------------+
| INTERSECTION_OF_OBJECTS                                                                                                                 |
|-----------------------------------------------------------------------------------------------------------------------------------------|
| MULTIPOLYGON(((1.5 0.5000571198,2 1,1.5 1.500171359,1 1,1.5 0.5000571198)),((1.5 2.500285599,2 3,1.5 3.500399839,1 3,1.5 2.500285599))) |
+-----------------------------------------------------------------------------------------------------------------------------------------+
Copy

Die folgenden Bilder veranschaulichen die Unterschiede in den Flächen, die die Eingabe- und Ausgabeobjekte darstellen:

Eingabe

Ausgabe

Areas of input objects passed to ST_INTERSECTION Areas of output objects returned by ST_INTERSECTION