Vérifier si le résultat de st_difference est vide

Aug 20 2020

J'essaie de sélectionner des lignes qui touchent complètement un polygone (pas seulement en un seul point).

Je suppose que ce serait un cas simple de st_isempty ( st_difference (geom_a,geom_b)).

Cependant, ce n'est pas le cas comme vous pouvez le voir sur l'image suivante.

Je souhaite que seules les lignes jaunes en surbrillance soient renvoyées. Qu'est-ce que je fais mal?

(Je pourrais le résoudre avec une comparaison de chaînes, mais je voudrais éviter l'invocation supplémentaire de "st_astext").

La requête:

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)

Réponses

1 Taras Aug 21 2020 at 21:25

Pour votre problème, je peux suggérer d'essayer une autre approche en utilisant le ST_IsValid()qui est un booléen et fonctionne comme T(1)/F(0). Ainsi, votre requête ressemblera à

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)

Je peux me tromper, mais votre problème a probablement quelque chose à voir avec un avertissement décrit dansST_IsEmpty()

Modifié : 2.0.0 Dans les versions précédentes de PostGIS, ST_GeomFromText('GEOMETRYCOLLECTION(EMPTY)') était autorisé. Ceci est désormais illégal dans PostGIS 2.0.0 pour mieux se conformer aux normes SQL/MM