Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#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: 1534

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: 1534

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;

Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#6 Thu 10 December 2020 12:15

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1534

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: 1534

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: 1534

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

 

Pied de page des forums

Powered by FluxBB