• 金仓数据库 KingbaseGIS 使用手册(6.14. 几何对象处理函数)


    6.14. 几何对象处理函数

    6.14.1. ST_Buffer

    ST_Buffer — 对 geometry 类型对象来说,返回以给定点为中心点,距离小于或等于指定距离的所有点组成的几何对象。计算方式是按照 spatial_ref_sys 表中对该类型的几何对象的描述来计算的。对于 geography 类型对象:使用一个 2D 维度转换包装器。

    buffer_style 参数控制如下:

    quad_segs=#,endcap=round|flat|square,join=round|mitre|bevel,mitre_limit=#.#

    用法

    geometry ST_Buffer(geometry g1, float radius_of_buffer);
    geometry ST_Buffer(geometry g1, float radius_of_buffer, integer num_seg_quarter_circle);
    geometry ST_Buffer(geometry g1, float radius_of_buffer, text buffer_style_parameters);
    geography ST_Buffer(geography g1, float radius_of_buffer_in_meters);

    描述

    对 geometry 类型对象来说,返回以给定点为中心点,距离小于或等于指定距离的所有点组成的几何对象。计算方式是按照 spatial_ref_sys 表中对该类型的几何对象的描述来计算的。对于 geography 类型对象:使用一个 2D 维度转换包装器。

    注意

    负值半径:对于 polygon 对象来说,使用负值的半径,这意味着收缩 polygon,而不是扩展它。

    注意

    geography 类型对象:对 geography 类型对象的来说,该函数实际上是对 geometry 类型实现的简单包装。它首先会选择一个适用于 geography 对象的 bounding box 的最佳 SRID 值。(偏向于使用参考系 UTM, Lambert Azimuthal Equal Area (LAEA),南北极,最差的情况是使用 Mercator 墨卡托投影) ,然后在平面空间参考系中做缓冲,最后再重新转换到 WGS 84 地理参考系中

    对于 geography 类型对象来说,如果输入对象大到跨了两个 UTM 十区或者穿过了国际日期变更线,那么输出结果可能和预想的有不同

    需要版本 GEOS >= 3.2 来充分利用 geometry 功能

    第三个参数(目前只支持 geometry 类型):可以指定一个分隔四分之一圆的弧段的数量(默认四分之圆做 7 次分隔,即 8 个弧段)或者空格分隔键值对参数:

    'quad_segs=#' : 用来近似四分之一圆的弧段数,默认是 8

    'endcap=round|flat|square' : endcap 方式 (默认是 "round", 需要 GEOS-3.2 或更高版本支持). 'butt' 和 “flat” 意义等价,也可以是参数值

    'join=round|mitre|bevel' : join 方式 (默认是 "round", 需要 GEOS-3.2 或更高版本支持). 'miter' 和 'mitre' 意义等价,也可以是参数值

    'mitre_limit=#.#' : 切割率限制 (只影响 miter 方式的 join). 'miter_limit' 和 'mitre_limit' 意义等价,也可以是参数值半径单位以空间参考系规定的单位为准

    输入参数可以是 POINTS, MULTIPOINTS, LINESTRINGS, MULTILINESTRINGS, POLYGONS, MULTIPOLYGONS, 和 GeometryCollections 等类型

    注意

    该函数不考虑第三维度 (z 坐标),即便输入对象是一个 3D 几何对象,返回的也是 2D 的 buffer

    该函数由 GEOS 模块支持.

    该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.3

    该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 5.1.17

    注意

    用户经常错误性地使用该函数来做半径搜索。创建一个缓冲区来做半径搜索是很慢且无效的。应该使用函数 ST_DWithin 来处理.

    样例

    -- A buffered point forcing approximation of (see diagram) -- 2 points per circle is poly with 8 sides (see diagram) SELECT ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50)) As promisingcircle_pcount, ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 2)) As lamecircle_pcount; promisingcircle_pcount | lamecircle_pcount ------------------------+------------------- 33 | 9 --A lighter but lamer circle -- only 2 points per quarter circle is an octagon --Below is a 100 meter octagon -- 注意 coordinates are in NAD 83 long lat which we transform to Mass state plane meter and then buffer to get measurements in meters; SELECT ST_AsText(ST_Buffer( ST_Transform( ST_SetSRID(ST_MakePoint(-71.063526, 42.35785),4269), 26986),100,2)) As octagon; ---------------------- POLYGON((236057.59057465 900908.759918696,236028.301252769 900838.049240578,235 957.59057465 900808.759918696,235886.879896532 900838.049240578,235857.59057465 900908.759918696,235886.879896532 900979.470596815,235957.59057465 901008.759918 696,236028.301252769 900979.470596815,236057.59057465 900908.759918696))

    参考

    ST_Collect, ST_DWithin, ST_SetSRID, ST_Transform, ST_Union

    6.14.2. ST_BuildArea

    ST_BuildArea — 根据给定的几何对象,创建一个由线条类对象组成的平面几何对象

    用法

    geometry ST_BuildArea(geometry A);

    描述

    根据给定的几何对象,创建一个由线条组成的平面几何对象。根据输入类型,返回的类型可以是 Polygon 或 MultiPolygon。

    如果输入的线条不能组成 polygon,那么返回 NULL。输入的线条类对象类型可以是 LINESTRINGS,MULTILINESTRINGS,POLYGONS, MULTIPOLYGONS, 和 GeometryCollections.

    该函数假定所有的输入几何类型对象都有空

    注意

    输入的线条类对象必须是由正确的点组成,才能使用该函数

    可用版本:需要 GEOS 版本 >= 2.1.0.

    样例

    参考

    ST_Node, ST_MakePolygon, ST_BdPolyFromText, ST_BdMPolyFromText 这些函数使用 OGC 接口对该函数进行包装。

    6.14.3. ST_Centroid

    ST_Centroid — 返回一个几何对象的几何中心.

    用法

    geometry ST_Centroid(geometry g1);

    描述

    返回一个几何对象的中心,或者等价地返回一个几何对象的质心,即一个点。关于多点几何对象 [MULTI] POINT,返回的是输入几何对象坐标的的算术平均值。对于 [MULTI] LINESTRING 几何类型对象,返回的是每个线段的加权长度。对于 [MULTI] POLYGONs,加权值以面积来算。如果输入的是一个 EMPTY 空几何对象,将返回 GEOMETRYCOLLECTION 类型几何对象。如果输入的是 NULL,则返回 NULL。几何对象的中心等同于最高维度几何对象几何的中心(因为较低的维度几何对象对中心的加权贡献为 0)。

    • 该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1.

    • 该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 8.1.4, 9.5.5

    样例

    在每一个下面的插图中,蓝点代表了输入几何对象的中心

     

    SELECT ST_AsText(ST_Centroid('MULTIPOINT ( -1 0, -1 2, -1 3, -1 4, -1 7, 0 1, 0 3, 1 1, 2 0, 6 0, 7 8, 9 8, 10 6 )')); st_astext ------------------------------------------ POINT(2.30769230769231 3.30769230769231) (1 row)

    参考

    ST_PointOnSurface

    6.14.4. ST_ConcaveHull

    ST_ConcaveHull — 返回包含所有输入几何对象的凹包。可以认为这是一个收缩的包

    用法

    geometry ST_ConcaveHull(geometry geomA, float target_percent, boolean allow_holes=false);

    描述

    返回包含所有输入几何对象的凹包。可以认为这是一个收缩的包。默认不允许带孔(洞洞)的 polygon 对象。返回的几何对象的维度不会高于单例 polygon 对象。

    参数 target_percent,KGIS 在不断地进行包收缩结束前,所能得到的凹包面积的占凸包面积的比例值。

    可以把凹包看成对一个几何对象进行 “真空压缩” 后的结果。参数 target_percent 值为 1 的时候,得到结果和凸包一样。当该参数的值在 0 到 0.99 之间时,会得到一个面积比凸包小一些的结果。该函数与凸包不同,凸包就像在几何对象集合外面放一个橡皮圈一样。

    该函数通常用于 MULTI 和 Geometry Collection 类型对象。虽然该函数不是聚合函数,但可以与函数 ST_Collect 或 ST_Union 一起使用来获得一个 Point/LINESTRING/POLYGON 对象集合的凹包,例如 ST_ConcaveHull (ST_Collect (somepointfield),0.80).

    该函数计算凹包比计算凸包要慢很多,但是会更好地包围几何对象,在图像识别领域也很有用

    该函数由 GEOS 模块支持

    注意

    如果输入对象是 Point 类型、LINESTRING 类型或者 geometry collection 类型对象,使用函数 ST_Collect,如果的处理对象是 Polygon 类型对象,使用函数 ST_Union,因为对于无效的 geometry 类型对象,ST_ConcaveHull 会失败

    注意

    参数 target_percent 的值越小,生成凹包的所需要的时间越长,也越可能导致拓扑异常。同样也会获得更多的单精度点。首先尝试该参数第一阶值为 0.99,通常会非常快,有时候和计算凸包一样快,通常收缩超过 99%,因为该函数总是会超出收缩一些。然后设置改值 0.98,通常会更慢,其他值也会更慢。为了减小精度和得到的单精度点的数量,使用函数 ST_ConcaveHull 后再使用

    函数 ST_SimplifyPreserveTopology 或 ST_SnapToGrid 。函数 ST_SnapToGrid 稍微快一些,但会导致无效的机会对象,而函数 ST_SimplifyPreserveTopology 却总是会验证输入几何对象的有效性。

    使用 target_percent 值为 0.75 获得了与 Simon 使用 Oracle 函数 SDO_CONCAVEHULL_BOUNDARY 得到类似的凹包形状

    样例

    --Get estimate of infected area based on point observations
    SELECT d.disease_type,
    ST_ConcaveHull(ST_Collect(d.pnt_geom), 0.99) As geom
    FROM disease_obs As d
    GROUP BY d.disease_type;

    图 6.14.1 ST_ConcaveHull of 2 polygons encased in target 100% shrink concave hull

    -- geometries overlaid with concavehull
    -- at target 100% shrink (this is the
    same as convex hull - since no shrink)
    SELECT
    ST_ConcaveHull(
    ST_Union(ST_GeomFromText
    ('POLYGON((175 150, 20 40,
    50 60, 125 100,
    175 150))'),
    ST_Buffer(ST_GeomFromText
    ('POINT(110 170)'), 20)
    ), 1)
    As convexhull;

    -- geometries overlaid with concavehull at target 90% of
    convex hull area
    -- geometries overlaid with concavehull
    at target 90% shrink
    SELECT
    ST_ConcaveHull(
    ST_Union(ST_GeomFromText
    ('POLYGON((175 150, 20 40,
    50 60, 125 100,
    175 150))'),
    ST_Buffer(ST_GeomFromText
    ('POINT(110 170)'), 20)
    ), 0.9)
    As target_90;

    图 6.14.2 L Shape points overlaid with convex hull

    -- this produces a table of 42 points that form an L shape
    SELECT
    (ST_DumpPoin
    ts(ST_GeomFromText('MULTIPOINT(14
    14,34 14,54 14,74 14,94 14,114
    14,134 14,150 14,154 14,154 6,134
    6,114 6,94 6,74 6,54 6,34 6, 14
    6,10 6,8 6,7 7,6 8,6 10,6 30,6
    50,6 70,6 90,6 110,6 130,6 150,6
    170,6 190,6 194,14 194,14 174,14
    154,14 134,14 114,14 94,14 74,14
    54,14 34,14 14)'))).geom
    
    INTO TABLE l_shape;
    
    SELECT
    ST_ConvexHull(ST_Collect(geom))
    FROM l_shape;

    图 6.14.3 ST_ConcaveHull of L points at target 99% of convex hull

    SELECT
    ST_ConvexHull(ST_Collect(geom))
    FROM l_shape;

    图 6.14.3 ST_ConcaveHull of L points at target 99% of convex hull

    SELECT ST_ConcaveHull(ST_Collect(geom), 0.99)
    FROM l_shape;

     

    图 6.14.4 Concave Hull of L points at target 80% convex hull area

    -- Concave Hull L shape points
    -- at target 80% of convexhull
    SELECT ST_ConcaveHull(ST_Collect(
    geom), 0.80)
    FROM l_shape;

    图 6.14.5 multilinestring overlaid with Convex hull

    图 6.14.6 multilinestring with overlaid with Concave hull of linestrings at 99% target -- first hop

    SELECT ST_ConcaveHull(ST_GeomFromText('
    MULTILINESTRING((106 164,30 112,74 70,82 112,1
    130 62,122 40,156 32,162 76,172
    88),
    (132 178,134 148,128 136,96 128,132
    108,150 130,
    170 142,174 110,156 96,158 90,158 88),
    (22 64,66 28,94 38,94 68,114 76,112 30,
    132 10,168 18,178 34,186 52,184 74,190
    100,
    190 122,182 148,178 170,176 184,156
    164,146 178,
    132 186,92 182,56 158,36 150,62 150,76
    128,88 118))'),0.99)

    参考

    ST_Collect, ST_ConvexHull, ST_SimplifyPreserveTopology, ST_SnapToGrid

    6.14.5. ST_ConvexHull

    ST_ConvexHull — 返回包含所有几何对象的最小的凸包

    用法

    geometry ST_ConvexHull(geometry geomA);

    描述

    返回包含所有几何对象的最小的凸包

    可以把凸包看成包围一个几何对象的一个弹性的带子。该函数与凹包不同。该函数通常应用于处理 MULTI 和 Geometry Collections 类型对象。虽然该函数不是一个聚合函数,但可以用函数 ST_Collect 来获取一个点集的凸包如下:

    ST_ConvexHull(ST_Collect(somepointfield)).

    它经常被用来在一组观测点上面确定一个受影响的区域

    • 该函数由 GEOS 模块支持

    • 该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.3

    • 该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 5.1.16

    • 这个函数支持 3D 对象,并且不会删除 z 坐标

    样例

    --Get estimate of infected area based on point observationsSELECT d.disease_type,
    ST_ConvexHull(ST_Collect(d.the_geom)) As the_geom
    FROM disease_obs As d
    GROUP BY d.disease_type;

    SELECT ST_AsText(ST_ConvexHull( ST_Collect(
    ST_GeomFromText('MULTILINESTRING((100 190,10 8),(150 10, 20 30))'),
    ST_GeomFromText('MULTIPOINT(50 5, 150 30, 50 10, 10 10)')
    )) );
    ---st_astext--
    POLYGON((50 5,10 8,10 10,100 190,150 30,150 10,50 5))
    

    参考

    ST_Collect, ST_ConcaveHull, ST_MinimumBoundingCircle

    6.14.6. ST_DelaunayTriangles

    ST_DelaunayTriangles — 根据输入对象的顶点对象,返回一个 Delaunay 三角形化的结果。

    用法

    geometry ST_DelaunayTriangles(geometry g1, float tolerance, int4 flags);

    描述

    根据输入对象的顶点对象,返回一个 Delaunay 三角形化的结果。如果参数 flags 为 0,则返回的是 polygon 对象的 COLLECTION ,如果 flags 值为 1,返回 MULTILINESTRING ,如果 flags 值为 2,则返回 TIN。如果参数 tolerance 没有值,则函数会把输入对象变成一些顶点

    可用版本:需要 GEOS 版本 >= 3.4.0.

    • 这个函数支持 3D 对象,并且不会删除 z 坐标

    • 该函数支持 Triangles 和 Triangulated Irregular Network Surfaces (TIN) 类型.

    2D 样例

     

    3D 样例

    -- 3D multipoint --
    SELECT ST_AsText(ST_DelaunayTriangles(ST_GeomFromText(
    'MULTIPOINT Z(14 14 10,
    150 14 100,34 6 25, 20 10 150)'))) As wkt;
    
    -----wkt----
    GEOMETRYCOLLECTION Z (POLYGON Z ((14 14 10,20 10 150,34 6 

    参考

    ST_ConcaveHull, ST_Dump

    6.14.7. ST_FilterByM

    ST_FilterByM — 基于 M 值过滤顶点,返回一个几何对象, 与原类型相同,但只包含那些 M 值在给定范围(闭区间) 内的顶点。

    用法

    geometry ST_FilterByM(geometry geom, double precision min, double precision max = null, boolean returnM = false);

    描述

    基于 M 值过滤顶点,返回一个几何对象, 与原类型相同,但只包含那些 M 值在给定范围(闭区间)内的顶点。 如果省略了给定范围的最大值,则只考虑最小值。 如果省略了第 4 个参数, 则生成的几何对象不会带有 M 值。 如果对于原始的几何类型而言剩余的顶点太少, 则返回一个空几何对象。 在一个几何对象集合中,顶点不足的几何对象会被删除。

    该函数主要与 ST_SetEffectiveArea 函数联合使用。 ST_SetEffectiveArea 函数依据一个顶点的 M 值设置有效区域, 然后就可以无需做任何计算, 使用 ST_FilterByM 函数过滤出一个简化版的几何对象。

    注意

    当没有足够的顶点时, ST_SimplifyVW 函数与 ST_FilterByM 函数返回的值有所不同: ST_SimplifyVW 函数会返回一个包含足够顶点数的几何对象,而 ST_FilterByM 函数返回一个空对象。

    注意

    返回的几何对象有可能是非法的。

    注意

    该函数返回所有的维度,包括 z 维和 m 维的值。

    样例

    过滤 LineString

    SELECT ST_AsText(ST_FilterByM(geom,30)) simplified
    FROM (SELECT  ST_SetEffectiveArea('LINESTRING(5 2, 3 8, 6 20, 7 25, 10 10)'::geometry) geom) As foo;
    -result
             simplified
    ----------------------------
    LINESTRING(5 2,7 25,10 10)

    参考

    ST_SetEffectiveArea, ST_SimplifyVW

    6.14.8. ST_GeneratePoints

    ST_GeneratePoints — 在输入区域内生成指定数量的伪随机点。

    用法

    geometry ST_GeneratePoints( g geometry , npoints integer );
    geometry ST_GeneratePoints( geometry g , integer npoints , integer seed );

    描述

    在输入区域内生成指定数量的伪随机点。 可选的 seed 参数用于重复生成固定的点序列,其参数值必须大于 0。

    样例

    原始多边形

     

    以 1996 为种子,生成 12 个随机点后的结果

    SELECT ST_GeneratePoints(geom, 12, 1996)
    FROM (
       SELECT ST_Buffer(
          ST_GeomFromText(
          'LINESTRING(50 50,150 150,150 50)'),
          10, 'endcap=round join=round') AS geom
    ) AS s;

    6.14.9. ST_GeometricMedian

    ST_GeometricMedian — 使用 Weiszfeld 算法近似计算一个 MultiPoint 对象的几何中心。

    用法

    geometry ST_GeometricMedian ( geometry geom, float8 tolerance = NULL, int max_iter = 10000, boolean fail_if_not_converged = false);

    描述

    使用 Weiszfeld 算法近似计算一个 MultiPoint 对象的几何中心。 几何中心是指与输入点集合的距离之和最小的点。 它提供了一个比质心(centriod) 对外围点更不敏感的中心值。

    该算法会反复迭代, 直到成功迭代后的距离变化小于给定的容差值(tolerance) 。 如果迭代到最大次数(max_iter) 仍不满足条件,该函数会产生一个错误并退出,除非 fail_if_not_converged 被设为 false(默认值)。

    如果未给出容差值, 该函数会基于输入几何对象的跨度计算一个容差值。

    如果输入几何对象有 M 值,这些 M 值会被解释为点的相对权重。

    • 该函数支持 3D 并且不会丢弃 Z 坐标值。

    • 该函数支持 M 坐标。

    样例

    为由 4 个点(橙色点) 组成的 MultiPoint 对象计算质心(青色点) 与形心(几何中心,红色点)

     

    WITH test AS (
    SELECT 'MULTIPOINT((0 0), (1 1), (2 2), (200 200))'::geometry geom)
    SELECT
    ST_AsText(ST_Centroid(geom)) centroid,
    ST_AsText(ST_GeometricMedian(geom)) median
    FROM test;
          centroid      |                 median
    --------------------+----------------------------------------
    POINT(50.75 50.75) | POINT(1.9761550281255 1.9761550281255)
    (1 row)

    请参考

    ST_Centroid

    6.14.10. ST_MaximumInscribedCircle

    ST_MaximumInscribedCircle — 返回一个几何对象内部能够容纳的最大的圆。 返回数据是一条记录,包含其圆心、半径以及几何对象上离圆心最近的点。

    用法

    (geometry, geometry, double precision) ST_MaximumInscribedCircle(geometry geom);

    描述

    返回一个几何对象内部能够容纳的最大的圆。返回数据是一条记录,包含其圆心、半径以及几何对象上离圆心最近的点。

    对于多边形输入,生成的是其外环的内接圆, 其内环作为边界。对于线或点输入,生成的是其凸包的内接圆,并将输入作为远边界。

    样例

    SELECT radius, ST_AsText(center) AS center, ST_AsText(nearest) AS nearest
       FROM ST_MaximumInscribedCircle('POLYGON ((50 50, 150 50, 150 150, 50 150, 50 50))')
    
    radius |     center     |    nearest
    --------+----------------+---------------
       50 | POINT(100 100) | POINT(100 50)

    一个三角形的最大内接圆, 返回了圆心、最近点和半径。

    一个 MultiLine 对象的最大内接圆,返回了圆心、最近点和半径。

    请参考

    ST_Collect, ST_MinimumBoundingRadius

    6.14.11. ST_MinimumBoundingCircle

    ST_MinimumBoundingCircle — 返回包含一个几何对象的最小的 Circle Polygon 对象。默认对四分之一圆做 48 等分弧段分割

    用法

    geometry ST_MinimumBoundingCircle(geometry geomA, integer num_segs_per_qt_circ=48);

    描述

    返回一个能完全包含一个几何对象的最小的圆形 Polygon 对象

    注意

    通过每个弧段是(四分之一圆的 48 分之一)的基本粒度对 polygon 进行切割,返回最接近的 Circle 对象。参数的值可以提高到更大以便获得更精确的结果但这样做会有一些性能损失

    该函数通常用于处理 MULTI 和 Geometry Collections 类型对象。虽然该函数不是一个聚合函数,但可以用函数 ST_Collect 来获取一个几何对象集合的最小的 bounding circle,即 ST_MinimumBoundingCircle (ST_Collect (somepointfield)).

    多边形的面积与最小边界圆的面积之比,通常被称为 Roeck 测试

    可用版本:需要 GEOS 库支持

    SELECT d.disease_type,
    ST_MinimumBoundingCircle(ST_Collect(d.the_geom)) As the_geom
    FROM disease_obs As d
    GROUP BY d.disease_type;

    SELECT ST_AsText(ST_MinimumBoundingCircle( ST_Collect( ST_GeomFromEWKT('LINESTRING(55 75,125 150)'), ST_Point(20, 80)), 8 )) As wktmbc; wktmbc ----------- POLYGON((135.59714732062 115,134.384753327498 102.690357210921,130.79416296937 90.8537670908995,124.963360620072 79.9451031602111,117.116420743937 70.3835792560632,107.554896839789 62.5366393799277,96.6462329091006 56.70583703063,84.8096427890789 53.115246672502,72.5000000000001 51.9028526793802,60.1903572109213 53.1152466725019,48.3537670908996 56.7058370306299,37.4451031602112 62.5366393799276,27.8835792560632 70.383579256063,20.0366393799278 79.9451031602109,14.20583703063 90.8537670908993,10.615246672502 102.690357210921,9.40285267938019 115,10.6152466725019 127.309642789079,14.2058370306299 139.1462329091,20.0366393799275 150.054896839789,27.883579256063 159.616420743937, 37.4451031602108 167.463360620072,48.3537670908992 173.29416296937,60.190357210921 176.884753327498, 72.4999999999998 178.09714732062,84.8096427890786 176.884753327498,96.6462329091003 173.29416296937,107.554896839789 167.463360620072, 117.116420743937 159.616420743937,124.963360620072 150.054896839789,130.79416296937 139.146232909101,134.384753327498 127.309642789079,135.59714732062 115))

    参考

    ST_Collect, ST_ConvexHull

    6.14.12. ST_MinimumBoundingRadius

    ST_MinimumBoundingRadius — 返回一条记录,包含一个几何对象的最小外接圆圆心和半径。

    用法

    (geometry, double precision) ST_MinimumBoundingRadius(geometry geom);

    描述

    返回一条记录,包含一个几何对象的最小外接圆圆心和半径。

    与 ST_Collect 联合使用可以获取一组几何对象的最小外接圆。

    样例

    SELECT ST_AsText(center), radius FROM ST_MinimumBoundingRadius('POLYGON((26426 65078,26531 65242,26075 65136,26096 65427,26426 65078))');
    
                   st_astext                 |      radius
    ------------------------------------------+------------------
    POINT(26284.8418027133 65267.1145090825) | 247.436045591407

    参考

    ST_Collect, ST_MinimumBoundingCircle

    6.14.13. ST_OrientedEnvelope

    ST_OrientedEnvelope — 返回一个旋转后可以包围输入几何对象的、 面积最小的矩形。

    用法

    geometry ST_OrientedEnvelope( geometry geom );

    描述

    返回一个旋转后可以包围输入几何对象的、面积最小的矩形。 注意,可能存在不止一个矩形满足条件, 也可能返回一个点或者线。

    样例

    SELECT ST_AsText(ST_OrientedEnvelope('MULTIPOINT ((0 0), (-1 -1), (3 2))'));
    
    st_astext
    ------------------------------------------------
    POLYGON((3 2,2.88 2.16,-1.12 -0.84,-1 -1,3 2))

     

    一个点和线的旋转后的矩形包络线

    SELECT ST_AsText(ST_OrientedEnvelope(
          ST_Collect(
                ST_GeomFromText('LINESTRING(55 75,125 150)'),
                   ST_Point(20, 80))
                   )) As wktenv;
    wktenv
    -----------
    POLYGON((19.9999999999997 79.9999999999999,33.0769230769229 60.3846153846152,138.076923076924 130.384615384616,125.000000000001 150.000000000001,19.9999999999997 79.9999999999999))

    相关参考

    ST_Envelope ST_MinimumBoundingCircle

    6.14.14. ST_OffsetCurve

    ST_OffsetCurve — 根据一个输入的线和偏移的距离,返回一个偏移后的线。对于计算中心线的平行线很有用

    用法

    geometry ST_OffsetCurve(geometry line, float signed_distance, text style_parameters=”);

    描述

    根据一个输入的线和偏移的距离,返回一个偏移后的线。对于计算中心线的平行线很有用

    如果输入的距离值是一个正值,那么会向输入线的左边偏移,如果是一个负值,那么将向反方向的右侧偏移

    可用版本:需要 GEOS 版本 >= 3.2, 在版本 GEOS >= 3.3 帮助下有了提升

    第三个参数(目前只支持 geometry 类型):可以指定一个分隔四分之一圆的弧段的数量(默认四分之圆做 7 次分隔,即 8 个弧段)或者空格分隔键值对

    参数:

    'quad_segs=#' : 用来近似四分之一圆的弧段数,默认是 8

    'endcap=round|flat|square' : endcap 方式 (默认是 "round", 需要 GEOS-3.2 或更高版本支持). 'butt' 和 “flat” 意义等价,也可以是参数值

    'join=round|mitre|bevel' : join 方式 (默认是 "round", 需要 GEOS-3.2 或更高版本支持). 'miter' 和 'mitre' 意义等价,也可以是参数值

    'mitre_limit=#.#' : 切割率限制 (只影响 miter 方式的 join). 'miter_limit' 和 'mitre_limit' 意义等价,也可以是参数值

    距离单位以相关的空间参考系规定的距离单位为准.

    输入对象只能是 LINESTRINGS.

    该函数由 GEOS 模块支持.

    注意

    该函数会忽略第 3 维坐标(Z 坐标),即便输入的是一个 3 维对象,返回的也是 2 维结果

    样例

    Compute an open buffer around roads
    SELECT ST_Union(
    ST_OffsetCurve(f.the_geom, f.width/2, 'quad_segs=4 join=round'),
    ST_OffsetCurve(f.the_geom, -f.width/2, 'quad_segs=4 join=round')
    ) as track
    FROM someroadstable;

    图 6.14.7 15, 'quad_segs=4 join=round' original line and its offset 15 units.

    SELECT ST_AsText(ST_OffsetCurve(
      ST_GeomFromText(
        'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,44 16,24 16,20 16,18 16,17 17 16 18,16 20,16 40,16 60,16 80,16 100,16 120,16 140,16 160,16 180,16 195)'
        ),
      15, 'quad_segs=4 join=round')
    );
    --output --
    LINESTRING(164 1,18 1,12.2597485145237 2.1418070123307,7.39339828220179 5.39339828220179,5.39339828220179 7.39339828220179, 2.14180701233067 12.2597485145237,1 18,1 195)
    • 图 6.14.8 -15, 'quad_segs=4 join=round' original line and its offset -15 units

    SELECT
    ST_AsText(ST_OffsetCurve(geom,-15, 'quad_segs=4 join=round'))
    As notsocurvy
    FROM ST_GeomFromText(
    'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,44 16,24 16,20 16,18 16,17 17,16 18,16 20,16 40,16 60,16 80,16 100,16 120,16 140,16 160,16 180,16 195)'
    ) As geom;
    -- notsocurvy --
    LINESTRING(31 195,31 31,164 31)

    图 6.14.9 double-offset to get more curvy,note the first reverses direction, so -30 + 15 = -15

     

    SELECT ST_AsText(ST_OffsetCurve(
    ST_OffsetCurve(geom, -30, 'quad_segs=4 join=round'), -15, 'quad_segs=4 join=round')
    )
    As morecurvy As parallel_curves
    FROM ST_GeomFromText(
    'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16, 44 16,24 16,20 16,18 16,17 17, 16 18,16 20,16 40,16 60,16 80,16 100,16 120,16 140,16 160,16 180,16 195)'
    ) As geom;
    -- morecurvy --
    LINESTRING(164 31,46 31,40.2597485145236 32.1418070123307,35.3933982822018 35.3933982822018,32.1418070123307 40.2597485145237,31 46,31 195)

    图 6.14.10 double-offset to get more curvy,combined with regular offset 15 to get parallel lines.Overlaid with original.

     

    SELECT ST_AsText(ST_Collect(
      ST_OffsetCurve(geom, 15, 'quad_segs=4 join=round'),
      ST_OffsetCurve(ST_OffsetCurve(geom,-30, 'quad_segs=4 join=round'),-15, 'quad_segs=4 join=round')
      )
    )
    FROM ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,44 16,24 16,20 16,18 16,17 17,16 18,16 20,16 40,16 60,16 80,16 100,16 120,16 140,16 160,16 180,16 195)'
    ) As geom;
    -- parallel curves--
    MULTILINESTRING((164 1,18 1,12.2597485145237 2.1418070123307,7.39339828220179 5.39339828220179,5.39339828220179 7.393398282201,2.14180701233067 12.2597485145237,1 18,1 195),
    -8(164 31,46 31,40.2597485145236 32.1418070123307,35.3933982822018 35.39339828220 32.1418070123307 40.2597485145237,31 46,31 195))

    图 6.14.11 15, 'quad_segs=4 join=bevel' shown with original line

     

    SELECT ST_AsText(ST_OffsetCurve(
    ST_GeomFromText('LINESTRING
      (164 16,144 16,124 16,104 16,84 16,64 16, 44 16,24 16,20 16,18 16,17 17, 16 18,16 20,16 40,16 60,16 80,16 100,16 120,16 140,16 160,16 180,16 195),
      15, 'quad_segs=4 join=bevel')
    );
    
    LINESTRING(164 1,18 1,7.39339828220179 5.39339828220179,5.39339828220179 7.39339828220179,1 18,1 195)

    图 6.14.12 15,-15 collected, join=mitre mitre_limit=2.1

     

    SELECT ST_AsText(ST_Collect(
      ST_OffsetCurve(geom, 15, 'quad_segs=4 join=mitre mitre_limit=2.2'),
      ST_OffsetCurve(geom, -15, 'quad_segs=4 join=mitre mitre_limit=2.2')
    ) )
    FROM ST_GeomFromText('LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,44 16,24 16,20 16,18 16,17 17,16 18,16 20,16 40,16 60,16 80,16 100,16 120,16 140,16 160,16 180,16 195)'
    ) As geom;
    -- output --
    MULTILINESTRING((164 1,11.7867965644036 1,1 11.7867965644036,1 195), (31 195,31 31,164 31))

    参考

    ST_Buffer

    6.14.15. ST_PointOnSurface

    ST_PointOnSurface — 返回一个必然在 Surface 对象上的点

    用法

    geometry ST_PointOnSurface(geometry g1);

    描述

    返回一个必然在 Surface 对象上的点

    • 该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.14.2 //s3.2.18.2

    • 该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 8.1.5, 9.5.6. 根据该规范,函数 ST_PointOnSurface 支持 Surface 类型几何对象 (POLYGONs, MULTIPOLYGONS, CURVED POLYGONS)。因此 KGIS 似乎扩展了该规范所要求的对象。

    • 大多数数据库例如 Oracle、DB2、ESRI SDE 似乎只支持 Surface 类型对象。而 SQL Server 2008 和 KGIS 一样支持所有几何类型对象

    • 这个函数支持 3D 对象,并且不会删除 z 坐标。

    样例

    SELECT ST_AsText(ST_PointOnSurface('POINT(0 5)'::geometry));
    
    st_astext
    ------------
    POINT(0 5)(1 row)
    
    SELECT ST_AsText(ST_PointOnSurface('LINESTRING(0 5, 0 10)'::geometry));
    
    st_astext
    ------------
    POINT(0 5)
    (1 row)
    
    SELECT ST_AsText(ST_PointOnSurface('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'::geometry));
    
    st_astext
    ----------------
    POINT(2.5 2.5)
    (1 row)
    
    SELECT ST_AsEWKT(ST_PointOnSurface(ST_GeomFromEWKT('LINESTRING(0 5 1, 0 0 1, 0 10 2)')));
    
    st_asewkt
    ----------------
    POINT(0 0 1)
    (1 row)

    参考

    ST_Centroid, ST_Point_Inside_Circle

    6.14.16. ST_Polygonize

    ST_Polygonize — 聚合函数,从一个线条类的几何类型对象几何创建一个包含 Polygon 对象的 GeometryCollection 类型对象

    用法

    geometry ST_Polygonize(geometry set geomfield);
    geometry ST_Polygonize(geometry[] geom_array);

    描述

    聚合函数,从一个线条类的几何类型对象几何创建一个包含 Polygon 对象的 GeometryCollection 类型对象

    注意

    第三方工具通常不支持 Geometry Collection 类型对象,因此使用函数 ST_Polygonize 和函数 ST_Dump 把 collection 类型的 polygon 展开成单例的 polygon 对象

    注意

    输入的线条类几何对象必须被正确的添加节点分隔才能使用该函数

    可用版本:需要 GEOS 版本 >= 2.1.0.

    样例: Polygonizing single linestrings

    SELECT ST_AsEWKT(ST_Polygonize(the_geom_4269)) As geomtextrep
    FROM (SELECT the_geom_4269 FROM ma.suffolk_edges ORDER BY tlid LIMIT 45) As foo;
    
    geomtextrep
    -------------------------------------
    SRID=4269;GEOMETRYCOLLECTION(POLYGON((-71.040878 42.285678,-71.040943 42.2856,-71.04096
    42.285752,-71.040878 42.285678)),
    POLYGON((-71.17166 42.353675,-71.172026 42.354044,-71.17239 42.354358,-71.171794 ←
    42.354971,-71.170511 42.354855,
    -71.17112 42.354238,-71.17166 42.353675)))
    (1 row)
    
    --Use ST_Dump to dump out the polygonize geoms into individual polygons
    SELECT ST_AsEWKT((ST_Dump(foofoo.polycoll)).geom) As geomtextrep
    FROM (SELECT ST_Polygonize(the_geom_4269) As polycoll
    FROM (SELECT the_geom_4269 FROM ma.suffolk_edges
    ORDER BY tlid LIMIT 45) As foo) As foofoo;
    
    geomtextrep
    ------------------------
    SRID=4269;POLYGON((-71.040878 42.285678,-71.040943 42.2856,-71.04096 42.285752,
    -71.040878 42.285678))
    SRID=4269;POLYGON((-71.17166 42.353675,-71.172026 42.354044,-71.17239 42.354358
    ,-71.171794 42.354971,-71.170511 42.354855,-71.17112 42.354238,-71.17166 42.353675))
    (2 rows)

    参考

    ST_Node, ST_Dump

    6.14.17. ST_ReducePrecision

    ST_ReducePrecision — 按照给定的容差大小,返回一个合法的几何图形。其每个顶点都被圆整到容差网格上。所有尺度小于容差的特征都被删除。

    用法

    geometry ST_ReducePrecision(geometry g, float8 gridsize);

    描述

    按照给定的容差大小,返回一个合法的几何图形。其每个顶点都被圆整到容差网格上。所有尺度小于容差的特征都被删除。

    与此不同的是, ST_SnapToGrid 函数返回的是一个合法的 、没有自相交的环或折叠元素的几何对象。

    样例

    SELECT ST_AsText(ST_ReducePrecision('POINT(1.412 19.323)', 0.1));
       st_astext
    -----------------
    POINT(1.4 19.3)
    
    SELECT ST_AsText(ST_ReducePrecision('POINT(1.412 19.323)', 1.0));
    st_astext
    -------------
    POINT(1 19)
    
    SELECT ST_AsText(ST_ReducePrecision('POINT(1.412 19.323)', 10));
    st_astext
    -------------
    POINT(0 20)

    参考

    ST_SnapToGrid, ST_Simplify, ST_SimplifyVW

    6.14.18. ST_SharedPaths

    ST_SharedPaths — 返回两个输入的 linestrings/multilinestrings 类型对象公用的 path 路径代表的 collection 对象

    用法

    geometry ST_SharedPaths(geometry lineal1, geometry lineal2);

    描述

    返回两个输入的 linestrings/multilinestrings 类型对象公用的 path 路径代表的 collection 对象。方向一致的几何对象放在第一个集合元素内,方向相反的放在第二个集合内。公用的 path 和第一个几何输入几何对象一致

    可用版本:需要 GEOS 版本 >= 3.3.0.

    样例: Finding shared paths

    参考

    ST_Dump, ST_GeometryN, ST_NumGeometries

    6.14.19. ST_Simplify

    ST_Simplify — 使用 Douglas-Peucker 算法简化一个给定的几何对象,并返回

    用法

    geometry ST_Simplify(geometry geomA, float tolerance);

    描述

    使用 Douglas-Peucker 算法简化一个给定的几何对象,并返回。该函数实际上只支持 (multi) lines、(multi) polygons 和 multipoints 类型对象,但是可以安全地对任何几何类型对象使用该函数。因为该函数会输入的 geometry collection 对象做一层又一层的类型转换,直到符合要求

    注意

    返回的几何对象可能会丢失简单性 (参考 ST_IsSimple)

    注意

    注意输入对象拓扑结构可能会变化,也可能会产生无效的几何类型对象,使用函数 (参考 ST_SimplifyPreserveTopology) 来维持输入对象的拓扑结构。

    该函数由 GEOS 模块支持.

    样例

    A circle simplified too much becomes a triangle, medium an octagon,
    SELECT ST_Npoints(the_geom) As np_before,
    ST_NPoints(ST_Simplify(the_geom,0.1)) As
    np01_notbadcircle, ST_NPoints(ST_Simplify(the_geom,0.5)) As
    np05_notquitecircle,
    ST_NPoints(ST_Simplify(the_geom,1)) As np1_octagon,
    ST_NPoints(ST_Simplify(the_geom,10)) As
    np10_triangle,
    (ST_Simplify(the_geom,100) is null) As np100_geometrygoesaway
    FROM (SELECT ST_Buffer('POINT(1 3)', 10,12) As the_geom) As foo;
    -result
    
    np_before| np01_notbadcircle| np05_notquitecircle| np1_octagon| np10_triangle|np100_geometrygoesaway
    ---------+------------------+--------------------+------------+--------------+-------------------------
    49       | 33               | 17                 | 9          | 4            | t

    参考

    ST_IsSimple, ST_SimplifyPreserveTopology, Topology ST_Simplify

    6.14.20. ST_SimplifyPreserveTopology

    ST_SimplifyPreserveTopology — 使用 Douglas-Peucker 算法,根据给定的几何对象,返回一个简化版的几何对象。该函数会避免创建新的派生的无效的几何对象(特别是多边形)

    用法

    geometry ST_SimplifyPreserveTopology(geometry geomA, float tolerance);

    描述

    使用 Douglas-Peucker 算法,根据给定的几何对象,返回一个简化版的几何对象。该函数会避免创建新的派生的无效的几何对象(特别是多边形)。该函数实际上只支持 (multi) lines、(multi) polygons 类型对象,但是可以安全地对任何几何类型对象使用该函数。因为该函数会输入的 geometry collection 对象做一层又一层的类型转换,直到符合要求

    该函数由 GEOS 模块支持.

    注意

    需要 GEOS 3.0.0 + 版本支持

    样例

    Same example as Simplify, but we see Preserve Topology prevents oversimplification. The circle can at most become a square.
    SELECT ST_Npoints(the_geom) As np_before, ST_NPoints(ST_SimplifyPreserveTopology(the_geom
    ,0.1)) As np01_notbadcircle, ST_NPoints(ST_SimplifyPreserveTopology(the_geom,0.5)) As
    np05_notquitecircle,
    ST_NPoints(ST_SimplifyPreserveTopology(the_geom,1)) As np1_octagon, ST_NPoints(
    ST_SimplifyPreserveTopology(the_geom,10)) As np10_square,
    
    ST_NPoints(ST_SimplifyPreserveTopology(the_geom,100)) As np100_stillsquare
    FROM (SELECT ST_Buffer('POINT(1 3)', 10,12) As the_geom) As foo;
    --result--
    np_before | np01_notbadcircle| np05_notquitecircle| np1_octagon| np10_square|np100_stillsquare
    ----------+------------------+--------------------+------------+------------+-----------------
    49        | 33               | 17                 | 9          | 5          | 5

    相关参考

    ST_Simplify

    6.14.21. ST_SimplifyVW

    ST_SimplifyVW — 使用 Visvalingam-Whyatt 算法返回一个给定几何对象的简化版本。

    用法

    geometry ST_SimplifyVW(geometry geomA, float tolerance);

    描述

    使用 Visvalingam-Whyatt 算法返回一个给定几何对象的简化版本。 该函数只会处理线和多边形,包括它们对应的集合类型, 但你可以安全地对任何几何对象调用该函数。 因为简化是针对单个对象逐个做的,该函数可以用 GeometryCollection 类型的参数。

    注意

    返回的几何对象可能丢失其简单性。

    注意

    拓扑结构可能不能保持,返回的几何对象也可能不合法。 要保持拓扑结构需使用 ST_SimplifyPreserveTopology 函数。

    注意

    该函数支持 3D 并且第三个维度会影响结果。

    样例

    以 30 为临界值圈定一个最小区域,对一个 LineString 进行简化

    select ST_AsText(ST_SimplifyVW(geom,30)) simplified
    FROM (SELECT  'LINESTRING(5 2, 3 8, 6 20, 7 25, 10 10)'::geometry geom) As foo;
    
    simplified
    ------------------------------
    LINESTRING(5 2,7 25,10 10)

    相关参考

    ST_SetEffectiveArea, ST_Simplify, ST_SimplifyPreserveTopology, Topology ST_Simplify

    6.14.22. ST_ChaikinSmoothing

    ST_ChaikinSmoothing — 使用 Chaikin 算法返回一个经过平滑的几何对象。

    用法

    geometry ST_ChaikinSmoothing(geometry geom, integer nIterations = 1, boolean preserveEndPoints = false);

    描述

    使用 Chaikin 算法返回一个经过平滑的几何对象。 算法解释请参考 `Chaikins-Algorithm`_ 。 每次迭代,顶点数都会翻倍。 该函数会在线的前 1/4 和后 1/4 处添加新的顶点,并移除它们之间的原始顶点,为了减少顶点数应从各种简化算法种选择一种使用。 新加入的点会包含所有维度,包括 z 和 m 维。

    第二个参数限制最大迭代次数, 最大不能超过 5。

    注意第三个参数只对多边形有效,对线则会忽略该参数。

    该函数能够处理 3D 对象,并且第三个维度会影响结果。

    注意

    返回的几何对象比原对象的顶点数多。要削减顶点数,需从各种简化算法种选择一种使用。

    样例

    一个平滑后的三角形

    select ST_AsText(ST_ChaikinSmoothing(geom)) smoothed
    FROM (SELECT  'POLYGON((0 0, 8 8, 0 16, 0 0))'::geometry geom) As foo;
    ┌───────────────────────────────────────────┐
    │                 smoothed                  │
    ├───────────────────────────────────────────┤
    │ POLYGON((2 2,6 6,6 10,2 14,0 12,0 4,2 2)) │
    └───────────────────────────────────────────┘

    参考

    ST_Simplify, ST_SimplifyVW

    6.14.23. ST_SetEffectiveArea

    ST_SetEffectiveArea — 使用 Visvalingam-Whyatt 算法,为每个顶点设置有效区域。

    用法

    geometry ST_SetEffectiveArea(geometry geomA, float threshold = 0,
               integer set_area = 1);

    描述

    使用 Visvalingam-Whyatt 算法,为每个顶点设置有效区域。 有效区域存储为顶点的 M 值。 如果使用了可选的临界点参数,将会返回一个简化过的几何对象,只包含有效区域大于等于临界值的顶点。

    当指定了临界值时, 该函数可用在服务器端的化简操作。 另一种选择是将临界值设为 0。 在这种情况下,整个几何对象将与其有效区域(以 M 值表示) 一起返回客户端,由客户端来化简。

    该函数实际上只对线和多边形(以及它们对应的集合类型) 进行操作,但可以安全地对任何类型的几何对象调用该函数。 由于简化是针对每个独立的几何对象进行的,所以可以对 GeometryCollection 类型使用该函数。

    注意

    返回的几何对象可能丢失其简单性。

    注意

    拓扑结构可能不能保持,返回的几何对象也可能不合法。要保持拓扑结构需使用 ST_SimplifyPreserveTopology 函数。

    注意

    输出的几何对象将会丢失先前的 M 值。

    注意

    该函数支持 3D 并且第三个维度会影响结果。

    样例

    计算一个 LineString 的有效区域。因为我们使用 0 作为临界值,几何图形上所有的点都被返回了。

    select ST_AsText(ST_SetEffectiveArea(geom)) all_pts,
        ST_AsText(ST_SetEffectiveArea(geom,30) ) thrshld_30
    FROM (SELECT  'LINESTRING(5 2, 3 8, 6 20, 7 25, 10 10)'::geometry geom) As foo;
    
    all_pts | thrshld_30
    -----------+-------------------+
    LINESTRING M (5 2 3.40282346638529e+38,3 8 29,6 20 1.5,7 25 49.5,10 10 3.40282346638529e+38) | LINESTRING M (5 2 3.40282346638529e+38,7 25 49.5,10 10 3.40282346638529e+38)

    参考

    ST_SimplifyVW

    6.14.24. ST_VoronoiLines

    ST_VoronoiLines — 依据给定的几何对象的顶点计算 2D 维诺图(`Voronoi diagram`_) , 并以 MultiLine 的形式返回图胞之间的边界。

    用法

    geometry ST_VoronoiLines( g1 geometry , tolerance float8 , extend_to geometry );

    描述

    依据给定的几何对象的顶点计算 2D 维诺图(`Voronoi diagram`_), 并以 MultiLine 的形式返回图胞之间的边界。 如果输入几何对象是 NULL, 返回值也是 NULL。如果输入几何对象只包含一个顶点, 或者其包络线围成的面积为 0,则返回一个空的几何对象集合。

    可选参数:

    • tolerance: 容差, 间距小于该值的顶点将被视作同一个顶点, 默认值为 0.0。 提供一个非零的容差值将有助于提高算法的鲁棒性。

    • extend_to: 扩展范围,如果提供了该参数, 生成的维诺图将会延伸到能覆盖这个多边形区域, 除非其包络线小于默认的包络线(默认值为 NULL, 对应的包络线是一个在所有方向上扩大 50% 的边界框) 。

    样例

    容差为 30 个单位的维诺线。

     

    SELECT ST_VoronoiLines(geom, 30) As geom
    FROM (SELECT 'MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)'::geometry As geom ) As g
    
    -- ST_AsText output
    MULTILINESTRING((135.555555555556 270,36.8181818181818 92.2727272727273),(36.8181818181818 92.2727272727273,-110 43.3333333333333),(230 -45.7142857142858,36.8181818181818 92.2727272727273))

    相关参考

    ST_DelaunayTriangles, ST_VoronoiPolygons, ST_Collect

    6.14.25. ST_VoronoiPolygons

    ST_VoronoiPolygons — 依据给定的几何对象的顶点计算 2D 维诺图(`Voronoi diagram`_), 并以 Polygon 集合的形式返回一个能覆盖所有输入顶点的维诺图。

    用法

    geometry ST_VoronoiPolygons( g1 geometry , tolerance float8 , extend_to geometry );

    描述

    依据给定的几何对象的顶点计算 2D 维诺图(`Voronoi diagram`_), 并以 Polygon 集合(Geometry Collection 类型) 的形式返回一个能覆盖所有输入顶点的维诺图。 如果输入几何对象是 NULL, 返回值也是 NULL。 如果输入几何对象只包含一个顶点, 或者其包络线围成的面积为 0,则返回一个空的几何对象集合。

    可选参数:

    • tolerance: 容差, 间距小于该值的顶点将被视作同一个顶点, 默认值为 0.0。 提供一个非零的容差值将有助于提高算法的鲁棒性。

    • extend_to:扩展范围,如果提供了该参数, 生成的维诺图将会延伸到能覆盖这个多边形区域, 除非其包络线小于默认的包络线(默认值为 NULL, 对应的包络线是一个在所有方向上扩大 50% 的边界框) 。

    样例

    点叠加在维诺图上

     

    SELECT
       ST_VoronoiPolygons(geom) As geom
    FROM (SELECT 'MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)'::geometry As geom ) As g;
    
    -- ST_AsText output
    GEOMETRYCOLLECTION(POLYGON((-110 43.3333333333333,-110 270,100.5 270,59.3478260869565 132.826086956522,36.8181818181818 92.2727272727273,-110 43.3333333333333)),
    POLYGON((55 -90,-110 -90,-110 43.3333333333333,36.8181818181818 92.2727272727273,55 79.2857142857143,55 -90)),
    POLYGON((230 47.5,230 -20.7142857142857,55 79.2857142857143,36.8181818181818 92.2727272727273,59.3478260869565 132.826086956522,230 47.5)),POLYGON((230 -20.7142857142857,230 -90,55 -90,55 79.2857142857143,230 -20.7142857142857)),
    POLYGON((100.5 270,230 270,230 47.5,59.3478260869565 132.826086956522,100.5 270)))

    容差为 30 个单位的维诺图

    SELECT ST_VoronoiPolygons(geom, 30) As geom
    FROM (SELECT 'MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)'::geometry As geom ) As g;
    
    -- ST_AsText output
    GEOMETRYCOLLECTION(POLYGON((-110 43.3333333333333,-110 270,100.5 270,59.3478260869565 132.826086956522,36.8181818181818 92.2727272727273,-110 43.3333333333333)),
    POLYGON((230 47.5,230 -45.7142857142858,36.8181818181818 92.2727272727273,59.3478260869565 132.826086956522,230 47.5)),POLYGON((230 -45.7142857142858,230 -90,-110 -90,-110 43.3333333333333,36.8181818181818 92.2727272727273,230 -45.7142857142858)),
    POLYGON((100.5 270,230 270,230 47.5,59.3478260869565 132.826086956522,100.5 270)))

    容差为 30 个单位的维诺图

     

    SELECT ST_VoronoiLines(geom, 30) As geom
    FROM (SELECT 'MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)'::geometry As geom ) As g
    
    -- ST_AsText output
    MULTILINESTRING((135.555555555556 270,36.8181818181818 92.2727272727273),(36.8181818181818 92.2727272727273,-110 43.3333333333333),(230 -45.7142857142858,36.8181818181818 92.2727272727273))

    相关参考

    ST_DelaunayTriangles, ST_VoronoiLines, ST_Collect

  • 相关阅读:
    打假AI无主灯,欧瑞博、艾拉物联、绿米Aqara谁是玩真的
    Redis实现分布式锁
    无代码平台附件上传入门教程
    深度学习---三好学生各成绩所占权重问题(3)
    Explainability: What, Why, What For and How?可解释性:是什么、为什么、为什么以及如何做?‌
    Vue的数据控制-----计算属性(computed)&&侦听器(watch)
    LCD 的RGB接口(SYNC Mode/ SYNC-DE Mode/ DE Mode)
    Linux OpenGrok搭建
    高通Android10 移植exFat格式
    个人应用接入使用阿里云盘和百度网盘
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/126343807