¿Cambiar el tipo de geometría de Punto a Multipunto dentro de la tabla existente en PostGIS?

29

¿Existe una función PostGIS que pueda cambiar el tipo de geometría de una tabla existente?

Necesitamos cambiar de PUNTO a MULTIPUNTO.

La tabla estará vacía cuando cambiemos el tipo de geometría y no podemos simplemente soltar / crear la tabla.

    
pregunta Ulrik Balslev 04.07.2012 - 11:53

2 respuestas

58

Para PostGIS 2.x , puede usar ALTER TABLE DDL usando una expresión .

Para convertir una geometría de una parte a varias partes, use ST_Multi :

ALTER TABLE my_table
    ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);

Para convertir de una geometría de varias partes a una única parte, es un poco más complicado, ya que solo puede usar una parte e ignorar todas las demás (si existen). Verifique sus datos primero para ver si tiene algunas geometrías con más de una parte:

SELECT COUNT(CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END) AS multi_geom,
       COUNT(geom) AS total_geom
FROM my_table;

Si ve multi_geom mayor que 0, entonces corre el riesgo de perder datos y probablemente debería mantenerlo como una geometría de varias partes. Si ve 0, es seguro convertirlo en una geometría de una sola parte con:

ALTER TABLE my_table
    ALTER COLUMN geom TYPE geometry(Point,4326) USING ST_GeometryN(geom, 1);

Para PostGIS 1.x , es un poco más desordenado, ya que hay varios pasos (gracias @ rec.thegeom!).

Suponiendo una tabla my_table y una columna de geometría geom , estos son los pasos para convertir a varias partes:

-- 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';
    
respondido por el Mike T 04.07.2012 - 21:46
4

Cambia, no lo creo. Pero puede crear una nueva tabla con una estructura idéntica, a excepción de la columna geom, y luego ejecutar:

SELECT AddGeometryColumn('new-pt_table','geom',<SRID>,'MULTIPOINT',2);

INSERT INTO new_pt_table (attr1, attr2, attr3, ..., geom) 
SELECT attr1, attr2, attr3, ... , ST_Multi(geom) FROM old_pt_table;
    
respondido por el Micha 04.07.2012 - 20:37

Lea otras preguntas en las etiquetas