ST_LineSubstring — 傳回線段中兩個分數位置之間的部分。
geometry ST_LineSubstring(
geometry a_linestring, float8 startfraction, float8 endfraction)
;
geography ST_LineSubstring(
geography a_linestring, float8 startfraction, float8 endfraction)
;
計算輸入線段中,從給定的分數位置開始和結束的部分。第一個參數必須是 LINESTRING。第二個和第三個參數是介於 [0, 1] 範圍內的值,表示起點和終點位置佔線段長度的比例。如果存在 Z 和 M 值,則會對新增的端點進行內插。
如果 startfraction
和 endfraction
的值相同,則等同於 ST_LineInterpolatePoint。
![]() |
|
此函式僅適用於 LINESTRING。若要在連續的 MULTILINESTRING 上使用,請先使用 ST_LineMerge 將其合併。 |
![]() |
|
自 1.1.1 版本起,此函式會內插 M 和 Z 值。之前的版本將 Z 和 M 設定為未指定的值。 |
增強功能:3.4.0 - 引入了對 geography 的支援。
已變更:2.1.0。在 2.0.x 版本之前,此函式稱為 ST_Line_Substring。
可用性:1.1.0,1.1.1 版本新增了對 Z 和 M 的支援
此函式支援 3D,且不會捨棄 z 索引。
一個 LineString,疊加顯示 1/3 中間範圍 (0.333, 0.666)
SELECT ST_AsText(ST_LineSubstring( 'LINESTRING (20 180, 50 20, 90 80, 120 40, 180 150)', 0.333, 0.666)); ------------------------------------------------------------------------------------------------ LINESTRING (45.17311810399485 45.74337011202746, 50 20, 90 80, 112.97593050157862 49.36542599789519)
如果起點和終點位置相同,則結果為 POINT。
SELECT ST_AsText(ST_LineSubstring( 'LINESTRING(25 50, 100 125, 150 190)', 0.333, 0.333)); ------------------------------------------ POINT(69.2846934853974 94.2846934853974)
將 LineString 切割成長度為 100 或更短的段的查詢。它使用 generate_series()
與 CROSS JOIN LATERAL 來產生等效於 FOR 迴圈的效果。
WITH data(id, geom) AS (VALUES ( 'A', 'LINESTRING( 0 0, 200 0)'::geometry ), ( 'B', 'LINESTRING( 0 100, 350 100)'::geometry ), ( 'C', 'LINESTRING( 0 200, 50 200)'::geometry ) ) SELECT id, i, ST_AsText( ST_LineSubstring( geom, startfrac, LEAST( endfrac, 1 )) ) AS geom FROM ( SELECT id, geom, ST_Length(geom) len, 100 sublen FROM data ) AS d CROSS JOIN LATERAL ( SELECT i, (sublen * i) / len AS startfrac, (sublen * (i+1)) / len AS endfrac FROM generate_series(0, floor( len / sublen )::integer ) AS t(i) -- skip last i if line length is exact multiple of sublen WHERE (sublen * i) / len <> 1.0 ) AS d2; id | i | geom ----+---+----------------------------- A | 0 | LINESTRING(0 0,100 0) A | 1 | LINESTRING(100 0,200 0) B | 0 | LINESTRING(0 100,100 100) B | 1 | LINESTRING(100 100,200 100) B | 2 | LINESTRING(200 100,300 100) B | 3 | LINESTRING(300 100,350 100) C | 0 | LINESTRING(0 200,50 200)
Geography 實作沿著橢圓體測量,geometry 沿著線測量
SELECT ST_AsText(ST_LineSubstring( 'LINESTRING(-118.2436 34.0522, -71.0570 42.3611)'::geography, 0.333, 0.666),6) AS geog_sub , ST_AsText(ST_LineSubstring('LINESTRING(-118.2436 34.0522, -71.0570 42.3611)'::geometry, 0.333, 0.666),6) AS geom_sub; --------------------------------------------------------------- geog_sub | LINESTRING(-104.167064 38.854691,-87.674646 41.849854) geom_sub | LINESTRING(-102.530462 36.819064,-86.817324 39.585927)