名稱

ST_RemoveIrrelevantPointsForView — 移除對於渲染特定幾何圖形矩形視圖不相關的點。

概要

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))