الاسم
ST_ConcaveHull — تحسب شكلاً هندسياً قد يكون مقعّراً يحتوي على جميع رؤوس الشكل المُدخل
المختصر
geometry ST_ConcaveHull(geometry param_geom, float param_pctconvex, boolean param_allow_holes = false);
الوصف
الغلاف المقعّر شكل هندسي مقعّر (عادةً) يحتوي على المُدخل، ورؤوسه مجموعة جزئية من رؤوس المُدخل. وفي الحالة العامة يكون الغلاف المقعّر مضلعاً (Polygon). والغلاف المقعّر لنقطتين أو أكثر على استقامة واحدة هو LineString من نقطتين. والغلاف المقعّر لنقطة واحدة أو أكثر متطابقة هو نقطة (Point). ولن يحتوي المضلع على ثقوب ما لم يُحدَّد الوسيط الاختياري 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 لإصدارات GEOS 3.11+
أمثلة
الغلاف المقعّر لـ 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;
انظر أيضًا
ST_ConvexHull, ST_Collect, ST_AlphaShape, ST_OptimalAlphaShape