Name

ST_SimplifyPolygonHull — Calcule une enveloppe extérieure ou intérieure simplifiée préservant la topologie d'une géométrie polygonale.

Synopsis

geometry ST_SimplifyPolygonHull(geometry param_geom, float vertex_fraction, boolean is_outer = true);

Description

Calcule une enveloppe extérieure ou intérieure simplifiée préservant la topologie d'une géométrie polygonale. Une enveloppe extérieure couvre complètement la géométrie d'entrée. Une enveloppe intérieure est entièrement couverte par la géométrie d'entrée. Le résultat est une géométrie polygonale formée par un sous-ensemble de sommets d'entrée. Les multipolygones et les trous sont gérés et produisent un résultat ayant la même structure que la géométrie d'entrée.

La réduction du nombre de sommets est contrôlée par le paramètre vertex_fraction, qui est un nombre compris entre 0 et 1. Les valeurs inférieures produisent des résultats plus simples, avec un nombre de vertex plus faible et une concavité moindre. Pour les enveloppes extérieures et intérieures, une fraction de sommet de 1,0 produit la géométrie originale. Pour les enveloppes extérieures, une valeur de 0,0 produit l'enveloppe convexe (pour un polygone unique) ; pour les enveloppes intérieures, elle produit un triangle.

Le processus de simplification consiste à supprimer progressivement les angles concaves qui contiennent le moins de surface, jusqu'à ce que l'objectif de nombre de vertex soit atteint. Il empêche les arêtes de se croiser, de sorte que le résultat est toujours une géométrie polygonale valide.

Pour obtenir de meilleurs résultats avec des géométries contenant des segments de ligne relativement longs, il peut être nécessaire de "segmenter" l'entrée, comme indiqué ci-dessous.

Effectué par le module GEOS.

Disponibilité : 3.3.0.

Nécessite GEOS >= 3.11.0.

Exemples

Enveloppe extérieure d'un polygone

SELECT ST_SimplifyPolygonHull(
  'POLYGON ((131 158, 136 163, 161 165, 173 156, 179 148, 169 140, 186 144, 190 137, 185 131, 174 128, 174 124, 166 119, 158 121, 158 115, 165 107, 161 97, 166 88, 166 79, 158 57, 145 57, 112 53, 111 47, 93 43, 90 48, 88 40, 80 39, 68 32, 51 33, 40 31, 39 34, 49 38, 34 38, 25 34, 28 39, 36 40, 44 46, 24 41, 17 41, 14 46, 19 50, 33 54, 21 55, 13 52, 11 57, 22 60, 34 59, 41 68, 75 72, 62 77, 56 70, 46 72, 31 69, 46 76, 52 82, 47 84, 56 90, 66 90, 64 94, 56 91, 33 97, 36 100, 23 100, 22 107, 29 106, 31 112, 46 116, 36 118, 28 131, 53 132, 59 127, 62 131, 76 130, 80 135, 89 137, 87 143, 73 145, 80 150, 88 150, 85 157, 99 162, 116 158, 115 165, 123 165, 122 170, 134 164, 131 158))',
    0.3);

Enveloppe intérieure d'un polygone

SELECT ST_SimplifyPolygonHull(
  'POLYGON ((131 158, 136 163, 161 165, 173 156, 179 148, 169 140, 186 144, 190 137, 185 131, 174 128, 174 124, 166 119, 158 121, 158 115, 165 107, 161 97, 166 88, 166 79, 158 57, 145 57, 112 53, 111 47, 93 43, 90 48, 88 40, 80 39, 68 32, 51 33, 40 31, 39 34, 49 38, 34 38, 25 34, 28 39, 36 40, 44 46, 24 41, 17 41, 14 46, 19 50, 33 54, 21 55, 13 52, 11 57, 22 60, 34 59, 41 68, 75 72, 62 77, 56 70, 46 72, 31 69, 46 76, 52 82, 47 84, 56 90, 66 90, 64 94, 56 91, 33 97, 36 100, 23 100, 22 107, 29 106, 31 112, 46 116, 36 118, 28 131, 53 132, 59 127, 62 131, 76 130, 80 135, 89 137, 87 143, 73 145, 80 150, 88 150, 85 157, 99 162, 116 158, 115 165, 123 165, 122 170, 134 164, 131 158))',
    0.3, false);

Simplification de l'enveloppe extérieure d'un MultiPolygone, avec segmentation

SELECT ST_SimplifyPolygonHull(
  ST_Segmentize(ST_Letters('xt'), 2.0),
    0.1);