名前

ST_IsValidReason — ジオメトリが妥当か否かを示す文字列を返し、不正な場合は理由を返します。

概要

text ST_IsValidReason(geometry geomA);

text ST_IsValidReason(geometry geomA, integer flags);

説明

ジオメトリが妥当かどうか、不正な場合はその理由を示す文字列を返します。

不正なジオメトリと理由の詳細報告を生成するのに、ST_IsValidと併用します。

許されるflagsは、 ST_IsValidDetailにあります。

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

Availability: 1.4

Availability: 2.0 フラグを取る形式。

この例では蝶ネクタイ型の不正ポリゴンを使います。

Code
SELECT ST_IsValidReason(
    'POLYGON ((100 200,100 100,200 200,
     200 100,100 200))'::geometry) as validity_info;
出力:
Self-intersection[150 150]
Figure
Geometry figure for visual-st-isvalidreason-01

この例では5行が成功する試験から拒否された最初の3タプルを返します。

Code
SELECT gid, ST_IsValidReason(geom) as validity_info
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  |      validity_info
------+--------------------------
 5330 | Self-intersection [32 5]
 5340 | Self-intersection [42 5]
 5350 | Self-intersection [52 5]

Simple example.

Code
SELECT ST_IsValidReason('LINESTRING(220227 150406,2220227 150407,222020 150410)');
出力:
 st_isvalidreason
------------------
 Valid Geometry
Figure
Geometry figure for visual-st-isvalidreason-03

関連情報

ST_IsValid, ST_Summary