Pages: 1
- Sujet précédent - Regrouper polygones qui s'intersectent - Problème sur grosse BDD - Sujet suivant
#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
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
Pages: 1
- Sujet précédent - Regrouper polygones qui s'intersectent - Problème sur grosse BDD - Sujet suivant