GISarabia.org
PostGIS › الدليل الرسمي › 7. مرجع PostGIS › 7.13. دوال التراكب
PostGIS 3.6 · Official Manual · ترجمة عربية

ST_Subdivide

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

الاسم

ST_Subdivide — تحسب تقسيماً متعامد الخطوط لشكل هندسي.

المختصر

setof geometry ST_Subdivide(geometry geom, integer max_vertices=256, float8 gridSize = -1);

الوصف

تُعيد مجموعة من الأشكال الهندسية الناتجة عن تقسيم geom إلى أجزاء باستخدام خطوط متعامدة، بحيث لا يحتوي كل جزء على أكثر من max_vertices.

يجب أن تكون قيمة max_vertices مساوية لـ 5 أو أكثر، إذ يلزم 5 نقاط لتمثيل مستطيل مغلق.

إذا أُعطي المعامل الاختياري gridSize (يتطلب GEOS-3.9.0 أو أحدث)، فمن المضمون أن تقع جميع رؤوس النتيجة على شبكة بالحجم المحدد. ولكي تعطي العملية نتائج متوقعة يجب أن تقع جميع رؤوس المدخلات مسبقًا على الشبكة المحددة، انظر ST_ReducePrecision.

عادةً ما تكون عمليات النقطة داخل المضلع والعمليات المكانية الأخرى أسرع على مجموعات البيانات المقسّمة والمفهرسة. فبما أن المستطيلات المحيطة بالأجزاء تغطي عادةً مساحة أصغر من المستطيل المحيط بالشكل الأصلي، تُنتج استعلامات الفهرس حالات "إصابة" أقل. كما أن حالات "الإصابة" أسرع لأن العمليات المكانية التي تُنفّذها إعادة فحص الفهرس تعالج نقاطاً أقل.

[ملاحظة]

When casting a subdivided geometry to geography, the resulting geography may differ from the original. Subdivision adds vertices in planar (geometry) space. If vertices are inserted along the boundary, they will alter the geographical representation, where edges are interpreted as geodesic segments. To minimize distortion, first densify the geography using ST_Segmentize to add geodesic vertices, then cast to geometry before subdivision.

[ملاحظة]

هذه دالة مُعيدة لمجموعة (SRF) تُعيد مجموعة من الصفوف تحتوي على قيم هندسية مفردة. ويمكن استخدامها في قائمة SELECT أو في عبارة FROM لإنتاج مجموعة نتائج بسجل واحد لكل شكل هندسي ناتج.

تُنفَّذ بواسطة وحدة GEOS.

متاحة منذ: 2.2.0

حُسّنت في: 2.5.0 تُعيد استخدام النقاط الموجودة عند تقسيم المضلع، وخُفّض عدد الرؤوس من 8 إلى 5.

حُسّنت في: 3.1.0 قبول المعامل gridSize.

تتطلب GEOS >= 3.9.0 لاستخدام المعامل gridSize

أمثلة

مثال: تقسيم مضلع إلى أجزاء لا يزيد كل منها على 10 رؤوس، وإسناد معرّف فريد لكل جزء.

مقسّم إلى 10 رؤوس كحد أقصى

SELECT row_number() OVER() As rn, ST_AsText(geom) As wkt
    FROM (SELECT ST_SubDivide(
        'POLYGON((132 10,119 23,85 35,68 29,66 28,49 42,32 56,22 64,32 110,40 119,36 150,
        57 158,75 171,92 182,114 184,132 186,146 178,176 184,179 162,184 141,190 122,
        190 100,185 79,186 56,186 52,178 34,168 18,147 13,132 10))'::geometry,10))  AS f(geom);
rn │                                                      wkt
────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  1 │ POLYGON((119 23,85 35,68 29,66 28,32 56,22 64,29.8260869565217 100,119 100,119 23))
  2 │ POLYGON((132 10,119 23,119 56,186 56,186 52,178 34,168 18,147 13,132 10))
  3 │ POLYGON((119 56,119 100,190 100,185 79,186 56,119 56))
  4 │ POLYGON((29.8260869565217 100,32 110,40 119,36 150,57 158,75 171,92 182,114 184,114 100,29.8260869565217 100))
  5 │ POLYGON((114 184,132 186,146 178,176 184,179 162,184 141,190 122,190 100,114 100,114 184))
  

Example: Densify a long geography line using ST_Segmentize(geography, distance), and use ST_Subdivide to split the resulting line into sublines of 8 vertices. Densification minimizes the impact of changes to the geography representation of a geometry when subdividing.

الخطوط المكثّفة والمقسّمة.

SELECT ST_AsText( ST_Subdivide(
            ST_Segmentize('LINESTRING(0 0, 85 85)'::geography,
                          1200000)::geometry,    8));
LINESTRING(0 0,0.487578359029357 5.57659056746196,0.984542144675897 11.1527721155093,1.50101059639722 16.7281035483571,1.94532113630331 21.25)
LINESTRING(1.94532113630331 21.25,2.04869538062779 22.3020741387339,2.64204641967673 27.8740533545155,3.29994062412787 33.443216802941,4.04836719489742 39.0084282520239,4.59890468420694 42.5)
LINESTRING(4.59890468420694 42.5,4.92498503922732 44.5680389206321,5.98737409390639 50.1195229244701,7.3290919767674 55.6587646879025,8.79638749938413 60.1969505994924)
LINESTRING(8.79638749938413 60.1969505994924,9.11375579533779 61.1785363177625,11.6558166691368 66.6648504160202,15.642041247655 72.0867690601745,22.8716627200212 77.3609628116894,24.6991785131552 77.8939011989848)
LINESTRING(24.6991785131552 77.8939011989848,39.4046096622744 82.1822848017636,44.7994523421035 82.5156766227011)
LINESTRING(44.7994523421035 82.5156766227011,85 85)

مثال: تقسيم الأشكال الهندسية المعقّدة في جدول في مكانها. تُحذف سجلات الأشكال الأصلية من الجدول المصدر، وتُدرج سجلات جديدة لكل شكل ناتج عن التقسيم.


WITH complex_areas_to_subdivide AS (
    DELETE from polygons_table
    WHERE ST_NPoints(geom) 
> 255
    RETURNING id, column1, column2, column3, geom
)
INSERT INTO polygons_table (fid, column1, column2, column3, geom)
    SELECT fid, column1, column2, column3,
           ST_Subdivide(geom, 255) as geom
    FROM complex_areas_to_subdivide;

مثال: إنشاء جدول جديد يحتوي على الأشكال المقسّمة، مع الاحتفاظ بمفتاح الشكل الأصلي حتى يمكن ربط الجدول الجديد بالجدول المصدر. ولأن ST_Subdivide دالة مُعيدة لمجموعة (جدولية) تُعيد مجموعة من الصفوف أحادية القيمة، فإن هذه الصياغة تُنتج تلقائياً جدولاً فيه صف واحد لكل جزء ناتج.

CREATE TABLE subdivided_geoms AS
    SELECT pkey, ST_Subdivide(geom) AS geom
    FROM original_geoms;