Name

ST_LineSubstring — 返回两个小数位置之间的线的一部分。

Synopsis

geometry ST_LineSubstring(geometry a_linestring, float8 startfraction, float8 endfraction);

描述

计算在给定分数位置开始和结束的输入行的部分。第一个参数必须是LINESTRING。第二个和第三个参数是范围[0,1]中的值,将开始和结束位置表示为线长度的分数。如果存在添加的端点,则会对Z值和M值进行内插。

如果 startfractionendfraction 具有与此等效值相同的值 ST_LineInterpolatePoint

[Note]

这仅适用于LINESTRING。要在连续的多行字符串上使用,请首先使用 ST_LineMerge

[Note]

从版本1.1.1开始,此函数对M值和Z值进行内插。以前的版本将Z和M设置为未指定的值。

可用性:1.1.1中增加了1.1.0、Z和M支持

更改:2.1.0。直到2.0.x,这被称为ST_Line_Substring。

This function supports 3d and will not drop the z-index.

示例

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)

如果起点位置和终点位置相同,则结果是一个点。

SELECT ST_AsText(ST_LineSubstring( 'LINESTRING(25 50, 100 125, 150 190)', 0.333, 0.333));
------------------------------------------
 POINT(69.2846934853974 94.2846934853974)

将线串剪切为长度为100或更短的部分的查询。它用 generate_series() 使用横向交叉联接来生成等同于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)

另请参阅

ST_Length, ST_LineInterpolatePoint, ST_LineMerge