st_differenceの結果が空かどうかを確認する

Aug 20 2020

ポリゴンに完全に接触する線を選択しようとしています(一点だけではありません)。

st_isempty(st_difference(geom_a、geom_b))の単純なケースだと思います。

ただし、次の図に示すように、これは当てはまりません。

ハイライトの黄色い線だけを返したいのですが。私は何が間違っているのですか?

(文字列比較で解決できますが、余分な「st_astext」呼び出しは避けたいと思います)。

クエリ:

SELECT a.geometry, 
       a.id as a_id, 
       b.FID as b_id,
       st_astext(ST_GeometryN(st_difference(a.geometry,b.geometry),1)) as st_difference,
       st_isempty(ST_GeometryN(st_difference(a.geometry,b.geometry),1)) as st_isempty
FROM a
INNER JOIN b ON st_touches(a.geometry,b.geometry)

回答

1 Taras Aug 21 2020 at 21:25

あなたの問題についてST_IsValid()は、ブール値であり、として機能するを使用して別のアプローチを試すことをお勧めしT(1)/F(0)ます。したがって、クエリは次のようになります

SELECT a.geometry, 
       a.id as a_id, 
       b.FID as b_id,
       st_astext(ST_GeometryN(st_difference(a.geometry, b.geometry), 1)) as st_difference,
       ST_IsValid(ST_GeometryN(st_difference(a.geometry, b.geometry), 1)) as st_isvalid
FROM a 
INNER JOIN b ON st_touches(a.geometry, b.geometry)

私は間違っている可能性がありますが、あなたの問題はおそらくで説明されている警告と関係があります ST_IsEmpty()

変更:2.0.0以前のバージョンのPostGISではST_GeomFromText( 'GEOMETRYCOLLECTION(EMPTY)')が許可されていました。これは、SQL / MM標準への準拠を改善するためにPostGIS2.0.0では違法になりました