2016-07-12 8 views
1

テーブルにジオメトリカラムgeomがあります。このジオメトリ列には、このような制約があります:あなたが見ることができるようPostgisは無効なジオメトリを追加できます

CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2), 
CONSTRAINT enforce_geotype_geom CHECK (geometrytype(geom) = 'POLYGON'::text), 
CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 3857) 

ので、このジオメトリ列についての特別なものは何もありません。面白いです何でも、それは私がテーブルに間違ったジオメトリを追加することができますということです。

insert into layer (geom) values (
    ST_GeomFromText('POLYGON((4831087.7172221 7576170.7140277, 
     4829023.9174584 7556144.212617, 
     4834450.9464667 7556602.8347867, 
     4833533.7021273 7575329.9067165, 
     4831087.7172221 7576170.7140277), 
    (4815647.4375453 7566616.0854925, 
     4817864.1113651 7574183.3512927, 
     4825049.1920219 7573342.5439816, 
     4821609.5257499 7567609.7668602, 
     4815647.4375453 7566616.0854925))', 3857) 
); 

事は、これは「穴」と多角形ではないです。これらは離れている2つの異なるポリゴンです。何故ですか?なぜPostgisは間違ったジオメトリを追加できますか?

EDIT

私はST_IsValidと、このジオメトリをチェックし、それはfalseです。だから、Postgisのバグみたいです。

+0

これは仕様です。バグではありません。無効なジオメトリが存在し、何らかの形で保存し、理想的には固定する必要があります。それらをテーブルに入れたくない場合は、チェック制約を追加してください(コメントの中で行ったように)。 –

答えて

2

あなたはそれが有効なポリゴンをしないにもかかわらず

ST_GeomFromText('POLYGON((0 0, 0 1, 1 0, 1 1, 0 0))') 

のように、任意の閉じた線からポリゴンを作成することができます。

st_isvalid()機能でチェック制約を使用してください。

+0

ありがとう! 1つの小さな質問:この制約はテーブルスキーマのように見えるべきですか? 'CONSTRAINT enforce_valid_geom CHECK(st_isvalid(geom))'のような何か? – Jacobian

+0

確かに、それはうまくいくはずです。 –

関連する問題