Name

ST_Relate — Teste si deux géométries ont une relation topologique correspondant à un modèle de matrice d'intersection, ou calcule leur matrice d'intersection

Synopsis

boolean ST_Relate(geometry geomA, geometry geomB, text intersectionMatrixPattern);

text ST_Relate(geometry geomA, geometry geomB);

text ST_Relate(geometry geomA, geometry geomB, integer boundaryNodeRule);

Description

Ces fonctions permettent de tester et d'évaluer la relation spatiale (topologique) entre deux géométries, telle que définie par le Dimensionally Extended 9-Intersection Model (DE-9IM).

Le DE-9IM est une matrice à 9 éléments indiquant la dimension des intersections entre l'intérieur, la frontière et l'extérieur de deux géométries. Elle est représentée par une chaîne de texte de 9 caractères utilisant les symboles "F", "0", "1", "2" (par exemple, 'FF1FF0102').

Un type spécifique de relation spatiale peut être testé en faisant correspondre la matrice d'intersection à un motif de matrice d'intersection. Les motifs peuvent inclure les symboles supplémentaires "T" (signifiant "l'intersection est non vide") et "*" (signifiant "n'importe quelle valeur"). Les relations spatiales communes sont fournies par les fonctions nommées ST_Contains, ST_ContainsProperly, ST_Covers, ST_CoveredBy, ST_Crosses, ST_Disjoint, ST_Equals, ST_Intersects, ST_Overlaps, ST_Touches, et ST_Within. L'utilisation d'un modèle explicite permet de tester plusieurs conditions d'intersection, de croisement, etc. en une seule étape. Elle permet également de tester des relations spatiales qui n'ont pas de fonction de relation spatiale nommée. Par exemple, la relation "Interior-Intersects" possède le motif DE-9IM T********, qui n'est évalué par aucun prédicat nommé.

Pour plus d'informations, voir Section 5.1, “Déterminer les relations spatiales”.

Variante 1: Teste si deux géométries sont spatialement liées selon le intersectionMatrixPattern donné.

[Note]

Contrairement à la plupart des prédicats de relations spatiales nommées, ce prédicat n'inclut PAS automatiquement un appel d'index. La raison en est que certaines relations sont vraies pour des géométries qui ne s'intersectent PAS (par exemple Disjoint). Si vous utilisez un modèle de relation qui nécessite une intersection, incluez l'appel à l'index &&.

[Note]

Il est préférable d'utiliser une fonction de relation nommée si elle est disponible, car elle utilise automatiquement un index spatial lorsqu'il existe. En outre, elles peuvent mettre en œuvre des optimisations de performance qui ne sont pas disponibles avec l'évaluation de la relation complète.

Variante 2: Renvoie la chaîne matricielle DE-9IM pour la relation spatiale entre les deux géométries d'entrée. La chaîne matricielle peut être testée pour vérifier si elle correspond à un modèle DE-9IM en utilisant ST_RelateMatch.

Variante 3: Comme la variante 2, mais permet de spécifier une Boundary Node Rule. Une boundary node rule permet de contrôler plus finement si les extrémités des multilignes sont considérées comme se situant à l'intérieur ou à la limite du DE-9IM. Les valeurs de boundaryNodeRule sont les suivantes :

  • 1 : OGC-Mod2 - les extrémités des lignes sont dans la frontière si elles apparaissent un nombre impair de fois. C'est la règle définie par la norme SFS de l'OGC, et c'est la valeur par défaut de la ST_Relate.

  • 2 : Endpoint - tous les points d'extrémité sont dans la frontière.

  • 3 : MultivalentEndpoint - les points d'extrémité sont dans la frontière s'ils apparaissent plus d'une fois. En d'autres termes, la frontière est constituée de tous les points d'extrémité "attachés" ou "internes" (mais pas des points d'extrémité "non attachés/externes").

  • 4 : MonovalentEndpoint - les points d'extrémité sont dans la frontière s'ils n'apparaissent qu'une seule fois. En d'autres termes, la frontière est constituée de tous les points d'extrémité "non attachés" ou "extérieurs".

Cette fonction ne figure pas dans la spécification de l'OGC, mais elle est implicite. voir s2.1.13.2

Cette méthode implémente la spécification OGC Simple Features Implementation Specification for SQL 1.1.

s2.1.1.2 // s2.1.13.3

Cette méthode implémente la spécification SQL/MM.

SQL-MM 3 : 5.1.25

Effectué par le module GEOS

Amélioration : 2.0.0 - ajout de la prise en charge de la spécification de boundary node rule.

[Important]

Amélioration : 3.0.0 a permis la prise en charge de GEOMETRYCOLLECTION

Exemples

Utilisation de la fonction booléenne pour tester les relations spatiales.

SELECT ST_Relate('POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2), '0FFFFF212');
st_relate
-----------
t

SELECT ST_Relate(POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2), '*FF*FF212');
st_relate
-----------
t

Test d'un modèle de relation spatiale personnalisé comme condition de requête, avec && pour permettre l'utilisation d'un index spatial.

-- Find compounds that properly intersect (not just touch) a poly (Interior Intersects)

SELECT c.* , p.name As poly_name
    FROM polys AS p
    INNER JOIN compounds As c
          ON c.geom && p.geom
             AND ST_Relate(p.geom, c.geom,'T********');

Calcul de la matrice d'intersection pour les relations spatiales.

SELECT ST_Relate( 'POINT(1 2)',
                  ST_Buffer( 'POINT(1 2)', 2));
-----------
0FFFFF212

SELECT ST_Relate( 'LINESTRING(1 2, 3 4)',
                  'LINESTRING(5 6, 7 8)' );
-----------
FF1FF0102

Utilisation de différentes Boundary Node Rules pour calculer la relation spatiale entre une LineString et une MultiLineString avec une extrémité dupliquée (3 3) :

  • En utilisant la règle OGC-Mod2 (1), l'extrémité dupliquée se trouve dans l' intérieur de la MultiLineString, de sorte que l'entrée de la matrice DE-9IM [aB:bI] est 0 et [aB:bB] est F.

  • En utilisant la règle Endpoint (2), l'extrémité dupliquée se trouve dans la limite de la MultiLineString, de sorte que l'entrée de la matrice DE-9IM [aB:bI] est F et [aB:bB] est 0.

WITH data AS (SELECT
  'LINESTRING(1 1, 3 3)'::geometry AS a_line,
  'MULTILINESTRING((3 3, 3 5), (3 3, 5 3))':: geometry AS b_multiline
)
SELECT ST_Relate( a_line, b_multiline, 1) AS bnr_mod2,
       ST_Relate( a_line, b_multiline, 2) AS bnr_endpoint
    FROM data;

 bnr_mod2  | bnr_endpoint
-----------+--------------
 FF10F0102 | FF1F00102

Voir aussi

Section 5.1, “Déterminer les relations spatiales”, ST_RelateMatch, ST_Contains, ST_ContainsProperly, ST_Covers, ST_CoveredBy, ST_Crosses, ST_Disjoint, ST_Equals, ST_Intersects, ST_Overlaps, ST_Touches, ST_Within