¿Reproyectar todas las geometrías en la tabla PostGIS?

39

Creé una tabla espacial con SRID: 4326. Ahora quiero cambiar la proyección total a SRID: 32644 en una nueva tabla. La tabla anterior debe permanecer sin cambios.

Satya Chandra
fuente
Estoy agregando esto como un comentario en lugar de una respuesta porque debería haber un método más elegante. Pero podría copiar la tabla y luego ejecutar: UPDATE <table> SET the_geom = ST_Transform (the_geom, 32644); (Suponiendo que tiene la entrada completa en su spatial_ref_sys para 32644.)
L_Holcombe
intenté pero ignoré esta actualización de error abc SET geom = ST_Transform (geom, 32644); nueva fila para la relación "abc" viola la restricción de verificación "enforce_srid_geom"
Satya Chandra
1
deja caer esa restricción. y es fijo
simplexio

Respuestas:

62

Si estás en PostGIS 2.0+, puedes ir:

ALTER TABLE mytable 
  ALTER COLUMN geom 
  TYPE Geometry(Point, 32644) 
  USING ST_Transform(geom, 32644);
Paul Ramsey
fuente
Observando, por supuesto, que debe reemplazar "Punto" con el tipo de geometría real de su geometría.
Paul Ramsey
¿Hay una manera sencilla de reemplazar Pointcon The same geometry type as it was?
Mohayemin
No, miedo no.
Paul Ramsey
18
CREATE TABLE new_table AS 
  SELECT ST_Transform(the_geom,32644) AS the_geom 
  FROM original_table;

Debe haber un campo de ID entero en su tabla espacial para agregarlo a QGIS.

Vladimir
fuente
Intenté lo anterior y lo logré, pero no puedo exportar la tabla resultante a qgis / udig, incluso si aparece en la base de datos.
Satya Chandra
¿Cuál es tu problema exacto?
Vladimir
2
Si está utilizando una versión de PostGIS anterior a la versión 2.0, deberá agregar un registro a su tabla Geometry_Columns que apunte a su nueva tabla.
HeyOverThere
4

sigue de esta manera:

  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. ¡Eso es!

si no puede crear una nueva tabla en la primera línea, intente 2. y 3. primero, luego cree su tabla con el número 1.

Espero que te ayude...

Aragón
fuente
3
Esta solución no reproyecta geometrías. Si las geometrías se almacenan utilizando otro SRID, los datos serán inconsistentes después de las restricciones de cambio. Necesita usar st_trasnform.
angelcervera