Catégories :

Fonctions géospatiales

ST_INTERSECTION

En tenant compte de deux objets GEOGRAPHY d’entrée, renvoie un objet GEOGRAPHY qui représente la forme de l’ensemble des points qui sont communs aux deux objets d’entrée (c’est-à-dire l’intersection des deux objets).

Voir aussi :

ST_UNION , ST_DIFFERENCE , ST_SYMDIFFERENCE

Syntaxe

ST_INTERSECTION( <geography_expression_1> , <geography_expression_2> )
Copy

Arguments

geography_expression_1

Un objet GEOGRAPHY.

geography_expression_2

Un objet GEOGRAPHY.

Renvoie

La fonction renvoie une valeur de type GEOGRAPHY.

Notes sur l’utilisation

  • Si un sommet d’un objet d’entrée se trouve sur la limite de l’autre objet d’entrée (à l’exclusion des sommets), la sortie peut inclure ou non ce point de sommet.

    Par exemple, supposons que geography_expression_1 soit POINT(1 1) et que geography_expression_2 soit LINESTRING(1 0, 1 2). Dans ce cas, geography_expression_1 est sur la limite de geography_expression_2 mais n’en est pas un sommet.

    Dans cet exemple, la sortie attendue est POINT(1 1), mais la sortie réelle pourrait être une géographie vide (représentée par NULL).

    Pour aider à détecter et à contourner ces cas, une idée potentielle consiste à utiliser ST_DWITHIN pour déterminer si la distance minimale entre les deux objets d’entrée est 0. Par exemple, vous pouvez vérifier si un point se trouve au sommet d’un LineString en vérifiant si la distance minimale entre les deux objets est égale à zéro :

    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

    Cette instruction produit le résultat suivant :

    +--------------------------------------------+------------+----------------------------+---------------------------------+
    | 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

    Il n’est pas garanti que la fonction produise des résultats normalisés et/ou minimaux. Par exemple, une sortie peut consister en un LineString contenant plusieurs points qui ne forment en fait qu’un seul segment droit.

Exemples

L’exemple suivant renvoie un objet GEOGRAPHY qui représente l’intersection de deux objets GEOGRAPHY en entrée :

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

Cet exemple produit le résultat suivant :

+-----------------------------------------------------------------------------------------------------------------------------------------+
| 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

Les images suivantes illustrent les différences dans les zones qui représentent les objets d’entrée et de sortie :

Entrée

Sortie

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