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

Printemps des cartes 2024

#1 Fri 15 November 2013 10:04

ppluvinet
Participant assidu
Lieu: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

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: 1536

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 ! smile ), 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: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

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: 3169
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: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

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.


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Pascal PLUVINET

Hors ligne

 

#6 Fri 15 November 2013 16:09

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

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

ppluvinet a écrit:

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: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

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

ppluvinet a écrit:

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

ppluvinet a écrit:

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: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

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

 

Pied de page des forums

Powered by FluxBB