Importuję wiele zestawów danych geodezyjnych do PostGIS i mają one różne SRID. (Niektórzy mają EPSG:3857, niektórzy EPSG:4326, jeszcze coś innego).
Chciałbym stworzyć dodatkowy geometry column, np. the_geom_mercatorz SRIDEPSG:3857, a także zachować oryginalną geomkolumnę we wszystkim SRID, co się pojawiło.
które można wypełnić w innej kolumnie (the_geom), używając:
UPDATE my_table SET
the_geom_mercator = ST_Transform(the_geom,3857)FROM spatial_ref_sys
WHERE ST_SRID(the_geom)= srid;
(trzecia linia FROM spatial_ref_sys ...nie jest konieczna, ale chroni próby transformacji z nieznanymi lub nieprawidłowymi projekcjami, które powodują błędy).
A jeśli ta tabela ma być utrzymana (dodana / zaktualizowana), możesz użyć funkcji wyzwalacza, aby zaktualizować the_geom_mercator, np .:
CREATEOR REPLACE FUNCTION my_table_tg_fn() RETURNS triggerAS$BODY$BEGINIF TG_OP ='INSERT'AND NEW.the_geom ISNULL THENRETURN NEW;-- no new geometry
ELSIF TG_OP ='UPDATE'THENIF NEW.the_geom ISNOTDISTINCTFROM OLD.the_geom THENRETURN NEW;-- same old geometryENDIF;ENDIF;-- Attempt to transform a geometryBEGIN
NEW.the_geom_mercator := ST_Transform(NEW.the_geom,3857);
EXCEPTION WHEN SQLSTATE 'XX000'THEN
RAISE WARNING 'the_geom_mercator not updated: %', SQLERRM;END;RETURN NEW;END;$BODY$ LANGUAGE plpgsql;CREATETRIGGER my_table_tg BEFORE INSERTORUPDATEON my_table FOR EACH ROWEXECUTEPROCEDURE my_table_tg_fn();
Pamiętaj, że ST_Transform powinien wychwytywać błędy i wyświetlać ostrzeżenie, np .:
Dzięki za świetną odpowiedź. Używanie wyzwalaczy jest naprawdę fajne, zacznę to robić. Czy zamiast tego mogę dodać ten wyzwalacz do bazy danych, aby nie musiałem dodawać tego wyzwalacza dla każdej nowej tabeli?
knutole
Dodam dane do postgis za pomocą, shp2psqla tabela jest tworzona po przepuszczeniu psql. Więc nie mogę naprawdę dodać wyzwalacza, zanim tabela będzie istnieć?
knutole
1
Jeśli używasz shp2pgsql, użyj instrukcji aktualizacji, patrz wyżej. Wyzwalacz jest przydatny, jeśli musisz utrzymywać tabelę, ale nie do ładowania.
Mike T
2
Najpierw utwórz normalny nieprzestrzenny stół, który już masz. Następnie dodaj kolumnę przestrzenną do tabeli za pomocą funkcji „AddGeometryColumn” OpenGIS.
Przykład:
CREATETABLE terrain_points (
ogc_fid serial NOTNULL,
elevation doubleprecision,);SELECT AddGeometryColumn('terrain_points','wkb_geometry',3725,'POINT',3);
Możesz utworzyć nieograniczoną kolumnę geometrii SRID do przechowywania formy natywnej, a następnie przekształcić ją w istniejącą. Oto wymyślony przykład, zakładając, że masz wielokąty, które kopiujesz z tabeli pomostowej (jeśli wymieszałeś, możesz ustawić typ na geometrię, np. Geometrię (Geometry, 3857):
Dzięki za odpowiedź. Czy można to zrobić na już istniejących tabelach (tj. Bez użycia tabel pomostowych)? Powiedzmy, że mam już tabelę z geomkolumną i chcę po prostu dodać kolejną the_geom_webmercatorkolumnę. Jak mam to zrobić?
shp2psql
a tabela jest tworzona po przepuszczeniupsql
. Więc nie mogę naprawdę dodać wyzwalacza, zanim tabela będzie istnieć?Najpierw utwórz normalny nieprzestrzenny stół, który już masz. Następnie dodaj kolumnę przestrzenną do tabeli za pomocą funkcji „AddGeometryColumn” OpenGIS.
Przykład:
źródło
Możesz utworzyć nieograniczoną kolumnę geometrii SRID do przechowywania formy natywnej, a następnie przekształcić ją w istniejącą. Oto wymyślony przykład, zakładając, że masz wielokąty, które kopiujesz z tabeli pomostowej (jeśli wymieszałeś, możesz ustawić typ na geometrię, np. Geometrię (Geometry, 3857):
źródło
geom
kolumną i chcę po prostu dodać kolejnąthe_geom_webmercator
kolumnę. Jak mam to zrobić?