ST_IsValidDetail — ジオメトリが妥当かどうかを示すvalid_detail行を返します。不正な場合にはその理由と場所を示します。
valid_detail ST_IsValidDetail(geometry geom, integer flags);
valid_detail行を返します。validはboolean型で、ジオメトリが妥当かを示します。reasonはvarchar型で、不正の理由を示します。locationはジオメトリ型で、不正になっている位置を示します。
不正なジオメトリの詳細報告を生成するためのST_IsValidとST_IsValidReasonの組み合わせを代替し、かつ改良するものとして使われます。
引数'flags'はビットフィールドです。次の値を取ることができます。
1: 穴を形成する自己インタセクトする環を妥当と考慮します。「ESRIフラグ」とも言われます。これはOGCモデルと対立します。
GEOSモジュールで実現しています。
Availability: 2.0.0
-- 成功した五つの実験から拒絶されたもののうち最初の三つ
SELECT gid, reason(ST_IsValidDetail(the_geom)), ST_AsText(location(ST_IsValidDetail(the_geom))) as location
FROM
(SELECT ST_MakePolygon(ST_ExteriorRing(e.buff), array_agg(f.line)) As the_geom, gid
FROM (SELECT ST_Buffer(ST_MakePoint(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_MakePoint(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(the_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)
-- 単純な例
SELECT * FROM ST_IsValidDetail('LINESTRING(220227 150406,2220227 150407,222020 150410)');
valid | reason | location
-------+--------+----------
t | |