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 Sun 12 April 2020 15:56

preliator
Participant assidu
Date d'inscription: 17 Nov 2018
Messages: 433

Regrouper polygones qui s'intersectent - Problème sur grosse BDD

Bonjour à tous, j'essaie d'obtenir les centroides du regroupement des polygones d'une même couche qui se touchent, sur une BDD très conséquente (plusieurs dizaines de millions d'entités).

Pour cela, j'utilise la formule suivante:

Code:

drop table if exists couche_regroup;
create table couche_regroup as(

    select st_centroid(st_unaryunion(unnest(st_clusterintersecting(geom)))) as geom
    from bati_test
)

Cela fonctionne parfaitement lorsque j'ai moins de 6 000 000 d'articles. exemple: j'ai ce message normal qui apparaît, avec le nombre d'entités créées. https://zupimages.net/viewer.php?id=20/15/ielc.png

Mais si je dépasse 6 000 000 d'entités, la requête se termine mais aucun élément n'est créé dans la table. J'ai ce message qui s'affiche, mais ne me renvoie rien.
https://zupimages.net/viewer.php?id=20/15/o41z.png

Je ne comprends pas.

Je vous remercie.

Hors ligne

 

#2 Sun 12 April 2020 20:18

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

Re: Regrouper polygones qui s'intersectent - Problème sur grosse BDD

Bonsoir,

st_clusterIntersecting utilise un tableau en mémoire pour stocker les résultats.
La taille de ce tableau a une limite max, facilement dépassable avec de grosses tables.

Vérifiez la version 12, il se peut qu'elle règle ce pb.

Sinon, il faut diviser votre dataset et procéder par morceaux.

Nicolas

Hors ligne

 

#3 Sun 12 April 2020 20:22

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

Re: Regrouper polygones qui s'intersectent - Problème sur grosse BDD

Vous pouvez aussi tenter "à l'ancienne", en faisant l'union de la couche et le dump du résultat (regardez dans la doc quelle fonction st_union ou st_memUnion est la plus adaptée).

Hors ligne

 

#4 Tue 14 April 2020 20:00

preliator
Participant assidu
Date d'inscription: 17 Nov 2018
Messages: 433

Re: Regrouper polygones qui s'intersectent - Problème sur grosse BDD

Merci pour votre réponse smile

J'ai résolu ce problème travaillant sur un nombre de données plus petit (travailler par département, au lieu du territoire français pas exemple).

Hors ligne

 

#5 Wed 29 April 2020 10:57

preliator
Participant assidu
Date d'inscription: 17 Nov 2018
Messages: 433

Re: Regrouper polygones qui s'intersectent - Problème sur grosse BDD

Bonjour,

Je me permet de poser une petite question sur une syntaxe de formule : Qu'entendez vous par faire "l'union de la couche et le dump du résultat" ?

En minimisant au maximum mon échelle de travail, je dois travailler sur 2 millions de polygones. Le fameux message m'informant que je dépasse la taille maximale autorisée pour un tableau s'affiche.

J'ai effectivement pensé à "couper" ma table de polygones en deux.

Je crée une nouvelle colonne, dans ma table de polygones, qui indique si les polygones se touchent ou pas :

Code:

update polygones t1 set est_colle = '0';

update polygones t1 set est_colle = '1' from polygones t2 where st_intersects(t1.geom, t2.geom) and t1.id <> t2.id

Je regroupe les polygones seulement lorsque "est_colle" = '1' :

Code:

create table polyg_regroup as
(select st_unaryunion(unnest(st_clusterintersecting(geom))) as geom
from polygones
where est_colle = '1');

Je me demandais s'il existait une méthode peut être plus directe ?

Merci.

Dernière modification par preliator (Wed 29 April 2020 10:58)

Hors ligne

 

#6 Wed 29 April 2020 13:40

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

Re: Regrouper polygones qui s'intersectent - Problème sur grosse BDD

Bonjour,

Il y a plusieurs façons de faire l'union de pg qui s'intersectent. clusterIntersecting marche bien et vite, mais est limitée par la taille des tableaux dans PG.

On peut aussi faire l'union des polygones de la couche et dumper ensuite cette union: on a alors autant de polygones qu'il y a de parties qui se touchent dans le dataset d'entrée.
Ca prend souvent des plombes pour les grosses couches, mieux avoir de la mémoire disponible, mais il y a plusieurs variantes de st_union (cf doc), dont une qui est plus memory-friendly.

Donc avant de procéder en découpant le dataset, je tenterais:

Code:

select st_dump(st_union(geom)) as dmp 
from matable;

Nico

Hors ligne

 

Pied de page des forums

Powered by FluxBB