الاسم
ST_MakeValid — تحاول جعل شكل هندسي غير صالح صالحًا دون فقدان أي رؤوس.
المختصر
geometry ST_MakeValid(geometry input);
geometry ST_MakeValid(geometry input, text params);
الوصف
تحاول الدالة إنشاء تمثيل صالح لشكل هندسي غير صالح معطى دون فقدان أي من رؤوس المُدخَل. تُعاد الأشكال الهندسية الصالحة دون تغيير.
المُدخَلات المدعومة هي: POINTS وMULTIPOINTS وLINESTRINGS وMULTILINESTRINGS وPOLYGONS وMULTIPOLYGONS وGEOMETRYCOLLECTIONS التي تحتوي على أي مزيج منها.
في حالات الانهيار البُعدي الكلي أو الجزئي، قد يكون الشكل الناتج مجموعة من أشكال هندسية ذات أبعاد أقل أو مساوية، أو شكلًا هندسيًا ذا بعد أقل.
قد تصبح المضلعات المفردة أشكالًا متعددة في حالة التقاطعات الذاتية.
يمكن استخدام الوسيط params لتمرير سلسلة خيارات لاختيار الطريقة المستخدمة لبناء الشكل الهندسي الصالح. سلسلة الخيارات بالصيغة "method=linework|structure keepcollapsed=true|false". إذا لم يُقدَّم الوسيط "params"، تُستخدم خوارزمية "linework" افتراضيًا.
للمفتاح "method" قيمتان.
-
"linework" هي الخوارزمية الأصلية، وتبني أشكالًا هندسية صالحة باستخراج جميع الخطوط أولًا، ثم إنشاء العقد (noding) في تلك الخطوط معًا، ثم بناء مُخرَج من الخطوط.
-
"structure" خوارزمية تميّز بين الحلقات الداخلية والخارجية، وتبني شكلًا هندسيًا جديدًا بتوحيد الحلقات الخارجية، ثم طرح جميع الحلقات الداخلية.
المفتاح "keepcollapsed" صالح لخوارزمية "structure" فقط، ويأخذ القيمة "true" أو "false". عند ضبطه على "false"، تُسقَط مكوّنات الشكل الهندسي التي تنهار إلى بُعد أقل، مثل خط مكوّن من نقطة واحدة.
تُنفَّذ بواسطة وحدة GEOS.
متاحة منذ: 2.0.0
حُسّنت في: 2.0.1، تحسينات في السرعة
حُسّنت في: 2.1.0، أُضيف دعم GEOMETRYCOLLECTION وMULTIPOINT.
حُسّنت في: 3.1.0، أُضيفت إزالة الإحداثيات ذات القيم NaN.
حُسّنت في: 3.2.0، أُضيف خيارا الخوارزمية 'linework' و'structure' اللذان يتطلبان GEOS >= 3.10.0.
تدعم هذه الدالة الأبعاد الثلاثية ولا تُسقط قيمة Z.
أمثلة
![]() before_geom: MULTIPOLYGON من مضلعين متداخلين
![]() after_geom: MULTIPOLYGON من 4 مضلعات غير متداخلة
![]() after_geom_structure: MULTIPOLYGON من مضلع واحد غير متداخل
SELECT f.geom AS before_geom, ST_MakeValid(f.geom) AS after_geom, ST_MakeValid(f.geom, 'method=structure') AS after_geom_structure FROM (SELECT 'MULTIPOLYGON(((186 194,187 194,188 195,189 195,190 195, 191 195,192 195,193 194,194 194,194 193,195 192,195 191, 195 190,195 189,195 188,194 187,194 186,14 6,13 6,12 5,11 5, 10 5,9 5,8 5,7 6,6 6,6 7,5 8,5 9,5 10,5 11,5 12,6 13,6 14,186 194)), ((150 90,149 80,146 71,142 62,135 55,128 48,119 44,110 41,100 40, 90 41,81 44,72 48,65 55,58 62,54 71,51 80,50 90,51 100, 54 109,58 118,65 125,72 132,81 136,90 139,100 140,110 139, 119 136,128 132,135 125,142 118,146 109,149 100,150 90)))'::geometry AS geom) AS f;
|
|
before_geom: MULTIPOLYGON من 6 مضلعات متداخلة
after_geom: MULTIPOLYGON من 14 مضلعًا غير متداخل
after_geom_structure: MULTIPOLYGON من مضلع واحد غير متداخل
SELECT c.geom AS before_geom,
ST_MakeValid(c.geom) AS after_geom,
ST_MakeValid(c.geom, 'method=structure') AS after_geom_structure
FROM (SELECT 'MULTIPOLYGON(((91 50,79 22,51 10,23 22,11 50,23 78,51 90,79 78,91 50)),
((91 100,79 72,51 60,23 72,11 100,23 128,51 140,79 128,91 100)),
((91 150,79 122,51 110,23 122,11 150,23 178,51 190,79 178,91 150)),
((141 50,129 22,101 10,73 22,61 50,73 78,101 90,129 78,141 50)),
((141 100,129 72,101 60,73 72,61 100,73 128,101 140,129 128,141 100)),
((141 150,129 122,101 110,73 122,61 150,73 178,101 190,129 178,141 150)))'::geometry AS geom) AS c;
|
أمثلة
SELECT ST_AsText(ST_MakeValid(
'LINESTRING(0 0, 0 0)',
'method=structure keepcollapsed=true'
));
st_astext
------------
POINT(0 0)
SELECT ST_AsText(ST_MakeValid(
'LINESTRING(0 0, 0 0)',
'method=structure keepcollapsed=false'
));
st_astext
------------------
LINESTRING EMPTY


