名稱

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+)。

對於已索引的細分數據集,點在多邊形內和其他空間操作通常會更快。由於各部分的邊界框通常比原始幾何圖形的邊界框覆蓋的面積小,因此索引查詢產生的「命中」情況較少。「命中」情況速度更快,因為索引重新檢查過程執行的空間操作點較少。

[Note]

這是一個返回集合的函數 (SRF),它會返回一組包含單個幾何值的資料列。它可以用在 SELECT 列表或 FROM 子句中,以產生一個結果集,其中每個結果幾何都有一個記錄。

由 GEOS 模組執行。

可用性:2.2.0

增強功能:2.5.0 重用多邊形分割上的現有頂點,頂點計數從 8 個減少到 5 個。

增強功能:3.1.0 接受 gridSize 參數。

需要 GEOS >= 3.9.0 才能使用 gridSize 參數

範例

範例: 將多邊形細分為頂點數不超過 10 個的部分,並為每個部分分配一個唯一的 ID。

細分為最多 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))
  

範例: 使用 ST_Segmentize(geography, distance) 加密一個長的地理線,並使用 ST_Subdivide 將產生的線分割成 8 個頂點的子線。

加密且分割的線。

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;