Name

ST_RemoveIrrelevantPointsForView — 删除在指定矩形表示范围内与绘制无关的几何图形点。

Synopsis

geometry ST_RemoveIrrelevantPointsForView(geometry geom, box2d bounds, boolean cartesian_hint = false);

描述

返回一个 geometry,移除了在指定矩形表示范围内绘制时无关的点。

使用此函数可以对仅在特定范围内渲染的几何图形进行快速预处理。

只有(MULTI)POLYGON和(MULTI)LINESTRING类型的几何图形会被评估。其他几何图形不会被更改。

这个函数与 ST_ClipByBox2D() 的区别如下

  • 此函数通过对点进行排序而不计算新的交点,从而避免了舍入误差,并通常提高了效率,

  • 返回一个具有相同或接近点数的几何图形,

  • 在指定的绘制范围内产生相同的绘制结果,

  • 可能会导致自交现象,从而使结果几何图形无效(请参见下方示例)。

如果将 cartesian_hint 设置为 TRUE,则算法会应用额外的优化,包括使用笛卡尔数学,进一步减少结果中的点数。需要注意的是,如果结果坐标被投影到其他(非笛卡尔)坐标系中,使用此可选参数可能会导致绘制中的不自然阴影或噪点。

[Warning]

对于多边形来说,当前此函数无法保证结果的有效性。可以通过 ST_IsValid 来检查这种情况,并使用 ST_MakeValid 来修复。

例:将 ST_RemoveIrrelevantPointsForView() 应用到多边形。保留蓝色点,并在保留灰色绘制范围的同时,进行结果绘制(浅蓝色区域)。

例:由于只是对点进行排序,而没有计算新的点,因此 ST_RemoveIrrelevantPointsForView() 的结果可能包含自交现象。

可用性:3.5.0

示例

SELECT ST_AsText(
                        ST_RemoveIrrelevantPointsForView(
                        ST_GeomFromText('MULTIPOLYGON(((10 10, 20 10, 30 10, 40 10, 20 20, 10 20, 10 10)),((10 10, 20 10, 20 20, 10 20, 10 10)))'),
                        ST_MakeEnvelope(12,12,18,18), true));
                
                st_astext
                ---------
                    MULTIPOLYGON(((10 10,40 10,20 20,10 20,10 10)),((10 10,20 10,20 20,10 20,10 10)))
                
SELECT ST_AsText(
                        ST_RemoveIrrelevantPointsForView(
                        ST_GeomFromText('MULTILINESTRING((0 0, 10 0,20 0,30 0), (0 15, 5 15, 10 15, 15 15, 20 15, 25 15, 30 15, 40 15), (13 13,15 15,17 17))'),
                        ST_MakeEnvelope(12,12,18,18), true));
                
                st_astext
                ---------
                        MULTILINESTRING((10 15,15 15,20 15),(13 13,15 15,17 17))
                
SELECT ST_AsText(
                        ST_RemoveIrrelevantPointsForView(
                        ST_GeomFromText('LINESTRING(0 0, 10 0,20 0,30 0)'),
                        ST_MakeEnvelope(12,12,18,18), true));
                
                st_astext
                ---------
                    LINESTRING EMPTY
                
SELECT ST_AsText(
                        ST_RemoveIrrelevantPointsForView(
                        ST_GeomFromText('POLYGON((0 30, 15 30, 30 30, 30 0, 0 0, 0 30))'),
                        ST_MakeEnvelope(12,12,18,18), true));
                
                st_astext
                ---------
                    POLYGON((15 30,30 0,0 0,15 30))
                
SELECT ST_AsText(
                        ST_RemoveIrrelevantPointsForView(
                        ST_GeomFromText('POLYGON((0 30, 15 30, 30 30, 30 0, 0 0, 0 30))'),
                        ST_MakeEnvelope(12,12,18,18)));
                
                st_astext
                ---------
                    POLYGON((0 30,30 30,30 0,0 0,0 30))