Cambiare il tipo di geometria da Point a Multipoint all'interno di una tabella esistente in PostGIS?


31

Esiste una funzione PostGIS che può cambiare il tipo di geometria per una tabella esistente?

Dobbiamo passare da POINT a MULTIPOINT.

La tabella sarà vuota quando cambiamo il tipo di geometria e non possiamo semplicemente eliminare / creare la tabella.

Risposte:


62

Per PostGIS 2.x , è possibile utilizzare ALTER TABLE DDL usando un'espressione .

Per convertire da una geometria singola a multiparte, utilizzare ST_Multi :

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

Per convertire da una geometria multiparte a una geometria a parte singola, è un po 'più complicato poiché è possibile utilizzare solo una parte e ignorare tutte le altre parti (se presenti). Controlla prima i tuoi dati per vedere se hai delle geometrie con più di una parte:

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

Se vedi multi_geommaggiore di 0, rischierai di perdere dati e probabilmente dovresti tenerli come geometria multiparte. Se vedi 0, è sicuro trasformarlo in una geometria a parte singola con:

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

Per PostGIS 1.x , è un po 'più disordinato, poiché ci sono diversi passaggi (grazie a @ rec.thegeom!).

Supponendo una tabella my_tablee una colonna geometrica geom, ecco i passaggi per la conversione in più parti:

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

Ciao @Mike Toews (e Ulrik). Non credo che il tuo secondo passo per PostGIS 1.x sia necessario in questo caso, Mike. Ulrik ha detto che la tabella sarà vuota al momento della conversione del tipo, quindi non ci saranno valori non multi per causare un errore con qualcosa del tipo: 1) ALTER TABLE my_table DROP CONSTRAINT enforce_geotype_the_geom; 2) ALTER TABLE my_table AGGIUNGI VINCITORE enforce_geotype_the_geom CHECK (geometrytype (the_geom) = 'MULTIPOINT' :: text O the_geom IS NULL); quindi 3) UPDATE geometry_columns SET type = 'MULTIPOINT' DOVE f_table_name = 'my_table'; (forse il commento più
sciatto di

@ rec.thegeom corretto; con una tabella vuota non ci sarebbe nulla da aggiornare. Grazie per aver pubblicato i comandi reali!
Mike T,

Se disponi di dati complessi in varie forme come GEOMETRYCOLLECTION (MULTIPOLYGON(...))allora, potresti voler modificare la query per il rilevamento di più di una geometria. Con check like ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1e usare cose simili per USINGwith: ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)o simili.
Ravbaker,

4

Cambia, io non la penso così. Ma puoi creare una nuova tabella con struttura identica, ad eccezione della colonna geom, quindi eseguire:

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.