#1 Fri 15 November 2013 10:04
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
PostGIS : Intersection très longue
Bonjour,
Je souhaite découper des polylignes (plusieurs centaines de milliers , de petite taille, avec une géométrie très simple) par des polygones (quelques centaines, de grande taille, avec une géométrie très compliquée, énormément de vertex).
J'ai testé cette requête sous PostGIS2 qui a mis environ 10h :
Code:
create table lignes_coupe as select a.id, ( st_dump(st_intersection(a.geom,b.geom))).geom as geom from mes_lignes a, mes_polygones b where st_intersects(a.geom,b.geom)
Je précise que les polylignes et les polygones sont indexés avec la méthode gist.
J'ai fait la même découpe sous ArcGIS , j'obtiens le même résultat en 5minutes !!!!
Voici quelques éléments de ma configuration de Postgresql :
Code:
shared_buffers = 960MB # min 128kB work_mem = 700MB # min 64kB maintenance_work_mem = 300MB # min 1MB effective_cache_size = 990MB
Auriez-vous quelques suggestions ? Je remercie la communauté d'avance !
Pascal PLUVINET
Hors ligne
#2 Fri 15 November 2013 10:57
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: PostGIS : Intersection très longue
Bonjour,
Il y a quelques messages qui parlent de ceci, avec des pistes possibles (enfin, plus qu'une piste, puisque la requete de Paul Ramsey fait tomber le temps de requete de 56 min a 3 min ! ), par exemple:
http://gis.stackexchange.com/questions/ … n-postgis.
Sur quelle version de PG/Pgis faites-vous ces requetes ?
Nicolas
Hors ligne
#3 Fri 15 November 2013 11:20
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: PostGIS : Intersection très longue
Sous Windows 7,
Code:
select version(); version ------------------------------------------------------------- PostgreSQL 9.1.3, compiled by Visual C++ build 1500, 32-bit (1 ligne) select postgis_version(); postgis_version --------------------------------------- 2.0 USE_GEOS=1 USE_PROJ=1 USE_STATS=1 (1 ligne)
Pascal PLUVINET
Hors ligne
#4 Fri 15 November 2013 14:32
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3197
- Site web
Re: PostGIS : Intersection très longue
Bonjour,
En lisant la réponse de P. Ramsey une idée que je n'ai pas le temps de tester donc peut-être une bêtise ...
Si une polyligne traverse plusieurs polygone elle va être analysée n fois.
En créant une table temporaire qui contiendrait la polyligne résultat de l'intersection de la polyligne originelle et de la BBox du polygone complétée avec un not st_within on obtient des polyligne qui intersectent au maximum trois polygones, le tratement final portant sur ces nouvelles entitées ne gagne t on pas du temps ?
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#5 Fri 15 November 2013 15:27
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: PostGIS : Intersection très longue
Bonjour Christophe,
Les polylignes sont de très petite taille et les polygones de très grandes tailles et les polygones sont tous disjoints entre eux.
Par conséquent, il est très très rares qu'une polylignes intersecte plusieurs polygones.
J'ai pas eu le temps de tester ce que suggère Paul Ramsey (Peut-être que je testerai ce soir en partant...).
Ce que j'ai ommis de préciser c'est que les polygones sont très complexes et la plupart des polylignes sont à cheval sur un polygone.
Ci joint un exemple.
Pascal PLUVINET
Hors ligne
#6 Fri 15 November 2013 16:09
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: PostGIS : Intersection très longue
Il peut etre avantageux de decouper ces gros polygones par une grille d'un pas fixé (st_makeGrid() disponible sur les forums Postgis pour créer facilement une grille).
Ca booste bien les requetes.
Nicolas
Hors ligne
#7 Fri 15 November 2013 16:53
- Fritsch
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 8 Nov 2006
- Messages: 32
Re: PostGIS : Intersection très longue
J'ai pas eu le temps de tester ce que suggère Paul Ramsey (Peut-être que je testerai ce soir en partant...).
Ce que j'ai omis de préciser c'est que les polygones sont très complexes et la plupart des polylignes sont à cheval sur un polygone.
Ci joint un exemple.
D'après l'exemple, presque toutes les polylines intersectent au moins un polygone. Dans ces conditions, la méthode suggérée n'apportera rien.
Le MakeGrid proposé par Nicolas Ribot me semble la meilleure solution.
Elle présente néanmoins un artefact : si l'intersection avec un polygone se trouve à cheval sur deux pavés du Grid, elle va générer deux segments différents, contigus, là où le résultat attendu est l'union de ces deux segments.
Il faudra donc procéder à la réunion des morceaux de segments contigus.
Hors ligne
#8 Fri 15 November 2013 17:21
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: PostGIS : Intersection très longue
J'ai un peu mieux regardé la solution de P. Ramsey mais effectivement je pense que ca ne servira quasi à rien.
Egalement, j'avais déjà pensé à la création d'une grille, puis à faire un st_union pour agréger les segments contigus.
Or, pas évident de choisir la bonne taille de maille.
L'intersection entre les polygones et la grille peut être assez long aussi.
J'ai quand même du mal à comprendre l'écart de durée de calcul entre Postgis et ArcGIS !
Merci pour vos réactions.
Pascal PLUVINET
Hors ligne
#9 Mon 18 November 2013 16:28
- Fritsch
- Participant occasionnel
- Lieu: Paris
- Date d'inscription: 8 Nov 2006
- Messages: 32
Re: PostGIS : Intersection très longue
Code:
create table lignes_coupe as select a.id, ( st_dump(st_intersection(a.geom,b.geom))).geom as geom from mes_lignes a, mes_polygones b where st_intersects(a.geom,b.geom)
- peux-tu nous donner le rendu du EXPLAIN de cette requête ? Peux-tu y joindre les EXPLAIN obtenus en supprimant un des deux gist, puis en le rétablissant et en supprimant l'autre ?
Ce que j'essaierais aussi :
- décomposer le processus pour mettre le dump à part. Dans un premier temps, je stockerais l'intersection sous une forme rugueuse, dans une colonne temporaire de "mes_lignes". Ensuite seulement, je la dump dans une nouvelle table.
- ensuite seulement, je passerais par le make_grid
Or, pas évident de choisir la bonne taille de maille.
L'intersection entre les polygones et la grille peut être assez long aussi.
Intersection longue, mais faite une seule fois pour chaque polygone. Je choisirais le pas de la grille :
P = racine ( surface totale des polygones / racine ( nombre total de vertex des polygones ) )
Ensuite, je testerais P/2, puis P/4.
Hors ligne
#10 Wed 20 November 2013 17:39
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: PostGIS : Intersection très longue
Merci pour ces suggestions.
Malheureusement, j'ai dû passer à autre chose (d'autant + que j'ai mon résultat sous ArcGIS).
Peut-être pas dans ce cas précis, mais sur d'autres cas similaires, je testerai les formules proposées pour la taille des pas de la grilles.
P = racine ( surface totale des polygones / racine ( nombre total de vertex des polygones ) )
Je me demandais d'ailleurs quel était le raisonnement de Fritsch pour proposer une telle formule !?!?
Encore Merci et à très bientôt,
Pascal PLUVINET
Hors ligne
#11 Wed 20 November 2013 21:18
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: PostGIS : Intersection très longue
Bonsoir,
pourquoi ne pas utiliser l'astuce citée içi http://georezo.net/forum/viewtopic.php?id=84911
par Nicolas Ribot en utilisant le With, moi je divise le temps par 10 sur mes traitements.
En résumé, on associe dans une table temporaire chaque ligne avec la géométrie des polygones à proximité (par un st_dwithin par exemple) et on n'applique l'opération st_intersection uniquement sur cette pré-sélection.
A+
Hors ligne