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 !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Logo geoséminaire 2017

Les auditeurs du Mastère Spécialisé SILAT (AgroParisTech) vous invitent à la dixième édition du

Géoséminaire 2017, le 2 mars à Montpellier.

Retrouvez toutes les informations ici.

#1 mar. 22 novembre 2016 18:05

Pivès001
Membre
Date d'inscription: 23 janv. 2008
Messages: 106

[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 mar. 22 novembre 2016 18:20

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 sept. 2005
Messages: 2237
Site web

Re: [PostgreSQL 9.5.1] Corriger des self-intersection

Bonjour

Pourquoi ne pas utiliser st_makevalid() ?

Dernière modification par ChristopheV (mar. 22 novembre 2016 18:20)


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#3 mar. 22 novembre 2016 18:52

Lionel B
Membre
Lieu: Macon
Date d'inscription: 5 sept. 2005
Messages: 79

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 mar. 22 novembre 2016 22:15

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 932

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 mer. 23 novembre 2016 09:28

Pivès001
Membre
Date d'inscription: 23 janv. 2008
Messages: 106

Re: [PostgreSQL 9.5.1] Corriger des self-intersection

Bonjour et merci de vos réponses.

La solution de Lionel B fonctionne.

Lionel B a écrit:

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 mer. 23 novembre 2016 09:52

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 932

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 mer. 23 novembre 2016 10:14

Pivès001
Membre
Date d'inscription: 23 janv. 2008
Messages: 106

Re: [PostgreSQL 9.5.1] Corriger des self-intersection

Ok, merci de ces explications.

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |