Reprojetando todas as geometrias na tabela PostGIS?

39

Criei uma tabela espacial com SRID: 4326. Agora, quero alterar a projeção total para SRID: 32644 em uma nova tabela. A tabela antiga deve permanecer inalterada.

Satya Chandra
fonte
Estou adicionando isso como um comentário em vez de uma resposta, porque deve haver um método mais elegante. Mas você pode copiar a tabela e executar: UPDATE <table> SET the_geom = ST_Transform (the_geom, 32644); (Supondo que você tenha a entrada completa em seus spatial_ref_sys para 32644.)
L_Holcombe
Eu tentei, mas não consigo atualizar esse erro abc SET geom = ST_Transform (geom, 32644); nova linha para relação "abc" viola restrição de verificação "enforce_srid_geom"
Satya Chandra
1
abandone essa restrição. e seu fixo
simplexio 6/11/12

Respostas:

62

Se você usa o PostGIS 2.0+, pode:

ALTER TABLE mytable 
  ALTER COLUMN geom 
  TYPE Geometry(Point, 32644) 
  USING ST_Transform(geom, 32644);
Paul Ramsey
fonte
É claro que você deve substituir "Point" pelo tipo de geometria real da sua geometria.
Paul Ramsey
Existe uma maneira simples de substituir Pointcom The same geometry type as it was?
Mohayemin
Não, não tenha medo.
Paul Ramsey
18
CREATE TABLE new_table AS 
  SELECT ST_Transform(the_geom,32644) AS the_geom 
  FROM original_table;

Deve haver um campo de ID inteiro na sua tabela espacial para adicioná-lo ao QGIS.

Vladimir
fonte
Eu tentei como acima e consegui, mas não consigo exportar a tabela resultante para o qgis / udig, mesmo que esteja aparecendo no banco de dados?
Satya Chandra
Qual é o seu problema exato?
Vladimir
2
Se você estiver usando uma versão do PostGIS anterior à versão 2.0, precisará adicionar um registro à sua tabela Geometry_Columns apontando para sua nova tabela.
precisa saber é o seguinte
4

siga este caminho:

  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. É isso!

se você não pode criar uma nova tabela na primeira linha, tente 2. e 3. primeiro, crie sua tabela com o número 1.

espero que ajude você ...

Aragão
fonte
3
Esta solução não reprojeta geometrias. Se as geometrias forem armazenadas usando outro SRID, os dados ficarão inconsistentes após as restrições de alteração. Você precisa usar st_trasnform.
angelcervera