Czy ponownie rzutujesz wszystkie geometrie w tabeli PostGIS?

39

Utworzyłem tabelę przestrzenną z SRID: 4326. Teraz chcę zmienić całkowitą projekcję na SRID: 32644 na nową tabelę. Stary stół powinien pozostać niezmieniony.

Satya Chandra
źródło
Dodaję to jako komentarz zamiast odpowiedzi, ponieważ powinna istnieć bardziej elegancka metoda. Ale możesz skopiować tabelę, a następnie uruchomić: UPDATE <table> SET the_geom = ST_Transform (the_geom, 32644); (Zakładając, że masz kompletny wpis w swoim spatial_ref_sys dla 32644.)
L_Holcombe
próbowałem, ale dostałem ten błąd aktualizacja abc SET geom = ST_Transform (geom, 32644); nowy wiersz dla relacji „abc” narusza ograniczenie sprawdzania „enforce_srid_geom”
Satya Chandra,
1
porzuć to ograniczenie. i naprawiono
simplexio

Odpowiedzi:

62

Jeśli korzystasz z PostGIS 2.0+, możesz przejść:

ALTER TABLE mytable 
  ALTER COLUMN geom 
  TYPE Geometry(Point, 32644) 
  USING ST_Transform(geom, 32644);
Paul Ramsey
źródło
Zwracając oczywiście uwagę na to, że powinieneś zastąpić „Punkt” faktycznym typem geometrii swojej geometrii.
Paul Ramsey,
Czy istnieje prosty sposób na zastąpienie Pointgo The same geometry type as it was?
Mohayemin,
Nie, nie boję się.
Paul Ramsey,
18
CREATE TABLE new_table AS 
  SELECT ST_Transform(the_geom,32644) AS the_geom 
  FROM original_table;

W tabeli przestrzennej powinno znajdować się pole z liczbą całkowitą, aby dodać je do QGIS.

Vladimir
źródło
Próbowałem jak wyżej i udało się, ale nie jestem w stanie wyeksportować wynikowej tabeli do qgis / udig, nawet jeśli pojawia się ona w bazie danych?
Satya Chandra,
Jaki jest twój dokładny problem?
Vladimir
2
Jeśli używasz wersji PostGIS starszej niż wersja 2.0, musisz dodać rekord do tabeli Geometry_Columns wskazujący na nową tabelę.
HeyOverThere
4

postępuj w ten sposób:

  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. To jest to!

jeśli nie możesz utworzyć nowej tabeli w pierwszej linii, spróbuj 2. i 3. najpierw stwórz swoją tabelę z numerem 1.

Mam nadzieję, że Ci to pomoże...

Aragonia
źródło
3
To rozwiązanie nie zmienia geometrii. Jeśli geometrie są przechowywane przy użyciu innego SRID, dane będą niespójne po ograniczeniach zmian. Potrzebujesz użyć st_trasnform.
angelcervera