Olá à lista,
Queria fazer um disparador sobre uma tabela com dois campos do
tipo 'Geometry' (geom_23030 e geom_4258) cada um com um sistema de
coordenadas diferente.
A ideia era que o disparador actualiza-se o segundo campo sempre que
houvesse um INSERT ou UPDATE no primeiro campo e assim tivessem sempre a
mesma geometria mas cada um dos campos com o seu respectivo sistemas de
coordenadas.
Devido à minha falta de experiência em plpgsql eu não sei como fazer para
que o disparador reconheça qual a geometria mais recente e proceder com
a actualização da mais antiga. Como tenho feito, actualiza por ordem de como
está indicado no disparador sem ter em conta a antiguidade. Deveria
adicionar dois novos campos com Time Stamp de cada uma das geometrias para
conseguir o meu objectivo?
Estou a usar algumas das funções disponibilizadas pela extensão PostGIS.
Isto foi o que consegui fazer:
--SELECT DropGeometryColumn('sch_temp','teste','geom_23030');
--SELECT DropGeometryColumn('sch_temp','teste','geom_4258');
--DROP TABLE sch_temp.teste;
CREATE TABLE sch_temp.teste (gid serial primary key, longitude double
precision);
SELECT AddGeometrycolumn
('sch_temp','teste','geom_23030',23030,'LINESTRING',2);
SELECT AddGeometrycolumn
('sch_temp','teste','geom_4258',4258,'LINESTRING',2);
CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS
$$
BEGIN
-- Se o campo geom_4258 tem um novo INSERT ou UPDATE, entao actualiza
geom_23030.
NEW.geom_23030 = ST_Transform((NEW.geom_4258), 23030);
-- Se o campo geom_23030 tem um novo INSERT ou UPDATE, entao actualiza
geom_4258.
NEW.geom_4258 = ST_Transform((NEW.geom_23030), 4258);
-- Calcula/actualiza a longitude da geometria.
NEW.longitude = ST_Length(NEW.geom_23030);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS funcao_teste ON sch_temp.teste;
CREATE TRIGGER funcao_teste BEFORE INSERT OR UPDATE ON sch_temp.teste FOR
EACH ROW EXECUTE PROCEDURE funcao_teste();
INSERT INTO sch_temp.teste(geom_23030)
VALUES(ST_GeomFromText('SRID=23030;LINESTRING(232400 4548000,700882
4548000)'));
INSERT INTO sch_temp.teste(geom_4258) VALUES
(ST_GeomFromText('SRID=4258;LINESTRING(-6 38,-1 38)'));
UPDATE sch_temp.teste SET geom_4258 =
ST_GeomFromText('SRID=4258;LINESTRING(-5 37,-1 37)') WHERE gid = 2;
SELECT gid, longitude, ST_AsText(geom_23030), ST_AsText(geom_4258) FROM
sch_temp.teste;
Obrigado. Cumprimentos,
Eloi Ribeiro
GIS Analyst
39,45º -4,40º
http://eloiribeiro.wordpress.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral