Pages: 1
- Sujet précédent - [postgis] intersection ou différence de multipolygon incomplètes - Sujet suivant
#1 Wed 09 December 2020 09:48
- 1pichet
- Juste Inscrit !
- Date d'inscription: 2 Jul 2020
- Messages: 6
[postgis] intersection ou différence de multipolygon incomplètes
Bonjour à tous,
Je sui confronté à un problème d'intersection ou de différence entre deux multi-polygone.
Dans le cadre de mon travail j'avais besoin de faire la différence d'une couche de multi-polygones (A) par une autre couches de polygones (B). Pour se faire j'ai commencé par créer une couche (C) union des polygones de la couche B qui intersectent les polygones de la couche A.
Ensuite j'ai réalisé une différence entre les polygones de la couche A avec ceux de la couche C. J'avais fait un lien avec la clé primaire de la table A.
En regardant de plus près le résultat, je me suis aperçu que la différence réalisée sur certains polygones était incomplète. En gros si j'ai un multi-polygone C qui est composé de deux polygones B1 et B2 qui intersectaient bien un multi-polygone A, lorsque je fais St_Difference(A,C) j'obtiens le même résultat que St_difference(A,B1).
Il en va de même pour St_Intersection. La partie B2 du multi-polygone C semble ne pas être vue alors qu’elle chevauche bien le polygone A.
J'ai vérifié la validité des polygones ainsi que le SRID, et les surfaces mais rien à redire.
Lorsque je réalise l'opération suivante St_Difference(A, St_buffer(C,0.01)), là j'obtiens bien le bon résultat.
Je n'ai pas réussi à trouver d'information sur ce problème, et du coup j'aimerais savoir s'il y a un moyen de le contourner sans passer par des buffer.
Merci d'avance pour vos réponses.
PostgreSQL 9.5.24
Postgis 2.2.1
(impossible de demander des versions plus récentes...)
Hors ligne
#2 Wed 09 December 2020 11:42
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [postgis] intersection ou différence de multipolygon incomplètes
Bonjour
Vous auriez un exemple ?
Nicolas
Hors ligne
#3 Thu 10 December 2020 08:44
- 1pichet
- Juste Inscrit !
- Date d'inscription: 2 Jul 2020
- Messages: 6
Re: [postgis] intersection ou différence de multipolygon incomplètes
Bonjour et merci de s'être penché sur le problème.
En tentant de créer un script pour vous envoyer mon exemple, postgis m'a fait état d'une erreur de topologie dans mon polygon issu d'un union.
Dans la table source lorsque je fais un test avec St_Valid, cette erreur n’apparaît pas. Par contre lorsque je transforme la géométrie en texte pour faire un script puis que je la "retransforme" en géométrie, là elle est identifiée par un St_Valid. En gros, je n'arrive pas à vous fournir l'exemple.
Par ailleurs, j'ai créé deux fonctions (différence et intersection) qui à partir de multipolygones en entrée bouclent sur les polygones pour faire ces opérations et les résultats sont corrects.
Du coup je vais clore le sujet.
Merci encore.
Hors ligne
#4 Thu 10 December 2020 09:16
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [postgis] intersection ou différence de multipolygon incomplètes
Bonjour,
l'invalidité vient de la conversion en texte: ca tronque un peu les coord => pg invalides. (vous pouvez préciser le nbre de coord dans la version text)
et sinon, pas besoin de convertir en texte pour échanger: vous pouvez faire un dump de la table (ou d'un extrait de la table) en format compressé (binaire donc) ou meme exporter les geom en WKB (pas de perte de précision)
Nicolas
Hors ligne
#5 Thu 10 December 2020 11:23
- 1pichet
- Juste Inscrit !
- Date d'inscription: 2 Jul 2020
- Messages: 6
Re: [postgis] intersection ou différence de multipolygon incomplètes
Bonjour,
J'ai mis en lien deux exports des tables. Quand à la requête qui initialement ne fonctionnait pas, la voici :
Code:
CREATE TABLE diff_a_c AS SELECT St_difference(a.the_geom, COALESCE(c.the_geom,'POLYGON EMPTY'::geometry)) FROM multipoly_a a LEFT JOIN union_c c ON a.id=c.id_t1;
Hors ligne
#6 Thu 10 December 2020 12:15
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [postgis] intersection ou différence de multipolygon incomplètes
Merci pour les données.
J'ai testé dans PG13, pgis 3.1: le résultat est faux, comme ce que vous constatez. Les geom sont bien valides, donc je dirais que c'est un bug (ca peut etre bien de créer un nouveau bug dans le bug tracker de postgis, avec les deux geom du test).
On constate aussi que malgré la validité, la geom union_c est bien degueu, avec des petites parties ultrafines en plusieurs endroits.
Un buffer, meme tout petit (0.0001) nettoie la geom effectivement et permet à st_difference de marcher.
Donc tant que le bug n'est pas résolu, votre méthode avec buffer est la bonne. Ca peut etre bien de nettoyer la couche avant ces traitements, par ex avec st_buffer ou avec GRASS (très pratique pour rendre une couche clean en topologie).
Nicolas
Hors ligne
#7 Thu 10 December 2020 12:24
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [postgis] intersection ou différence de multipolygon incomplètes
Une fonction bien pratique pour identifier ces données pas très propres est st_minimumClearance (et st_minimumClearanceLine).
Sur le poly union_c:
Code:
select st_minimumclearance(the_geom) from union_c; 0.000000000020960202220813827
Vraiment tout petit !
Nico
Hors ligne
#8 Thu 10 December 2020 14:31
- 1pichet
- Juste Inscrit !
- Date d'inscription: 2 Jul 2020
- Messages: 6
Re: [postgis] intersection ou différence de multipolygon incomplètes
Merci beaucoup pour votre réponse, ça devrait m'aider pour peaufiner les scripts.
Et effectivement, les couches en entrée sont bien pourries...
Hors ligne
#9 Thu 10 December 2020 17:20
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [postgis] intersection ou différence de multipolygon incomplètes
Je viens de tester avec postgis 3.1.0beta1 et GEOS 3.9.0:
• La différence se fait sans soucis avec cette version
• On peut aussi utiliser les fonctions intersection, union, difference, ... avec un paramètre de snapping, Enfin ! youpi.
• La fonction st_reduceprecision permet de nettoyer des données à une certaine précision.
Ces fonctions vont grandement améliorer la robustesse des opérations sur les géométries !
Nicolas
Hors ligne
Pages: 1
- Sujet précédent - [postgis] intersection ou différence de multipolygon incomplètes - Sujet suivant