Comprobando si el resultado de st_difference está vacío

Aug 20 2020

Estoy tratando de seleccionar líneas que tocan completamente un polígono (no solo en un punto).

Supongo que sería un caso simple de st_isempty ( st_difference (geom_a, geom_b)).

Sin embargo, este no es el caso como se puede ver en la siguiente imagen.

Me gustaría que solo se devolvieran las líneas amarillas resaltadas. ¿Qué estoy haciendo mal?

(Podría resolverlo con una comparación de cadenas, pero me gustaría evitar la invocación adicional de "st_astext").

La consulta:

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)

Respuestas

1 Taras Aug 21 2020 at 21:25

Para su problema, puedo sugerir probar otro enfoque usando el ST_IsValid()que es un booleano y funciona como T(1)/F(0). Por lo tanto, su consulta se verá como

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)

Puedo estar equivocado, pero su problema probablemente tenga algo que ver con una advertencia descrita enST_IsEmpty()

Cambiado: 2.0.0 En versiones anteriores de PostGIS ST_GeomFromText('GEOMETRYCOLLECTION(EMPTY)') estaba permitido. Esto ahora es ilegal en PostGIS 2.0.0 para cumplir mejor con los estándares SQL/MM