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.


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);

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


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ê ...


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.