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.


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

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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.