Vérifier si le résultat de st_difference est vide
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
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