Je recherche une fonction pour dissoudre les limites partagées entre les entités surfaciques d'une table. ST_UNION () fait presque ce que je recherche, mais il crée un multipolygone à partir de tous les polygones de la couche, qu'ils partagent ou non une frontière commune. Je préfère seulement dissoudre les frontières entre les polygones qui se touchent. J'ai pensé qu'il devrait y avoir un moyen d'utiliser ST_TOUCHES () mais le besoin d'une fonction de dissolution semble si commun que je serais surpris s'il n'y avait pas de fonction intégrée pour y parvenir.
Le cas d'utilisation ressemble à ceci: j'ai téléchargé les données Corine Landcover pour un grand pays européen et je veux dissoudre les frontières entre les différents types de forêts (environ 75 000 polygones dans une table). J'ai essayé ST_UNION, mais il m'échoue avec une erreur de "mémoire insuffisante" (30 000 polygones fonctionnaient cependant):
create table corine00 as
select st_union(the_geom) as the_geom,
sum(area_ha) as area_ha,
substr(code_00,1,2) as code_00
from clc00_c31_forests
group by substr(code_00,1,2)
Remarque: Tous les codes forestiers commencent par '31' et j'utilise PostGIS 1.4, version GEOS: 3.2.0-CAPI-1.6.0
Je crois que ST_Dump est ce que vous voulez:
ST_Dump :
Donc pour votre cas:
Je ne sais pas comment cela va interagir avec la création de table que vous essayez de faire, mais cela devrait vous donner les géométries en tant qu'entrées distinctes. Vous seriez alors en mesure de faire une jointure spatiale (en utilisant && et ST_Contains) entre les deux tables pour collecter les données sur les géométries.
la source
Votre PostGIS est-il compilé avec GEOS 3.1.0+? Pour cette version, un union en cascade beaucoup plus rapide a été implémentée, mais si elle n'est pas trouvée, elle utilisera l'ancien code qui est plus lent de plusieurs ordres de grandeur.
Mise à jour : il semble que votre PostGIS utilise l'approche de l'union en cascade, mais la famine est réelle. J'essaierais d'augmenter la mémoire disponible de votre instance Postgres, voici quelques conseils de la conférence FOSS4G PostGIS 2007 de Paul Ramsey :
shared_buffers
work_mem
maintenance_work_mem
wal_buffers
checkpoint_segments
random_page_cost
Dans votre cas, j'essaierais d'augmenter
shared_buffers
, la recommandation générale est de 25% de votre mémoire disponible pour un serveur de base de données, mais essayez de l'augmenter à 3-4x sa valeur actuelle et de voir si elle se termine.la source