Agregar columna de geometría adicional en PostGIS?
10
Estoy importando muchos conjuntos de geodatos en PostGIS, y tienen diferentes SRID's. (Algunos tienen EPSG:3857, algunos EPSG:4326, algo más).
Me gustaría crear un adicional geometry column, por ejemplo. the_geom_mercatorcon SRIDEPSG:3857, y también mantenga la geomcolumna original en lo SRIDque sea que venga
que se puede completar desde otra columna (the_geom) usando:
UPDATE my_table SET
the_geom_mercator = ST_Transform(the_geom,3857)FROM spatial_ref_sys
WHERE ST_SRID(the_geom)= srid;
(la tercera línea FROM spatial_ref_sys ...no es necesaria, pero protege los intentos de transformación con proyecciones desconocidas o inválidas, lo que genera errores).
Y si esta tabla se va a mantener (agregar / actualizar), puede usar una función de activación para actualizar the_geom_mercator, por ejemplo:
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();
Tenga en cuenta que ST_Transform debe atrapar errores y mostrar una advertencia, por ejemplo:
Gracias por una gran respuesta. Es realmente bueno usar disparadores, comenzaré a hacerlo. ¿Podría agregar ese disparador a la base de datos en su lugar, para no tener que agregar este disparador para cada nueva tabla?
knutole
Estoy agregando datos a postgis con shp2psqly la tabla se crea cuando se canaliza psql. ¿Entonces realmente no puedo agregar un disparador antes de que exista la tabla?
knutole
1
Si está utilizando shp2pgsql, use una declaración de actualización, consulte más arriba. Un activador es útil si necesita mantener una tabla, pero no para cargar.
Mike T
2
Primero cree una tabla normal no espacial, que ya tiene. En segundo lugar, agregue una columna espacial a la tabla utilizando la función OpenGIS "AddGeometryColumn".
Ejemplo:
CREATETABLE terrain_points (
ogc_fid serial NOTNULL,
elevation doubleprecision,);SELECT AddGeometryColumn('terrain_points','wkb_geometry',3725,'POINT',3);
Puede crear una columna de geometría SRID sin restricciones para mantener la forma nativa y luego transformarla en existente. Aquí hay un ejemplo artificial asumiendo que tiene polígonos que está copiando de una tabla de etapas (si ha mezclado, puede establecer el tipo en geometría, por ejemplo, geometría (Geometry, 3857):
Gracias por tu respuesta. ¿Hay alguna manera de hacer esto en tablas ya existentes (es decir, sin usar tablas de preparación)? Digamos que ya tengo una tabla, con una geomcolumna, y simplemente quiero agregar otra the_geom_webmercatorcolumna. ¿Como podría hacerlo?
shp2psql
y la tabla se crea cuando se canalizapsql
. ¿Entonces realmente no puedo agregar un disparador antes de que exista la tabla?Primero cree una tabla normal no espacial, que ya tiene. En segundo lugar, agregue una columna espacial a la tabla utilizando la función OpenGIS "AddGeometryColumn".
Ejemplo:
fuente
Puede crear una columna de geometría SRID sin restricciones para mantener la forma nativa y luego transformarla en existente. Aquí hay un ejemplo artificial asumiendo que tiene polígonos que está copiando de una tabla de etapas (si ha mezclado, puede establecer el tipo en geometría, por ejemplo, geometría (Geometry, 3857):
fuente
geom
columna, y simplemente quiero agregar otrathe_geom_webmercator
columna. ¿Como podría hacerlo?