الاسم
ST_MakePolygon — تُنشئ مضلعًا من غلاف خارجي وقائمة اختيارية من الثقوب.
المختصر
geometry ST_MakePolygon(geometry linestring);
geometry ST_MakePolygon(geometry outerlinestring, geometry[] interiorlinestrings);
الوصف
تُنشئ مضلعًا مكوّنًا من الغلاف الخارجي المُعطى ومصفوفة اختيارية من الثقوب. يجب أن تكون الأشكال المُدخلة خطوطًا مغلقة (حلقات).
الصيغة 1: تقبل خطًا (LineString) واحدًا يمثّل الغلاف الخارجي.
الصيغة 2: تقبل خطًا (LineString) للغلاف الخارجي ومصفوفة من الخطوط الداخلية (الثقوب). يمكن بناء مصفوفة الأشكال الهندسية باستخدام بُنى PostgreSQL array_agg() أو ARRAY[] أو ARRAY().
|
|
|
لا تقبل هذه الدالة MultiLineString. استخدم ST_LineMerge لتوليد LineString، أو ST_Dump لاستخراج الخطوط. |
تدعم هذه الدالة الأبعاد الثلاثية ولا تُسقط قيمة Z.
أمثلة: صيغة المُدخل الواحد
إنشاء مضلع من خط ثنائي الأبعاد.
SELECT ST_MakePolygon( ST_GeomFromText('LINESTRING(75 29,77 29,77 29, 75 29)'));
إنشاء مضلع من خط مفتوح، باستخدام ST_StartPoint وST_AddPoint لإغلاقه.
SELECT ST_MakePolygon( ST_AddPoint(foo.open_line, ST_StartPoint(foo.open_line)) )
FROM (
SELECT ST_GeomFromText('LINESTRING(75 29,77 29,77 29, 75 29)') As open_line) As foo;
إنشاء مضلع من خط ثلاثي الأبعاد
SELECT ST_AsEWKT( ST_MakePolygon( 'LINESTRING(75.15 29.53 1,77 29 1,77.6 29.5 1, 75.15 29.53 1)')); st_asewkt ----------- POLYGON((75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1))
إنشاء مضلع من خط ذي قياسات
SELECT ST_AsEWKT( ST_MakePolygon( 'LINESTRINGM(75.15 29.53 1,77 29 1,77.6 29.5 2, 75.15 29.53 2)' )); st_asewkt ---------- POLYGONM((75.15 29.53 1,77 29 1,77.6 29.5 2,75.15 29.53 2))
أمثلة: صيغة الغلاف الخارجي مع الثقوب الداخلية
إنشاء مضلع على شكل كعكة مع ثقب إضافي
SELECT ST_MakePolygon( ST_ExteriorRing( ST_Buffer(ring.line,10)),
ARRAY[ ST_Translate(ring.line, 1, 1),
ST_ExteriorRing(ST_Buffer(ST_Point(20,20),1)) ]
)
FROM (SELECT ST_ExteriorRing(
ST_Buffer(ST_Point(10,10),10,10)) AS line ) AS ring;
إنشاء مجموعة من حدود المقاطعات مع ثقوب تمثّل البحيرات. المُدخل جدول من مضلعات المقاطعات (Polygon/MultiPolygon) وجدول من خطوط المياه. تُحدَّد الخطوط المكوّنة للبحيرات باستخدام ST_IsClosed. وتُستخرج خطوط المقاطعات باستخدام ST_Boundary. وكما تتطلب ST_MakePolygon، يُفرض أن تكون الحدود خطًا واحدًا (LineString) باستخدام ST_LineMerge. (لكن لاحظ أنه إذا كانت للمقاطعة أكثر من منطقة أو كانت لها جزر فسينتج عن ذلك مضلع غير صالح.) يضمن استخدام LEFT JOIN تضمين جميع المقاطعات حتى لو لم تكن فيها بحيرات.
|
|
|
تُستخدم بنية CASE لأن تمرير مصفوفة فارغة (null) إلى ST_MakePolygon يؤدي إلى إعادة القيمة NULL. |
SELECT p.gid, p.province_name,
CASE WHEN array_agg(w.geom) IS NULL
THEN p.geom
ELSE ST_MakePolygon( ST_LineMerge(ST_Boundary(p.geom)),
array_agg(w.geom)) END
FROM
provinces p LEFT JOIN waterlines w
ON (ST_Within(w.geom, p.geom) AND ST_IsClosed(w.geom))
GROUP BY p.gid, p.province_name, p.geom;
ثمة أسلوب آخر هو استخدام استعلام فرعي مترابط ومُنشئ ARRAY() الذي يحوّل مجموعة صفوف إلى مصفوفة.
SELECT p.gid, p.province_name,
CASE WHEN EXISTS( SELECT w.geom
FROM waterlines w
WHERE ST_Within(w.geom, p.geom)
AND ST_IsClosed(w.geom))
THEN ST_MakePolygon(
ST_LineMerge(ST_Boundary(p.geom)),
ARRAY( SELECT w.geom
FROM waterlines w
WHERE ST_Within(w.geom, p.geom)
AND ST_IsClosed(w.geom)))
ELSE p.geom
END AS geom
FROM provinces p;