GISarabia.org
PostGIS › الدليل الرسمي › 7. مرجع PostGIS › 7.3. دوال إنشاء الأشكال الهندسية
PostGIS 3.6 · Official Manual · ترجمة عربية

ST_MakePolygon

الصفحة الأصلية بالإنجليزية postgis.net ↗

الاسم

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;

انظر أيضًا

ST_BuildArea ST_Polygon