Pages: 1
- Sujet précédent - [POSTGIS] st_intersection, optimisation de temps et 3 tables créées - Sujet suivant
#1 Thu 28 April 2016 12:34
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
[POSTGIS] st_intersection, optimisation de temps et 3 tables créées
Bonjour,
Je souhaite réaliser l'intersection entre deux couches de polygones (SAGA me met 2-3 minutes pour faire le traitement) comme cela :
Code:
create table test_intersection as select D.geom as Dgeom, T.geometry as Tgeom, st_intersection(D.geom, T.geometry) as intersect_DT From "7095_DEPARE_Polygon" D inner join "sous_triangle_z" T on st_intersects(D.geom, T.geometry) where st_overlaps (D.geom,T.geometry);
Si je ne mets pas de limite POSTGIS semble être planté, si je mets une limite à 20 par exemple il met 0.2 seconde. D'où peut venir le problème?
Et pourquoi, j'obtiens 3 tables en resultat (une pour chacune de mes couches intersectées et la couche résultat).
J'espère être clair?
en complément ma table D possède 872 polygones et ma table T possède 28078 polygones, chaque table possède des index spatiaux
Ted
Hors ligne
#2 Thu 28 April 2016 14:07
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: [POSTGIS] st_intersection, optimisation de temps et 3 tables créées
Bonjour,
Il me semble que si st_overlaps retourne vrai alors st_intersects retourne vrai. Donc la seule condition st_overlaps=vrai est nécessaire.
Ensuite st_intersection va retourner une géométrie collection qui contiendra des polylignes, des polygones etc...
Voici un exemple qui fonctionne et qui permet d'obtenir les multipolygones résultat de l'intersection de multipolygones:
Code:
WITH a as (SELECT id,libelle,geom as geoma FROM public.selection_247 WHERE id=20), -- un multipolygone b as (SELECT id,libelle,geom as geomb FROM public.selection_247 WHERE id<>20), -- les autres col as (SELECT b.id as id,'intersection id20 et ' || b.libelle as libelle, (st_dump(st_intersection(geoma,geomb))).geom as colgeom FROM a,b WHERE st_intersects(geoma,geomb)) -- geometry collection SELECT col.id,libelle,(st_setsrid(st_multi(st_union(colgeom)),3942)) as geom -- force multipolygone INTO public.intersection_id20_247 FROM col WHERE geometrytype(colgeom)='POLYGON' GROUP BY col.id,libelle -- élimine autres géométries
Dernière modification par ChristopheV (Thu 28 April 2016 14:09)
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#3 Thu 28 April 2016 14:35
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGIS] st_intersection, optimisation de temps et 3 tables créées
Bonjour,
Pour cette problematique d'opération spatiale entre deux couches polygonales, les fonctions suivantes sont bien pratiques:
st_multi(st_collectionExtract(<intersection, union, difference...>, 3))
Ca force une multicollection avec uniquement des surfaces (param 3), sachant que les opérations spatiales entre deux surfaces peuvent renvoyer un multipolygone.
Nico
Hors ligne
#4 Mon 02 May 2016 10:14
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [POSTGIS] st_intersection, optimisation de temps et 3 tables créées
Bonjour,
Je viens de tester la requête de Christophe en l'adaptant à mes tables :
Code:
WITH a as (SELECT id_ss_triangle,id_triangle,st_zmin,geometry as geoma FROM sous_triangle_z ), -- un multipolygone b as (SELECT id,drval1,geom as geomb FROM "7095_DEPARE_Polygon" ), -- les autres col as (SELECT b.id as id,'intersection id20 et ' || b.drval1 as drval1, (st_dump(st_intersection(geoma,geomb))).geom as colgeom FROM a,b WHERE st_intersects(geoma,geomb)) -- geometry collection SELECT col.id,drval1,(st_setsrid(st_multi(st_union(colgeom)),4326)) as geom -- force multipolygone INTO depare_sous_triangle_z2 FROM col WHERE geometrytype(colgeom)='POLYGON' GROUP BY col.id,drval1 -- élimine autres géométr
mais j'ai un message d'erreur en retour :
collection_construct: mixed dimension geometries: 0/2
Cela provient-il du st_union?
Mes données sont des polygones pour "sous_triangles_z" et des multipolygones pour "7095_DEPARE_Polygon".
D'avance merci
Ted
Hors ligne
#5 Mon 09 May 2016 14:48
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [POSTGIS] st_intersection, optimisation de temps et 3 tables créées
Bonjour,
Je reviens vers vous. J'ai essayé également la requête proposée par Nicolas. Elle fonctionne, à condition de mettre une limite sinon j'explose les temps de réponses. Pour un ordre d'idée, si je mets une limite à 10, il me faut 85secondes de traitement (sous SAGA, pour le traitement, j'ai 2'30 à attendre).
Mes deux tables ont des index spatiaux.
Un si long traitement est-il normal?
Ted
Hors ligne
#6 Mon 09 May 2016 16:03
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: [POSTGIS] st_intersection, optimisation de temps et 3 tables créées
Bonjour,
872 polygones d'un coté, 28078 de l"'autre cela fait près de 24.5 millions de lignes à traiter.
Une solution est de créer une table temporaire (ou utiliser une CTE) pour ne travailler que sur les géométries ayant une intersection probable.
Exemple
Code:
SELECT d.id,t.id,d.geom,t.geom INTO public.temptable FROM d,t WHERE d.geom && t.geom
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#7 Mon 09 May 2016 17:13
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [POSTGIS] st_intersection, optimisation de temps et 3 tables créées
Bonjour,
J'ai fini par y arriver avec une requête simple et attendre que le résultat apparaisse (en fonction des données que je lui donne à manger ça va de 90s à 200s).
Par contre, lorsque je charge sous QGIS, une de mes couches de test, j'ai un message d'erreur :
la couche n'est pas valide : la couche port =5432 sslmode=disable table="public"... n'est pas une couche valide
et lorsque je veux voir l'aperçu de ma couche via le gestionnaire BD de QGIS je ne vois rien tandis que pour la table je vois parfaitement les colonnes.
Quelqu'un a une idée? Je peux vous faire des exports partiels de données pour test!
Ted
Hors ligne
#8 Mon 09 May 2016 17:32
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [POSTGIS] st_intersection, optimisation de temps et 3 tables créées
Bonjour
Pour qgis: vérifier si la table possede une clé primaire (en ajouter une sinon)
vérifier le type de la colonne géométrique: si c'est "geometry", le définir en un type compris par postgis:
alter table ... alter column ... type geometry (<geom type>, <srid>);
Nicolas
Hors ligne
#9 Tue 10 May 2016 08:34
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [POSTGIS] st_intersection, optimisation de temps et 3 tables créées
Bonjour,
J'ai créé deux tables différentes avec des données sources différente géographiquement, une fonctionne et pas l'autre. J'ai bien tout vérifié (comparaison) et je ne vois pas ce qui pêche.
Cordialement
Hors ligne
Pages: 1
- Sujet précédent - [POSTGIS] st_intersection, optimisation de temps et 3 tables créées - Sujet suivant