46 votos

¿Reproyección de todas las geometrías en la tabla PostGIS?

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

0 votos

Lo añado como comentario en lugar de como respuesta porque debería haber un método más elegante. Pero podrías copiar la tabla y luego ejecutar UPDATE <tabla> SET the_geom=ST_Transform(the_geom,32644); (Asumiendo que tienes la entrada completa en tu spatial_ref_sys para 32644).

0 votos

Lo he intentado pero me ha dado este error update abc SET geom=ST_Transform(geom,32644); la nueva fila de la relación "abc" viola la restricción de verificación "enforce_srid_geom"

1 votos

Dejar de lado esa restricción. y su fijo

83voto

NilObject Puntos 7874

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

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

0 votos

Por supuesto, debe sustituir "Punto" por el tipo de geometría real de su geometría.

0 votos

¿Existe una forma sencilla de sustituir Point con The same geometry type as it was ?

1 votos

No, me temo que no.

19voto

Saqlain Puntos 133
CREATE TABLE new_table AS 
  SELECT ST_Transform(the_geom,32644) AS the_geom 
  FROM original_table;

Debe haber un campo ID entero en su tabla espacial para poder añadirla a QGIS.

0 votos

Lo he intentado y lo he conseguido, pero no puedo exportar la tabla resultante a qgis/udig aunque aparezca en la base de datos.

0 votos

¿Cuál es su problema exacto?

2 votos

Si estás utilizando una versión de PostGIS anterior a la 2.0 tendrás que añadir un registro a tu tabla Geometry_Columns que apunte a tu nueva tabla.

3voto

texai Puntos 178

Seguir este camino:

  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. ¡Ya está!

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

espero que te ayude...

4 votos

Esta solución no reproyecta las geometrías. Si las geometrías se almacenan utilizando otro SRID, los datos serán inconsistentes después de cambiar las restricciones. Es necesario utilizar st_trasnform.

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