Name

ST_Snap — Accrocher les segments et les sommets de la géométrie d'entrée aux sommets d'une géométrie de référence.

Synopsis

geometry ST_Snap(geometry input, geometry reference, float tolerance);

Description

Accroche les sommets et les segments d'une géométrie aux sommets d'une autre géométrie. Une tolérance de distance d'accrochage est utilisée pour contrôler l'endroit où l'accrochage est effectué. La géométrie résultante est la géométrie d'entrée avec les sommets accrochés. Si aucun accrochage n'a lieu, la géométrie d'entrée est renvoyée inchangée.

L'accrochage d'une géométrie à une autre peut améliorer la robustesse des opérations de superposition en éliminant les arêtes presque coïncidentes (qui posent des problèmes lors du noding et du calcul de l'intersection).

Un accrochage trop important peut entraîner la création d'une topologie non valide, c'est pourquoi le nombre et l'emplacement des sommets accrochés sont décidés à l'aide d'une heuristique pour déterminer quand il est sûr d'accrocher. Cela peut toutefois entraîner l'omission de certains accrochages potentiels.

[Note]

La géométrie renvoyée peut perdre sa simplicité (voir ST_IsSimple) et sa validité (voir ST_IsValid).

Effectué par le module GEOS.

Disponibilité : 2.0.0

Exemples

Un multipolygone représenté par une ligne (avant tout accrochage)

Un multipolygone est accroché à une ligne de référence avec une tolérance de 1,01 de la distance. Le nouveau multipolygone est représenté avec la ligne de référence

SELECT ST_AsText(ST_Snap(poly,line, ST_Distance(poly,line)*1.01)) AS polysnapped
FROM (SELECT
   ST_GeomFromText('MULTIPOLYGON(
     ((26 125, 26 200, 126 200, 126 125, 26 125 ),
      ( 51 150, 101 150, 76 175, 51 150 )),
      (( 151 100, 151 200, 176 175, 151 100 )))') As poly,
       ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line
        ) As foo;

                             polysnapped
---------------------------------------------------------------------
 MULTIPOLYGON(((26 125,26 200,126 200,126 125,101 100,26 125),
 (51 150,101 150,76 175,51 150)),((151 100,151 200,176 175,151 100)))
                                

Un multipolygone est accroché à une ligne de référence avec une tolérance de 1,25 de la distance. Le nouveau multipolygone est représenté avec la ligne de référence

SELECT ST_AsText(
    ST_Snap(poly,line, ST_Distance(poly,line)*1.25)
  ) AS polysnapped
FROM (SELECT
  ST_GeomFromText('MULTIPOLYGON(
    (( 26 125, 26 200, 126 200, 126 125, 26 125 ),
      ( 51 150, 101 150, 76 175, 51 150 )),
      (( 151 100, 151 200, 176 175, 151 100 )))') As poly,
       ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line
        ) As foo;

                             polysnapped
---------------------------------------------------------------------
MULTIPOLYGON(((5 107,26 200,126 200,126 125,101 100,54 84,5 107),
(51 150,101 150,76 175,51 150)),((151 100,151 200,176 175,151 100)))
                                

La ligne s'est accrochée au multipolygone d'origine avec une tolérance de 1,01 de la distance. La nouvelle ligne est représentée avec le multipolygone de référence

SELECT ST_AsText(
   ST_Snap(line, poly, ST_Distance(poly,line)*1.01)
  ) AS linesnapped
FROM (SELECT
  ST_GeomFromText('MULTIPOLYGON(
     ((26 125, 26 200, 126 200, 126 125, 26 125),
      (51 150, 101 150, 76 175, 51 150 )),
      ((151 100, 151 200, 176 175, 151 100)))') As poly,
       ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line
        ) As foo;

              linesnapped
----------------------------------------
 LINESTRING(5 107,26 125,54 84,101 100)
                                

La ligne s'est accrochée au multipolygone d'origine avec une tolérance de 1,25 de la distance. La nouvelle ligne est représentée avec le multipolygone de référence

SELECT ST_AsText(
 ST_Snap(line, poly, ST_Distance(poly,line)*1.25)
  ) AS linesnapped
FROM (SELECT
  ST_GeomFromText('MULTIPOLYGON(
     (( 26 125, 26 200, 126 200, 126 125, 26 125 ),
      (51 150, 101 150, 76 175, 51 150 )),
      ((151 100, 151 200, 176 175, 151 100 )))') As poly,
       ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line
        ) As foo;
              linesnapped
---------------------------------------
LINESTRING(26 125,54 84,101 100)
                                

Voir aussi

ST_SnapToGrid