terça-feira, fevereiro 19, 2013

PostGIS: Triggers e Procedures (Parte 2)

Complementando o post anterior, imagine o seguinte cenário: um mapa que mostre de forma esquemática, adutoras que serão projetadas para abastecer alguns municípios. Neste caso o objetivo é ter uma ideia dos comprimentos das adutoras (representados pela distância entre as sedes municipais), quantidade de municípios abastecidos e o nome dos mesmos.
CREATE TABLE adutoras (
 gid serial PRIMARY KEY,
 nome_adutora varchar(50),
 -- campo alimentado pela trigger
 comp_trecho_km numeric(10,3),
 -- campo alimentado pela trigger
 qtde_municipios_abast int,
 -- campo alimentado pela trigger
 municipios_abastecidos varchar(400)
 );

-- adição do campo geom
SELECT AddGeometryColumn (
 'public',
 'adutoras',
 'geom',
 '4291', --Lat/Long - Datum SAD69
 'LINESTRING',
 2
 );

-- Procedure
CREATE OR REPLACE FUNCTION pipeline_geometry_field()
RETURNS trigger AS
$$
BEGIN
SELECT string_agg(municipios.nome,', ')
INTO NEW.municipios_abastecidos
FROM municipios
WHERE ST_Intersects(NEW.geom, municipios.geom);

SELECT COUNT(municipios.*) 
INTO NEW.qtde_municipios_abast
FROM municipios
WHERE ST_Intersects(NEW.geom, municipios.geom);

NEW.comp_trecho_km:=ST_Length(Geography((NEW.geom))/1000);

RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';

-- Trigger
CREATE TRIGGER fill_pipeline_geometry_field
BEFORE INSERT OR UPDATE ON adutoras
FOR EACH ROW EXECUTE PROCEDURE pipeline_geometry_field();

O vídeo a seguir mostra a implementação do código acima, a partir da edição da tabela adutora no QGIS, observa-se o preenchimento automático dos campos após o salvamento da feição no Banco de Dados:

Nenhum comentário: