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では違法になりました