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.