ST_ConcaveHull — 計算可能為凹的幾何形狀,該形狀包含所有輸入幾何頂點
geometry ST_ConcaveHull(
geometry param_geom, float param_pctconvex, boolean param_allow_holes = false)
;
凹包 (Concave hull) 是一個(通常)凹的幾何形狀,它包含輸入,並且其頂點是輸入頂點的子集。在一般情況下,凹包是一個多邊形。兩個或多個共線點的凹包是一條兩點的 LineString。一個或多個相同點的凹包是一個點。除非將可選的 param_allow_holes
參數指定為 true,否則多邊形將不包含孔洞。
您可以將凹包視為一組點的「收縮包裝」。這與 凸包 不同,凸包更像是將橡皮筋繞在點周圍。凹包通常具有較小的面積,並且代表輸入點更自然的邊界。
param_pctconvex
控制計算出的包的凹度。值為 1 會產生凸包。介於 1 和 0 之間的值會產生凹度增加的包。值為 0 會產生具有最大凹度的包(但仍然是單個多邊形)。選擇合適的值取決於輸入資料的性質,但通常介於 0.3 和 0.1 之間的值會產生合理的結果。
![]() |
|
從技術上講, |
對於點和線性的輸入,包將包圍所有輸入的點。對於多邊形輸入,包將包圍輸入的所有點以及輸入覆蓋的所有區域。如果您想要多邊形輸入的逐點包,請先使用 ST_Points 將其轉換為點。
這不是一個聚合函數。要計算一組幾何形狀的凹包,請使用 ST_Collect(例如,ST_ConcaveHull( ST_Collect( geom ), 0.80)
)。
可用性:2.0.0
增強功能:3.3.0,為 GEOS 3.11+ 啟用 GEOS 原生實作
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))
MultiPoint 的凹包,允許孔洞
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))
![]()
|
![]()
|
比較多邊形的凹包與組成點的凹包。該包尊重多邊形的邊界,而基於點的包則不然。
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;
與 ST_Collect 一起使用以計算幾何集合的凹包。
-- 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;