名稱

ST_IsValidDetail — 傳回一個 valid_detail 列,指出幾何是否有效,若無效則會說明原因及位置。

概要

valid_detail ST_IsValidDetail(geometry geom, integer flags);

描述

傳回一個 valid_detail 列,其中包含一個布林值 (valid) 指出幾何是否有效、一個 varchar (reason) 說明無效的原因,以及一個幾何 (location) 指出無效的位置。

對於改進 ST_IsValidST_IsValidReason 的組合以產生無效幾何的詳細報告很有用。

可選的 flags 參數是一個位元欄位。它可以有以下值

  • 0:使用一般的 OGC SFS 有效性語義。

  • 1:將某些自我接觸的環(反向外殼和外翻孔)視為有效。這也稱為「ESRI 標記」,因為這是這些工具使用的有效性模型。請注意,這在 OGC 模型下是無效的。

由 GEOS 模組執行。

可用性:2.0.0

範例

--First 3 Rejects from a successful quintuplet experiment
SELECT gid, reason(ST_IsValidDetail(geom)), ST_AsText(location(ST_IsValidDetail(geom))) as location
FROM
(SELECT ST_MakePolygon(ST_ExteriorRing(e.buff), array_agg(f.line)) As geom, gid
FROM (SELECT ST_Buffer(ST_Point(x1*10,y1), z1) As buff, x1*10 + y1*100 + z1*1000 As gid
	FROM generate_series(-4,6) x1
	CROSS JOIN generate_series(2,5) y1
	CROSS JOIN generate_series(1,8) z1
	WHERE x1 > y1*0.5 AND z1 < x1*y1) As e
	INNER JOIN (SELECT ST_Translate(ST_ExteriorRing(ST_Buffer(ST_Point(x1*10,y1), z1)),y1*1, z1*2) As line
	FROM generate_series(-3,6) x1
	CROSS JOIN generate_series(2,5) y1
	CROSS JOIN generate_series(1,10) z1
	WHERE x1 > y1*0.75 AND z1 < x1*y1) As f
ON (ST_Area(e.buff) > 78 AND ST_Contains(e.buff, f.line))
GROUP BY gid, e.buff) As quintuplet_experiment
WHERE ST_IsValid(geom) = false
ORDER BY gid
LIMIT 3;

 gid  |      reason       |  location
------+-------------------+-------------
 5330 | Self-intersection | POINT(32 5)
 5340 | Self-intersection | POINT(42 5)
 5350 | Self-intersection | POINT(52 5)

 --simple example
SELECT * FROM ST_IsValidDetail('LINESTRING(220227 150406,2220227 150407,222020 150410)');

 valid | reason | location
-------+--------+----------
 t     |        |