domingo, fevereiro 17, 2013

PostGIS: Triggers e Procedures (Parte 1)

Quem já estudou normalização em Banco de Dados sabe que campos calculados devem ser eliminados por ferirem a terceira forma normal, no entanto, quando trabalhamos com SIG muitas vezes precisamos de campos como: área, perímetro, centróide, dentre outras medidas, calculadas a partir das geometrias das feições.

Porém, tais campos devem possuir um mecanismo que possibilite o seu cálculo de forma automatizada, tanto para novas feições, quanto para mudanças na forma original da geometria, através da edição da base. Uma forma de implementar tal comportamento em uma tabela espacial com campos calculados, é através de triggers e procedures.

Aqui temos um exemplo uma stored procedure e de uma trigger que calcula os valores de área (area_m2) e perímetro (perimetro_m) da tabela lote, a partir da geometria, armazenada no campo geom:

--Criação dos campos que serão calculados (caso não existam ainda)
ALTER TABLE lotes ADD area_m2 numeric(10,3);
ALTER TABLE lotes ADD perimetro_m numeric(10,3);

--Atualização dos valores dos campos calculados
UPDATE lotes SET area_m2 = ST_Area(geom);
UPDATE lotes SET perimetro_m = ST_Perimeter(geom);

-----------------------------
--Criação da Stored Procedure
-----------------------------
CREATE OR REPLACE FUNCTION calculate_geometry_fields()
RETURNS trigger AS
$$
BEGIN
NEW.area_m2:=ST_Area(NEW.geom);
NEW.perimetro_m:=ST_Perimeter(NEW.geom);
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';

--------------------
--Criação da Trigger
--------------------
CREATE TRIGGER fill_geometry_fields
BEFORE INSERT OR UPDATE ON lotes
FOR EACH ROW EXECUTE PROCEDURE calculate_geometry_fields();

Nenhum comentário: