#1 Fri 08 March 2019 11:31
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
PostGIS - ST_Difference => délais de traitement
Bonjour
Je dois faire la comparaison entre 2 couches de polygones (surfaces créées entre les 2 couches, environ 1400 polygones par couche).
J'ai lancé une requête qui me donne le résultat attendu, mais avec un délais de réalisation très long (plus ou moins 20mn).
Code:
WITH a19 AS ( SELECT st_makevalid(st_collect(xxx19.wkb_geometry)) AS wkb_geometry, FROM xxx19 ), a18 AS ( SELECT st_makevalid(st_collect(xxx18.wkb_geometry)) AS wkb_geometry, FROM xxx18) SELECT (st_dump(st_makevalid(st_difference(a18.wkb_geometry, a19.wkb_geometry)))).geom::geometry(Polygon,3944) AS wkb_geometry FROM a18,a19
je fais un st_collect pour faire une comparaison 1X1 et je suis obligé de faire un st_makevalid sur les st_collect et st_difference pour éviter les problèmes de topologie.
Question :
N'existe-t-il pas une méthode un peu plus rapide ?
Merci par avance de vos réponses.
JP
Hors ligne
#2 Fri 08 March 2019 12:12
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1143
Re: PostGIS - ST_Difference => délais de traitement
Salut,
Code:
SELECT (st_dump(st_makevalid(st_union(st_difference(x18.wkb_geometry, x19.wkb_geometry))))).geometry FROM x18 JOIN x19 ON x18.wkb_geometry && x19.wkb_geometry
avec un index sur une des deux tables ?
Hors ligne
#3 Fri 08 March 2019 12:17
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: PostGIS - ST_Difference => délais de traitement
Merci tumasgiu
Je teste lundi la méthode et fais un retour.
Cordialement
Hors ligne
#4 Wed 13 March 2019 11:11
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: PostGIS - ST_Difference => délais de traitement
Bonjour.
En effet avec votre requête (sans UNION) je passe de 20mn de traitements à .... 20 secondes !
Je dois par contre analyser les résultats car je passe de 27000 objets en sotie de ma requête à 31800.
J'ai aussi un doute sur le test && : je suppose qu'un objet de ma couche A qui n'existe plus dans B ne sera pas remonté par le st_difference(A.wkb_geometry , B.wkb_geometry) si A.wkb_geometry && B.wkb_geometry est null ?
Hors ligne
#5 Wed 13 March 2019 15:24
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3180
- Site web
Re: PostGIS - ST_Difference => délais de traitement
Bonjour,
un objet de ma couche A qui n'existe plus dans B
Comprend pas bien
A et B contiennent ils des polygones différents ? Tous ?
Si non mettre une id à chaque polygone différent et ajouter une clause WHERE a.id<>b.id
si A.wkb_geometry && B.wkb_geometry est null
En fait a.geom && b.geom renvoie Vrai ou Faux et c'est cette clause qui accélère le traitement car elle permet d'utiliser les index géométriques.
Ensuite l'utilisation de st_collectionextract(geomcol,3) ne permet de récupérer que les polygones résultant,il peut y avoir des polylines résiduelles.
Dernière modification par ChristopheV (Thu 14 March 2019 19:45)
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne