Adicionando coluna de geometria adicional no PostGIS?
10
Estou importando muitos conjuntos de dados geográficos para o PostGIS, e eles têm diferentes SRID. (Alguns têm EPSG:3857, alguns EPSG:4326, alguns algo mais).
Eu gostaria de criar um adicional geometry column, por exemplo. the_geom_mercatorcom SRIDEPSG:3857e também mantenha a geomcoluna original no local em que SRIDfoi inserida.
que pode ser preenchido de outra coluna (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;
(a terceira linha FROM spatial_ref_sys ...não é necessária, mas protege as tentativas de transformação com projeções desconhecidas ou inválidas, o que gera erros).
E se essa tabela for mantida (adicionada / atualizada), você pode usar uma função de gatilho para atualizar o the_geom_mercator, por exemplo:
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();
Observe que ST_Transform deve capturar erros e mostrar um aviso, por exemplo:
Obrigado por uma ótima resposta. É muito legal usar gatilhos, vou começar a fazê-lo. Em vez disso, eu poderia adicionar esse gatilho ao banco de dados, para não precisar adicionar esse gatilho para cada nova tabela?
knutole
Estou adicionando dados ao postgis shp2psqle a tabela é criada quando transmitida psql. Então, eu realmente não posso adicionar um gatilho antes da tabela existir?
knutole
1
Se você estiver usando shp2pgsql, use uma instrução de atualização, veja acima. Um acionador é útil se você precisar manter uma tabela, mas não para carregar.
Mike T
2
Primeiro, crie uma tabela não espacial normal, que você já possui. Segundo, adicione uma coluna espacial à tabela usando a função "AddGeometryColumn" do OpenGIS.
Exemplo:
CREATETABLE terrain_points (
ogc_fid serial NOTNULL,
elevation doubleprecision,);SELECT AddGeometryColumn('terrain_points','wkb_geometry',3725,'POINT',3);
Você pode criar uma coluna de geometria SRID irrestrita para manter o formulário nativo e depois transformar em existente. Aqui está um exemplo artificial, supondo que você tenha polígonos que você está copiando de uma tabela de preparo (se você tiver mixado, poderá definir o tipo como geometry, por exemplo, geometry (Geometry, 3857):
Obrigado pela sua resposta. Existe alguma maneira de fazer isso em tabelas já existentes (ou seja, sem usar tabelas intermediárias)? Digamos que eu já tenho uma tabela, com uma geomcoluna, e simplesmente quero adicionar outra the_geom_webmercatorcoluna. Como eu faria isso?
shp2psql
e a tabela é criada quando transmitidapsql
. Então, eu realmente não posso adicionar um gatilho antes da tabela existir?Primeiro, crie uma tabela não espacial normal, que você já possui. Segundo, adicione uma coluna espacial à tabela usando a função "AddGeometryColumn" do OpenGIS.
Exemplo:
fonte
Você pode criar uma coluna de geometria SRID irrestrita para manter o formulário nativo e depois transformar em existente. Aqui está um exemplo artificial, supondo que você tenha polígonos que você está copiando de uma tabela de preparo (se você tiver mixado, poderá definir o tipo como geometry, por exemplo, geometry (Geometry, 3857):
fonte
geom
coluna, e simplesmente quero adicionar outrathe_geom_webmercator
coluna. Como eu faria isso?