36 votos

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

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

Tenemos que cambiar de PUNTO a MULTIPUNTO.

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

72voto

hernan43 Puntos 566

Para PostGIS 2.x puede utilizar el ALTERAR TABLA DDL utilizando un expresión .

Para convertir una geometría de una sola pieza en una geometría de varias piezas, utilice ST_Multi :

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

La conversión de una geometría de varias piezas a una de una sola pieza es un poco más complicada, ya que sólo puede utilizar una pieza e ignorar todas las demás (si existen). Comprueba primero tus datos para ver si tienes 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 ves multi_geom mayor que 0, entonces se arriesga a perder datos, y probablemente debería mantenerla como una geometría de varias partes. Si ve 0, entonces es seguro convertirla 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 complicado, ya que hay varios pasos (¡gracias @rec.thegeom!).

Suponiendo una mesa my_table y la columna de geometría geom Aquí están los pasos para convertir a multipartes:

-- 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';

0 votos

Hola @Mike Toews (y Ulrik). No creo que tu segundo paso para PostGIS 1.x sea necesario en este caso, Mike. Ulrik dijo que la tabla estará vacía en el momento de la conversión de tipo, por lo que no habrá ningún valor no multi para causar un error con algo como: 1) ALTER TABLE my_table DROP CONSTRAINT enforce_geotype_the_geom; 2) ALTER TABLE my_table ADD CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype(the_geom) = 'MULTIPOINT': :text OR the_geom IS NULL); entonces 3) UPDATE geometry_columns SET type = 'MULTIPOINT' WHERE f_table_name = 'my_table'; (quizás el comentario más descuidado de la historia - culpa mía)

0 votos

@rec.thegeom correcto; con una tabla vacía no habría nada que actualizar. ¡Gracias por publicar los comandos reales!

0 votos

Si tiene datos complejos en varias formas como GEOMETRYCOLLECTION (MULTIPOLYGON(...)) entonces es posible que desee cambiar la consulta para la detección de la más de una geometría. Con una comprobación como ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1 y utilizar algo similar para el USING con: ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1) o similar.

4voto

GriffinHeart Puntos 187

Cambiar, no creo. Pero puede crear una nueva tabla con estructura idéntica, excepto 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;

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X