Name

ST_ConcaveHull — Calcule une géométrie éventuellement concave qui contient tous les sommets de la géométrie d'entrée

Synopsis

geometry ST_ConcaveHull(geometry param_geom, float param_pctconvex, boolean param_allow_holes = false);

Description

Une enveloppe concave est une géométrie (généralement) concave qui contient l'entrée et dont les sommets sont un sous-ensemble des sommets de l'entrée. Dans le cas général, l'enveloppe concave est un polygone. L'enveloppe concave de deux ou plusieurs points colinéaires est une ligne à deux points. L'enveloppe concave d'un ou plusieurs points identiques est un Point. Le polygone ne contiendra pas de trous à moins que l'argument facultatif param_allow_holes ne soit spécifié comme vrai.

On peut considérer qu'une enveloppe concave "rétrécit" un ensemble de points. Cela diffère de la convex hull, qui revient à enrouler un élastique autour des points. Une enveloppe concave a généralement une surface plus petite et représente une limite plus naturelle pour les points d'entrée.

La param_pctconvex contrôle la concavité de l'enveloppe calculée. Une valeur de 1 produit une enveloppe convexe. Les valeurs comprises entre 1 et 0 produisent des enveloppes de concavité croissante. Une valeur de 0 produit une enveloppe avec une concavité maximale (mais toujours un polygone unique). Le choix d'une valeur appropriée dépend de la nature des données d'entrée, mais des valeurs comprises entre 0,3 et 0,1 produisent souvent des résultats raisonnables.

[Note]

Techniquement, la param_pctconvex détermine une longueur comme une fraction de la différence entre les arêtes les plus longues et les plus courtes dans la triangulation de Delaunay des points d'entrée. Les arêtes plus longues que cette longueur sont "érodées" de la triangulation. Les triangles restants forment l'enveloppe concave.

Pour les entrées ponctuelles et linéaires, l'enveloppe englobe tous les points de l'entrée. Pour les entrées polygonales, l'enveloppe englobera tous les points de l'entrée et aussi toutes les zones couvertes par l'entrée. Si vous souhaitez obtenir une enveloppe ponctuelle d'une entrée polygonale, convertissez-la d'abord en points à l'aide de ST_Points.

Il ne s'agit pas d'une fonction d'agrégation. Pour calculer l'enveloppe concave d'un ensemble de géométries, utilisez ST_Collect (par exemple ST_ConcaveHull( ST_Collect( geom ), 0.80).

Disponibilité : 2.0.0

Amélioré : 3.3.0, implémentation native de GEOS activée pour GEOS 3.11+

Exemples

Enveloppe concave d'un MultiPoint

SELECT ST_AsText( ST_ConcaveHull(
        'MULTIPOINT ((10 72), (53 76), (56 66), (63 58), (71 51), (81 48), (91 46), (101 45), (111 46), (121 47), (131 50), (140 55), (145 64), (144 74), (135 80), (125 83), (115 85), (105 87), (95 89), (85 91), (75 93), (65 95), (55 98), (45 102), (37 107), (29 114), (22 122), (19 132), (18 142), (21 151), (27 160), (35 167), (44 172), (54 175), (64 178), (74 180), (84 181), (94 181), (104 181), (114 181), (124 181), (134 179), (144 177), (153 173), (162 168), (171 162), (177 154), (182 145), (184 135), (139 132), (136 142), (128 149), (119 153), (109 155), (99 155), (89 155), (79 153), (69 150), (61 144), (63 134), (72 128), (82 125), (92 123), (102 121), (112 119), (122 118), (132 116), (142 113), (151 110), (161 106), (170 102), (178 96), (185 88), (189 78), (190 68), (189 58), (185 49), (179 41), (171 34), (162 29), (153 25), (143 23), (133 21), (123 19), (113 19), (102 19), (92 19), (82 19), (72 21), (62 22), (52 25), (43 29), (33 34), (25 41), (19 49), (14 58), (21 73), (31 74), (42 74), (173 134), (161 134), (150 133), (97 104), (52 117), (157 156), (94 171), (112 106), (169 73), (58 165), (149 40), (70 33), (147 157), (48 153), (140 96), (47 129), (173 55), (144 86), (159 67), (150 146), (38 136), (111 170), (124 94), (26 59), (60 41), (71 162), (41 64), (88 110), (122 34), (151 97), (157 56), (39 146), (88 33), (159 45), (47 56), (138 40), (129 165), (33 48), (106 31), (169 147), (37 122), (71 109), (163 89), (37 156), (82 170), (180 72), (29 142), (46 41), (59 155), (124 106), (157 80), (175 82), (56 50), (62 116), (113 95), (144 167))',
         0.1 ) );
---st_astext--
POLYGON ((18 142, 21 151, 27 160, 35 167, 44 172, 54 175, 64 178, 74 180, 84 181, 94 181, 104 181, 114 181, 124 181, 134 179, 144 177, 153 173, 162 168, 171 162, 177 154, 182 145, 184 135, 173 134, 161 134, 150 133, 139 132, 136 142, 128 149, 119 153, 109 155, 99 155, 89 155, 79 153, 69 150, 61 144, 63 134, 72 128, 82 125, 92 123, 102 121, 112 119, 122 118, 132 116, 142 113, 151 110, 161 106, 170 102, 178 96, 185 88, 189 78, 190 68, 189 58, 185 49, 179 41, 171 34, 162 29, 153 25, 143 23, 133 21, 123 19, 113 19, 102 19, 92 19, 82 19, 72 21, 62 22, 52 25, 43 29, 33 34, 25 41, 19 49, 14 58, 10 72, 21 73, 31 74, 42 74, 53 76, 56 66, 63 58, 71 51, 81 48, 91 46, 101 45, 111 46, 121 47, 131 50, 140 55, 145 64, 144 74, 135 80, 125 83, 115 85, 105 87, 95 89, 85 91, 75 93, 65 95, 55 98, 45 102, 37 107, 29 114, 22 122, 19 132, 18 142))
    

Enveloppe concave d'un MultiPoint, autorisant des trous

SELECT ST_AsText( ST_ConcaveHull(
        'MULTIPOINT ((132 64), (114 64), (99 64), (81 64), (63 64), (57 49), (52 36), (46 20), (37 20), (26 20), (32 36), (39 55), (43 69), (50 84), (57 100), (63 118), (68 133), (74 149), (81 164), (88 180), (101 180), (112 180), (119 164), (126 149), (132 131), (139 113), (143 100), (150 84), (157 69), (163 51), (168 36), (174 20), (163 20), (150 20), (143 36), (139 49), (132 64), (99 151), (92 138), (88 124), (81 109), (74 93), (70 82), (83 82), (99 82), (112 82), (126 82), (121 96), (114 109), (110 122), (103 138), (99 151), (34 27), (43 31), (48 44), (46 58), (52 73), (63 73), (61 84), (72 71), (90 69), (101 76), (123 71), (141 62), (166 27), (150 33), (159 36), (146 44), (154 53), (152 62), (146 73), (134 76), (143 82), (141 91), (130 98), (126 104), (132 113), (128 127), (117 122), (112 133), (119 144), (108 147), (119 153), (110 171), (103 164), (92 171), (86 160), (88 142), (79 140), (72 124), (83 131), (79 118), (68 113), (63 102), (68 93), (35 45))',
         0.15, true ) );
---st_astext--
POLYGON ((43 69, 50 84, 57 100, 63 118, 68 133, 74 149, 81 164, 88 180, 101 180, 112 180, 119 164, 126 149, 132 131, 139 113, 143 100, 150 84, 157 69, 163 51, 168 36, 174 20, 163 20, 150 20, 143 36, 139 49, 132 64, 114 64, 99 64, 81 64, 63 64, 57 49, 52 36, 46 20, 37 20, 26 20, 32 36, 35 45, 39 55, 43 69), (88 124, 81 109, 74 93, 83 82, 99 82, 112 82, 121 96, 114 109, 110 122, 103 138, 92 138, 88 124))
    

polygon_hull

points_hull

Comparaison entre l'enveloppe concave d'un polygone et l'enveloppe concave des points qui le composent. L'enveloppe respecte les limites du polygone, ce qui n'est pas le cas de l'enveloppe basée sur les points.

WITH data(geom) AS (VALUES
   ('POLYGON ((10 90, 39 85, 61 79, 50 90, 80 80, 95 55, 25 60, 90 45, 70 16, 63 38, 60 10, 50 30, 43 27, 30 10, 20 20, 10 90))'::geometry)
)
SELECT  ST_ConcaveHull( geom,            0.1) AS polygon_hull,
        ST_ConcaveHull( ST_Points(geom), 0.1) AS points_hull
    FROM data;

Utilisation avec ST_Collect pour calculer l'enveloppe concave d'un ensemble géométrique.

-- Compute estimate of infected area based on point observations
SELECT disease_type,
    ST_ConcaveHull( ST_Collect(obs_pnt), 0.3 ) AS geom
  FROM disease_obs
  GROUP BY disease_type;

Voir aussi

ST_ConvexHull, ST_Collect, ST_AlphaShape, ST_OptimalAlphaShape