web-dev-qa-db-fra.com

PostGIS - convertir un multipolygone en un seul polygone

Est-il possible d'importer un fichier de forme contenant des multipolygones dans un seul polygone dans PostGIS? Chaque fois que j'essaie d'importer un fichier de forme d'un polygone, il est stocké en tant que multipolygone (par opposition à un seul polygone) dans une colonne geom. Ainsi, je ne peux pas l'extraire comme une seule valeur de polygone du multipolygone.

Toutes les suggestions utiles très appréciées

20
user3012604

Vous pouvez utiliser ST_GeometryN avec ST_NumGeometries et la fonction generate_series pour obtenir ce dont vous avez besoin.

Supposons que vous ayez le tableau de l'exemple de Jakub:

CREATE TABLE multi AS(
SELECT 1 as id, 2 as test, ST_GeomFromText('MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)),((1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))') AS geom
);

Celui-ci contient un multipolygone, un id et une autre colonne.

Pour obtenir chaque polygone unique de la table, y compris tous les autres attributs, essayez quelque chose comme:

SELECT id, test, ST_GeometryN(poli, generate_series(1, ST_NumGeometries(geom))) AS geom 
FROM multi

"id" et "test" sont les valeurs de chaque ligne du tableau d'origine. generate_series crée une série de nombres de 1 au nombre de géométries dans chaque ligne.

Par conséquent, vous diviserez chaque géométrie multiple en ses parties géométriques uniques distinctes et les valeurs des autres colonnes resteront les mêmes.

Remplacez simplement les colonnes et le tableau dans l'exemple par les colonnes de votre fichier de formes exporté et vous obtiendrez le tableau avec les polygones simples.

J'espère que ça répond à ta question.

17
mdomnita

J'ai utilisé ST_DUMP pour convertir une table de géométries multipolygones dans PostgreSQL en une nouvelle table avec des géométries polygonales et d'autres colonnes de données.

CREATE TABLE poly AS                       --poly will be the new polygon table
WITH dump AS (
    SELECT id, test,                       --columns from your multipolygon table 
      (ST_DUMP(geometry)).geom AS geometry 
    FROM multi                             --the name of your multipolygon table
) 
SELECT id, test, 
  geometry::geometry(Polygon,4326)         --type cast using SRID from multipolygon
FROM dump;

Mise à jour: Je pense que cela pourrait être accompli beaucoup plus facilement avec cette requête.

CREATE TABLE polygon_table AS 
    SELECT id, example_column, (ST_DUMP(geom)).geom::geometry(Polygon,4326) AS geom FROM multipolygon_table
23
Tyler

Importez dans une table intermédiaire, puis utilisez ST_DUMP pour freiner le multigeom en morceaux individuels et utilisez-le pour remplir la table de destination.

METTRE À JOUR

Vous importez toutes les données dont vous avez besoin dans une table intermédiaire (appelons-la multi), puis utilisez ST_DUMP pour diviser la mutligeométrie en géométries simples:

WITH multi AS(
SELECT 1 as id, 2 as test, ST_GeomFromText('MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)),((1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))') as poli
)
,dump AS(
SELECT  id
    ,test
    ,ST_DUMP(poli) as d
FROM    multi)
SELECT  id
    ,test
    ,(dump.d).path
    ,ST_AsTEXT((dump.d).geom)
FROM dump 
1
Jakub Kania