名称

ST_RemoveIrrelevantPointsForView — 删除对于渲染几何图形的特定矩形视图而言不相关的点。

概要

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

描述

返回一个几何图形,其中不包含对于在给定矩形视图内渲染该几何图形而言不相关的点。

此函数可用于快速预处理仅应在特定边界内渲染的几何图形。

仅评估类型为(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))