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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

 

Pied de page des forums

Powered by FluxBB