Проверка, пуст ли результат 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)'). Теперь это запрещено в PostGIS 2.0.0, чтобы лучше соответствовать стандартам SQL / MM.