#1 Tue 22 November 2016 18:05
- Pivès001
- Participant actif
- Date d'inscription: 23 Jan 2008
- Messages: 138
[PostgreSQL 9.5.1] Corriger des self-intersection
Bonjour,
j'ai des erreurs de géométries (self-intersection) dans une table que je cherche à corriger. Pour cela j'utilise un buffer à 0 qui d'habitude fonctionne mais là cela me renvoi un message d'erreur du aux contraintes de ma table. Voilà comment je procède :
Identification des géométries invalides
Code:
select ST_IsValidReason(geom), id from matable where not st_isvalid(geom)
Nettoyage des géométries invalides
Code:
update matable set geom = st_buffer(geom, 0) where not st_isvalid(geom)
Message d'erreur
Code:
la nouvelle ligne viole la contrainte de vérification « matable» de la relation « enforce_geotype_geom »
Contrainte "enforce_geotype_geom"
Code:
CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geom IS NULL OR st_isempty(geom))
Comment palier à ce problème ? Mes géométries corrigées restent pourtant du type multipolygon.
Merci par avance de toute suggestion.
Hors ligne
#2 Tue 22 November 2016 18:20
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: [PostgreSQL 9.5.1] Corriger des self-intersection
Bonjour
Pourquoi ne pas utiliser st_makevalid() ?
Dernière modification par ChristopheV (Tue 22 November 2016 18:20)
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#3 Tue 22 November 2016 18:52
- Lionel B
- Participant actif
- Lieu: Macon
- Date d'inscription: 5 Sep 2005
- Messages: 83
Re: [PostgreSQL 9.5.1] Corriger des self-intersection
Bonjour,
ou sinon
Code:
update matable set geom = st_multi(st_buffer(geom, 0)) where not st_isvalid(geom)
Hors ligne
#4 Tue 22 November 2016 22:15
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [PostgreSQL 9.5.1] Corriger des self-intersection
Bonsoir,
Je plussoie Christophe: st_makeValid corrige bien les géométries.
Pour etre sur d'avoir le type attendu:
... set geom = st_multi(st_collectionExtract(st_makeValid(geom), 3));
Nicolas
Hors ligne
#5 Wed 23 November 2016 09:28
- Pivès001
- Participant actif
- Date d'inscription: 23 Jan 2008
- Messages: 138
Re: [PostgreSQL 9.5.1] Corriger des self-intersection
Bonjour et merci de vos réponses.
La solution de Lionel B fonctionne.
Code:
update matable set geom = st_multi(st_buffer(geom, 0)) where not st_isvalid(geom)
Celle de Nicolas Ribot et ChristopheV m’intéresse malgré tout, je vais la regarder de plus près.
Code:
set geom = st_multi(st_collectionExtract(st_makeValid(geom), 3));
Ce qui me surprend c'est d'avoir des éléments ne respectant pas les contraintes suite aux imports, alors que c'est inhérent à ma table.
Encore merci à tous dans tous les cas.
Hors ligne
#6 Wed 23 November 2016 09:52
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [PostgreSQL 9.5.1] Corriger des self-intersection
Bonjour,
Qq mots d'explication:
st_buffer(geom, 0) est un vieux trick pour réparer des géométries. Qui marchait tellement bien que le principe a été repris (entre autre) dans la fonction st_makeValid().
Ensuite, concernant votre table, attention à la confusion:
Vous déclarez un type géométrique pour la table qui dit juste quel type d'objet peut etre stocké dans la table: ca ne rajoute aucun comportement "magique" aux traitements de données que vous pouvez faire.
Quand vous faites update ... set geom = <requete>, la partie <requete> n'est en rien liée a votre table: elle doit s'exécuter et retourner le type attendu par la colonne geom.
Enfin, lors du makeValid, l'algo tente de conserver le nombre de sommets de la géométrie et de reconstruire un vrai polygone. Suivant les cas de figure, le résultat peut etre un PG, un MULTIPG, ou une GEOMETRYCOLLECTION (points, lignes pg mélangés).
C'est a vous, géomaticien, de savoir que vous ne voulez que des éléments surfaciques en MULTIPG, et donc qu'il faut extraire et convertir les éléments du résulat dans le type voulu.
Nico
Hors ligne
#7 Wed 23 November 2016 10:14
- Pivès001
- Participant actif
- Date d'inscription: 23 Jan 2008
- Messages: 138
Re: [PostgreSQL 9.5.1] Corriger des self-intersection
Ok, merci de ces explications.
Hors ligne