Lors de la découpe des polygones d'une table avec des polygones dans une autre, ST_Intersection peut renvoyer un ensemble de résultats qui peuvent être gérés avec ST_Dump. Les multiples géométries renvoyées ne sont pas nécessairement ST_Polygon mais également ST_LineString (probablement aussi un point). Ainsi, lors de l'exécution d'une requête
INSERT INTO c (geom)
(SELECT (ST_Dump(ST_Intersection(a.geom,b.geom))).geom
FROM a INNER JOIN b ON ST_Intersects(a.geom, b.geom));
lorsque vous essayez de remplir le tableau "c" avec des polygones écrêtés, il échoue avec ERREUR: le type de géométrie (LineString) ne correspond pas au type de colonne (Polygon)
J'ai fait une autre instruction SELECT imbriquée, de sorte que seules les géométries de polygone ont traversé, comme:
INSERT INTO c (geom)
(SELECT geom FROM
(SELECT (ST_Dump(ST_Intersection(a.geom,b.geom))).geom
FROM a INNER JOIN b ON ST_Intersects(a.geom, b.geom))) AS cl
WHERE ST_GeometryType(cl.geom)='ST_Polygon');
Comme c'est un peu lourd, je me demande s'il existe une solution plus élégante pour supprimer des géométries invalides?
{}
au-dessus de la fenêtre d'édition de la question.Réponses:
Cela pourrait être un bon endroit pour utiliser une fonction en langage SQL. Voici un rapide qui devrait fonctionner pour cette situation:
Cela conservera les composants polygonaux d'une intersection, mais jetera tout le reste. Il renvoie toujours un MultiPolygon, même si vous avez un ou aucun composant.
la source
Très bonne réponse de @dbaston. Cependant, le retour d'une géométrie vide au lieu de null peut entraîner des problèmes car la géométrie vide renvoyée n'a pas de srid. St_Intersection peut également renvoyer MultiPolygon. Cette fonction mise à jour m'a été vraiment utile:
la source