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 표준을 더 잘 준수하기 위해 PostGIS 2.0.0에서 불법입니다.