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

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.

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 Wed 23 November 2016 09:52

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

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

 

Pied de page des forums

Powered by FluxBB