Name

ST_IsValidDetail — ジオメトリが妥当か、妥当でないなら理由と位置をそれぞれ示すvalid_detail行を返します。

Synopsis

valid_detail ST_IsValidDetail(geometry geom, integer flags);

説明

valid_detail行を返します。これには、ジオメトリが妥当かどうかを示す真偽値 (valid)、不正である理由を示す文字列 (reason)、不正である位置を指摘するジオメトリ (location)からなります。

不正ジオメトリの詳細報告の生成をするST_IsValidST_IsValidReasonの組み合わせを改善するために使います。

任意パラメータflagsはビットフィールドです。次の値を持つことができます。

  • 0: 通常のOGC SFS評価モデルを使用します。

  • 1: ある種の自己接触リング (逆の外リングと逆の穴リング)を妥当とします。この評価モデルはこれらのツールで使われるため「ESRIフラグ」とも言われます。OGCモデルでは不正とされることに注意してください。

GEOSモジュールで実現しています。

Availability: 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     |        |