[Gfoss] Automatizzare l'intersezione con un TRIGGER

a.furieri a lqt.it a.furieri a lqt.it
Sab 28 Dic 2019 17:39:57 CET


Massimiliano,

premetto che non ho nessuna familiarita' con i Triggers di PostreSQL,
ma conosco molto bene quelli di SQLite.

CREATE TRIGGER make_intersection AFTER INSERT ON intersection_output

con la clausola AFTER INSERT di cui sopra tu stai chiedendo a Postgres
di attivare il tuo trigger ogni volta che viene inserita una nuova
riga nella tavola "intersection_output"
ma da tutta la spiegazione precedente io ho capito che questa (come
del resto dice il nome) e' appunto la tavola di output destinata a
collezionare le intersezioni.
sembra che tu le tue INSERT con QGIS le fai invece su "polygons",
e di conseguenza quel trigger non scattera' mai.

almeno a lume di naso quel trigger va definito come:

CREATE TRIGGER make_intersection AFTER INSERT ON polygons

ciao Sandro


On Sat, 28 Dec 2019 17:21:17 +0100, Massimiliano Moraca wrote:
> Salve a tutti, sto dedicando questi giorni a familiarizzare con i 
> TRIGGER
> in PostGIS prendendo spunto da questa[1] guida. Sono riuscito a 
> creare
> automaticamente un buffer a partire dall'editing di un vettore 
> lineare e
> quello che voglio fare ora è eseguire un *intersection* tra i buffer 
> e
> alcuni poligoni. Ho quindi due tabelle principali: *buffer* e 
> *polygons*;
> l'output dell'intersezione deve confluire in una tabella in cui 
> verranno
> riportati anche gli id dei poligoni da cui è scaturita 
> l'intersezione(idb
> per buffer e idp per polygons). La tabella in cui confluiranno questi 
> dati
> l'ho chiamata *intersection_output*.
>
> Ho scritto quindi questo TRIGGER:
>
>> CREATE OR REPLACE FUNCTION intersection_function() RETURNS trigger 
>> AS
>> $BODY$
>> BEGIN
>> SELECT
>> a.idb,
>> b.idp,
>> ST_Intersection(a.geom, b.geom) as geom
>> FROM
>> buffer AS a,
>> polygons AS b
>> WHERE ST_Intersects(a.geom, b.geom);
>> RETURN NEW;
>> END;
>> $BODY$
>> LANGUAGE 'plpgsql';
>> CREATE TRIGGER make_intersection
>> AFTER INSERT ON intersection_output
>> FOR EACH ROW EXECUTE PROCEDURE intersection_function();
>
>
> Mi aspetto quindi che ogni volta che creo un poligono, ad esempio con 
> QGIS,
> nella tabella *buffer*, esso venga intersecato con il o i poligoni,
> presenti in *polygons*, che vengono coperti dall'area di buffer ed il
> risultato di questa intersezione deve essere scritto in
> *intersection_output*.
>
> Il problema che riscontro è che la tabella delle intersezioni resta 
> sempre
> vuota nonostante sia le geometrie di buffer che di polygons siano in 
> 4326.
>
> Sicuramente sbaglio io qualcosa ma non mi è chiaro dove.
>
>
> ____
> [1] 
> http://www.postgresqltutorial.com/creating-first-trigger-postgresql/
>
> *ing.Massimiliano Moraca*
> *Analisi, progettazione e sviluppo di soluzioni GIS e WebGIS*
> *P.IVA*: 08700081212
> *CELL*: 333 59 49 583 (*lun - ven 9.00 - 18.00*)
> *WEB*: www.massimilianomoraca.it
> * Attività svolta ai sensi della Legge 4 del 14 gennaio 2013, art.1*
> _______________________________________________
> Gfoss a lists.gfoss.it
> http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
> Questa e' una lista di discussione pubblica aperta a tutti.
> I messaggi di questa lista non hanno relazione diretta con le
> posizioni dell'Associazione GFOSS.it.
> 764 iscritti al 23/08/2019



Maggiori informazioni sulla lista Gfoss