Riproiettare tutte le geometrie nella tabella PostGIS?


39

Ho creato una tabella spaziale con SRID: 4326. Ora voglio cambiare la proiezione totale in SRID: 32644 in una nuova tabella. Il vecchio tavolo dovrebbe rimanere invariato.


Sto aggiungendo questo come commento anziché come risposta perché dovrebbe esserci un metodo più elegante. Ma è possibile copiare la tabella e quindi eseguire: UPDATE <table> SET the_geom = ST_Transform (the_geom, 32644); (Supponendo che tu abbia la voce completa in spatial_ref_sys per 32644.)
L_Holcombe,

ho provato ma igot questo aggiornamento di errore abc SET geom = ST_Transform (geom, 32644); nuova riga per la relazione "abc" viola il vincolo di controllo "enforce_srid_geom"
Satya Chandra

1
eliminare quel vincolo. e il suo fisso
simplexio il

Risposte:


62

Se utilizzi PostGIS 2.0+, puoi andare:

ALTER TABLE mytable 
  ALTER COLUMN geom 
  TYPE Geometry(Point, 32644) 
  USING ST_Transform(geom, 32644);

Notando ovviamente che è necessario sostituire "Punto" con il tipo di geometria effettiva della geometria.
Paul Ramsey,

C'è un modo semplice per sostituire Pointcon The same geometry type as it was?
Mohayemin,

No, non temere.
Paul Ramsey,

18
CREATE TABLE new_table AS 
  SELECT ST_Transform(the_geom,32644) AS the_geom 
  FROM original_table;

Dovrebbe esserci un campo ID intero nella tabella spaziale per aggiungerlo a QGIS.


Ho provato come sopra e ci sono riuscito, ma non riesco a esportare la tabella risultante in qgis / udig anche se appare nel database?
Satya Chandra,

Qual è il tuo problema esatto?
Vladimir,

2
Se si utilizza una versione di PostGIS precedente alla versione 2.0, è necessario aggiungere un record alla tabella Geometry_Columns che punta alla nuova tabella.
HeyOverThere

4

seguire in questo modo:

  1. CREATE TABLE 'new_table' AS SELECT * FROM 'old_table';
  2. ALTER TABLE new_table DROP CONSTRAINT enforce_srid_the_geom;
  3. ALTER TABLE new_table DROP CONSTRAINT enforce_geotype_the_geom;
  4. UPDATE new_table SET the_geom = ST_SetSRID(the_geom, new_srid);
  5. ALTER TABLE new_table ADD CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = (new_srid));
  6. ALTER TABLE new_table ADD CONSTRAINT enforce_geotype_geom CHECK ((geometrytype(the_geom) = 'POINT'::text OR the_geom IS NULL);
  7. Questo è tutto!

se non è possibile creare una nuova tabella nella prima riga, provare prima 2. e 3. quindi creare la tabella con il numero 1.

spero che ti aiuti ...


3
Questa soluzione non ripropone le geometrie. Se le geometrie vengono archiviate utilizzando altri SRID, i dati saranno incoerenti dopo i vincoli di modifica. È necessario utilizzare st_trasnform.
angelcervera,
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.