名称

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

大纲

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

描述

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

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

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

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

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

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

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

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

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

[警告]

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

可用性:3.5.0

示例

The input polygon has 55 points. The result retains 15 points, while rendering the same shape inside the view envelope.

Code
WITH data(geom, view) AS (VALUES (
  'POLYGON((3.2 14.2,6.8 14.2,7.6 11.9,7.2 9.8,7.8 7.2,10.3 7.2,11.5 7.5,13.8 7.2,14.6 5.9,14.2 4.8,14.8 3.2,14.6 0.9,13.2 -1.2,12.8 -3.8,12 -4.1,11 -4,9.8 -4.2,8.8 -4.8,8.3 -2.5,6.5 0.2,5.8 2.2,5.3 0.2,3.5 -1.5,2.8 -3.8,1.6 -4.5,-0.3 -5.2,-2.2 -5.8,-0.9 -4.8,-1.5 -4.4,-1.8 -2.8,-1.2 -1.8,0.5 -1.8,1.8 -1.8,2.3 -0.1,1.5 1.8,1.8 3.2,0 3.5,-3.2 4.2,-5.2 4.2,-4.4 4.9,-4.9 5.5,-4.3 5.9,-3.8 6.4,-3 6.9,-3.2 7.8,-2.2 8.2,-1.7 8.9,-2.7 9.4,-2.2 9.9,-1.4 10.9,-1.8 11.8,-1.2 12.2,-2.3 12.8,-2.9 13.2,0.6 13.5,3.2 14.2))'::geometry,
  ST_MakeEnvelope(0.1, 0, 10, 10)
))
SELECT geom AS input_geom,
       view AS input_view,
       ST_RemoveIrrelevantPointsForView(geom, view, true) AS result,
       view AS view
FROM data;
栅格输出
-[ RECORD 1 ]----------
input_geom | POLYGON((3.2 14.2,6.8 14.2,7.6 11.9,7.2 9.8,7.8 7.2,10.3 7.2,11.5 7.5,13.8 7.2,14.6 5.9,14.2 4.8,14.8 3.2,14.6 0.9,13.2 -1.2,12.8 -3.8,12 -4.1,11 -4,9.8 -4.2,8.8 -4.8,8.3 -2.5,6.5 0.2,5.8 2.2,5.3 0.2,3.5 -1.5,2.8 -3.8,1.6 -4.5,-0.3 -5.2,-2.2 -5.8,-0.9 -4.8,-1.5 -4.4,-1.8 -2.8,-1.2 -1.8,0.5 -1.8,1.8 -1.8,2.3 -0.1,1.5 1.8,1.8 3.2,0 3.5,-3.2 4.2,-5.2 4.2,-4.4 4.9,-4.9 5.5,-4.3 5.9,-3.8 6.4,-3 6.9,-3.2 7.8,-2.2 8.2,-1.7 8.9,-2.7 9.4,-2.2 9.9,-1.4 10.9,-1.8 11.8,-1.2 12.2,-2.3 12.8,-2.9 13.2,0.6 13.5,3.2 14.2))
input_view | POLYGON((0.1 0,0.1 10,10 10,10 0,0.1 0))
result     | POLYGON((7.6 11.9,7.2 9.8,7.8 7.2,10.3 7.2,11 -4,8.3 -2.5,6.5 0.2,5.8 2.2,5.3 0.2,3.5 -1.5,2.3 -0.1,1.5 1.8,1.8 3.2,0 3.5,-2.9 13.2,7.6 11.9))
view       | POLYGON((0.1 0,0.1 10,10 10,10 0,0.1 0))
Figure
Geometry figure for visual-st-removeirrelevantpointsforview-01

Only linework affecting the view is retained; existing vertices are reused.

Code
WITH data(geom, view) AS (VALUES (
  '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))'::geometry,
  ST_MakeEnvelope(12, 12, 18, 18)
))
SELECT geom AS input_geom,
       view AS input_view,
       ST_RemoveIrrelevantPointsForView(geom, view, true) AS result,
       view AS view
FROM data;
栅格输出
-[ RECORD 1 ]----------
input_geom | 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))
input_view | POLYGON((12 12,12 18,18 18,18 12,12 12))
result     | MULTILINESTRING((10 15,15 15,20 15),(13 13,15 15,17 17))
view       | POLYGON((12 12,12 18,18 18,18 12,12 12))
Figure
Geometry figure for visual-st-removeirrelevantpointsforview-02

A line with no segment relevant to the view becomes empty.

Code
SELECT ST_RemoveIrrelevantPointsForView('LINESTRING(0 0,10 0,20 0,30 0)',
ST_MakeEnvelope(12, 12, 18, 18), true);
栅格输出
LINESTRING EMPTY

Removing vertices without computing intersections can introduce self-intersections in the result.

Code
WITH data(geom, view) AS (VALUES (
  'POLYGON((0 10,0 0,10 -10,30 0,25 20,10 -5,0 10))'::geometry,
  ST_MakeEnvelope(-5, 1, 20, 12)
))
SELECT geom AS input_geom,
       view AS input_view,
       ST_RemoveIrrelevantPointsForView(geom, view, true) AS result,
       view AS view
FROM data;
栅格输出
-[ RECORD 1 ]----------
input_geom | POLYGON((0 10,0 0,10 -10,30 0,25 20,10 -5,0 10))
input_view | POLYGON((-5 1,-5 12,20 12,20 1,-5 1))
result     | POLYGON((0 10,0 0,30 0,25 20,10 -5,0 10))
view       | POLYGON((-5 1,-5 12,20 12,20 1,-5 1))
Figure
Geometry figure for visual-st-removeirrelevantpointsforview-04

With the default cartesian_hint, the function removes only points known to be irrelevant to the view.

Code
WITH data(geom, view) AS (VALUES (
  'POLYGON((0 30,15 30,30 30,30 0,0 0,0 30))'::geometry,
  ST_MakeEnvelope(12, 12, 18, 18)
))
SELECT geom AS input_geom,
       view AS input_view,
       ST_RemoveIrrelevantPointsForView(geom, view) AS result,
       view AS view
FROM data;
栅格输出
-[ RECORD 1 ]----------
input_geom | POLYGON((0 30,15 30,30 30,30 0,0 0,0 30))
input_view | POLYGON((12 12,12 18,18 18,18 12,12 12))
result     | POLYGON((0 30,30 30,30 0,0 0,0 30))
view       | POLYGON((12 12,12 18,18 18,18 12,12 12))
Figure
Geometry figure for visual-st-removeirrelevantpointsforview-05