#1 Tue 09 February 2016 16:07
- Lucie D.
- Participant actif
- Date d'inscription: 21 Oct 2013
- Messages: 137
postgis 2.1: explications st_makevalid
Bonjour,
Quelqu’un pourrait-il m’expliquer concrètement comment fonctionne le st_makevalid() dans postigs ?
En effet, je dispose d’une couche de multipolygones dont certains ne sont pas valides (self-intersection ou ring self-intersection). J’ai essayé la requête suivante :
Update n_bati_dgi_038_2015
set the_geom=st_buffer(the_geom, 0.0)
where ST_isValid(the_geom)=false
Mais ça me renvoie un message d’erreur (ça ne marche pas avec les multipolygones?).
J’utilise donc la requête qui fonctionne très bien et que j’ai récupérée sur internet, mais j’aimerais la comprendre :
update n_bati_dgi_038_2015
set the_geom = ST_CollectionExtract(ST_Force_Collection(ST_MakeValid(the_geom)),3)
where ST_isValid(the_geom)=false;
Pourriez-vous m’expliquer ce que fait concrètement cette requête ? Quelle différence y a-t-il avec la requête st_buffer() (il me semble que le buffer de 0 supprime certains bouts de polygones...) ?
En vous remerciant par avance pour votre aide précieuse !
Bien cordialement,
Lucie D.
PS : pour info je travaille sous postgis 2.1
Hors ligne
#2 Tue 09 February 2016 19:58
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: postgis 2.1: explications st_makevalid
Bonsoir,
Hmm pas facile de décrire ce que fait st_makeValid() exactement sans regarder le code...
Elle tente de réparer les géométries pour les cas d'invalidité les plus fréquents (self intersection, trous invalides par ex).
Elle utilise, de ce que j'ai compris, différentes méthodes pour cela, c'est pour ca que la fonction est assez longue. Elle utilise en partie le meme code que st_buffer pour reconstruire les géometries et détecter des cas invalides.
En gros, si postgis n'arrive pas a réparer tout seul, c'est que la geom doit avoir un pb bizarre, à éditer à la main.
Attention cependant, la fonction peut renvoyer des géometries avec des parties en moins: ne pas hésiter à controler la surface des géométries avant et après l'appel de la fonction pour vérifier si l'on n'a pas perdu de surface.
Le 'trick' st_buffer(geom, 0) n'a plus trop d'utilité du coup: st_makeValid le remplace.
Enfin, le SQL:
Code:
ST_CollectionExtract(ST_forceCollection(ST_MakeValid(the_geom)),3)
Permet de garantir le type de géométrie en sortie de la fonction:
si une table contient des PG, on ne veut que des éléments surfaciques issus de st_makeValid, pas de PT ou LN(collectionExtract). Or la fonction peut retourner une collection avec polygones, lignes et points, dans certains cas.
Nicolas
Hors ligne
#3 Wed 10 February 2016 10:03
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3197
- Site web
Re: postgis 2.1: explications st_makevalid
Bonjour,
Merci Nicolas !!
En gros, si postgis n'arrive pas a réparer tout seul, c'est que la geom doit avoir un pb bizarre, à éditer à la main.
Le jeux de données RGP 2010 présent sur le site data.gouv est typique de cette problématique et là st_makevalid() ne donne rien ...
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#4 Wed 10 February 2016 11:15
- Lucie D.
- Participant actif
- Date d'inscription: 21 Oct 2013
- Messages: 137
Re: postgis 2.1: explications st_makevalid
Bonjour Nicolas et merci pour ces explications très claires.
Je viens justement de faire le test, et j'ai un surface après requête supérieure (avant st_makevalid() = 4518010m² et après st_makevalid() = 4518072m²). Sachant pour info que sur cette couche la plupart des invalidités correspondaient à des self-intersections...
Si le st_makevalid() a tendance à supprimer des parties de certaines géométries, comment se fait-il que moi j'en aie en plus? =p Comment faire en sorte que la surface ne soit pas modifiée avec le st_makevalid()?
J'en demande beaucoup désolée mais ce forum est tellement utile!!!
Merci infiniment!
Bien cordialement,
Lucie D.
Dernière modification par Lucie D. (Wed 10 February 2016 11:16)
Hors ligne
#5 Wed 10 February 2016 11:20
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: postgis 2.1: explications st_makevalid
Bonjour
Je pense que certaines invalidités comme les self intersections ou des polygones présentant un rétrécissement tout petit peuvent être rendues valides par st_makeValid en écartant légèrement deux points, créant ainsi un peu de surface là ou deux objets se touchaient en un point.
Faudrait qq pg de tests pour se rendre compte: comparer les invalides et st_makeValid(invalidgeom) pour voir ce qui se passe.
Nicolas
Hors ligne
#6 Mon 15 February 2016 08:45
- Lucie D.
- Participant actif
- Date d'inscription: 21 Oct 2013
- Messages: 137
Re: postgis 2.1: explications st_makevalid
Bonjour,
J'ai fait plein de test et voici ce que j'en retire : st_buffer(geom,0.0) supprime quand même bien plus de bouts de géométries que le st_makevalid(). J'ai donc conservé le st_makevalid() pour la suite de mon travail puisque qu'il me permet de rester la plus précise possible avec des polygones propres! ^^
Merci beaucoup Nicolas pour ton aide!
Bien cordialement,
Lucie D.
Hors ligne
#7 Tue 10 May 2016 10:01
Re: postgis 2.1: explications st_makevalid
Bonjour,
pour mon expérience :
après différents tests entre ST_MakeValid, ST_Buffer et Cleaning geometries (http://www.sogis1.so.ch/sogis/dl/postgi … ometry.sql), je n'utilise plus que ST_MakeValid pour corriger les polygones et multi-polygones sous postgis ... même si je ne comprends pas ce que la fonction fait sur certains types d'erreurs.
Je n'utilise plus ST_Buffer (geom,0) car cette fonction supprime une partie du polygone auto-intersecté. Les différents tests empiriques que j'ai réalisés montre que ce n'est pas la surface la plus petite du polygone qui est supprimée mais, pour mes exemples, systématiquement la partie située la plus au Sud. C'est peut-être un biais dû à la manière dont j'ai créé les polygones, je n'ai pas creusé.
Pour la différence de surface : si après un ST_MakeValid la superficie totale augmente c'est parce que les grosses auto-intersections ont une surface négative avec ST_Area() : ainsi
- Avant : il semblerait que la surface globale du polygone avec auto-intersection soit : surface de la partie la plus grande moins la surface de la partie la plus petite.
- Après : ST_MakeValid retourne deux polygones avec chacun une surface positive qui s'ajoutent contrairement à avant.
Bonne journée à toutes à et tous.
Dernière modification par badol (Tue 10 May 2016 10:04)
Hors ligne