Проверка, пуст ли результат st_difference
Я пытаюсь выбрать линии, которые полностью касаются многоугольника (а не только в одной точке).
Я бы предположил, что это будет простой случай 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)
Ответы
По вашей проблеме я могу предложить попробовать другой подход с использованием 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.