Pour PostGIS 2.x , vous pouvez utiliser le DDL ALTER TABLE à l' aide d'une expression .
Pour convertir d'une géométrie mono-pièce en multi-pièce, utilisez ST_Multi :
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);
Pour convertir d'une géométrie en plusieurs parties en une géométrie en une seule partie, c'est un peu plus compliqué car vous ne pouvez utiliser qu'une seule partie et ignorer toutes les autres parties (si elles existent). Vérifiez d'abord vos données pour voir si vous avez des géométries avec plus d'une pièce:
SELECT COUNT(CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END) AS multi_geom,
COUNT(geom) AS total_geom
FROM my_table;
Si vous voyez multi_geom
plus de 0, vous risquez de perdre des données et vous devriez probablement les conserver en tant que géométrie en plusieurs parties. Si vous voyez 0, alors il est sûr de faire une géométrie en une seule pièce avec:
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(Point,4326) USING ST_GeometryN(geom, 1);
Pour PostGIS 1.x , c'est un peu plus compliqué, car il y a plusieurs étapes (merci @ rec.thegeom!).
En supposant une table my_table
et une colonne de géométrie geom
, voici les étapes pour convertir en plusieurs parties:
-- 1. Remove the geom_type constraint (if existing)
ALTER TABLE my_table DROP CONSTRAINT enforce_geotype_geom;
-- 2. Update the geometry data to multi-part -- skip if it is an empty table
UPDATE my_table SET geom = ST_Multi(geom);
-- 3. Re-add a different geometry constraint for the new type
ALTER TABLE my_table ADD CONSTRAINT enforce_geotype_geom
CHECK (geometrytype(geom) = 'MULTIPOINT'::text OR geom IS NULL);
-- 4. Update the geometry_columns metadata table
UPDATE geometry_columns SET type = 'MULTIPOINT'
WHERE f_table_schema = 'public' AND f_table_name = 'my_table' AND f_geometry_column = 'geom';
GEOMETRYCOLLECTION (MULTIPOLYGON(...))
alors vous souhaiterez peut-être modifier la requête pour la détection de plusieurs géométries. Avec check likeST_NumGeometries(ST_CollectionHomogenize(geom)) > 1
et utilisez une chose similaire pour leUSING
with:ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)
ou similaire.Changez, je ne pense pas. Mais vous pouvez créer une nouvelle table avec une structure identique, à l'exception de la colonne geom, puis exécuter:
la source