名称

ST_Segmentize — 返回修改后的几何/地理对象,其任何线段的长度都不超过给定距离。

概要

geometry ST_Segmentize(geometry geom, float max_segment_length);

geography ST_Segmentize(geography geog, float max_segment_length);

描述

返回一个修改后的几何/地理对象,其中任何线段的长度都不超过 max_segment_length。长度计算基于2D。线段总是被分割成长度相等的子线段。

  • 对于几何对象,最大长度单位与空间参考系统的单位相同。

  • 对于地理对象,最大长度单位为米。距离在球面上计算。沿线段端点定义的球面大圆弧创建添加的顶点。

[Note]

此函数仅缩短较长的线段。它不会加长短于最大长度的线段。

[Warning]

对于包含长线段的输入,指定相对较短的 max_segment_length 可能会导致添加大量的顶点。如果参数被意外指定为线段数量,而不是最大长度,则可能会意外发生这种情况。

可用性: 1.2.2

增强: 3.0.0 分段几何对象现在生成长度相等的子线段

增强: 2.3.0 分段地理对象现在生成长度相等的子线段

增强: 2.1.0 引入了对地理对象的支持。

更改: 2.1.0 由于引入了对地理对象的支持,使用 ST_Segmentize('LINESTRING(1 2, 3 4)', 0.5) 会导致函数歧义错误。输入需要被正确地键入为几何或地理对象。请使用 ST_GeomFromText、ST_GeogFromText 或强制转换为所需的类型(例如, ST_Segmentize('LINESTRING(1 2, 3 4)'::geometry, 0.5) )

示例

分割一条线。长线段被均匀分割,短线段不会被分割。

SELECT ST_AsText(ST_Segmentize(
    'MULTILINESTRING((0 0, 0 1, 0 9),(1 10, 1 18))'::geometry,
	5 ) );
---------------------------------------------------
MULTILINESTRING((0 0,0 1,0 5,0 9),(1 10,1 14,1 18))

分割一个多边形

SELECT ST_AsText(
        ST_Segmentize(('POLYGON((0 0, 0 8, 30 0, 0 0))'::geometry), 10));
-------------------------------------------------------
POLYGON((0 0,0 8,7.5 6,15 4,22.5 2,30 0,20 0,10 0,0 0))

分割一条地理线,使用 2000 公里的最大线段长度。顶点沿着连接端点的大圆弧添加。

SELECT ST_AsText(
        ST_Segmentize(('LINESTRING (0 0, 60 60)'::geography), 2000000));
-------------------------------------------------------------
LINESTRING(0 0,4.252632294621186 8.43596525986862,8.69579947419404 16.824093489701564,13.550465473227048 25.107950473646188,19.1066053508691 33.21091076089908,25.779290201459894 41.01711439406505,34.188839517966954 48.337222885886,45.238153936612264 54.84733442373889,60 60)

一条沿着大圆弧分割的地理线

另请参阅

ST_LineSubstring