Re: [Gfoss] Automatizzare l'intersezione con un TRIGGER

2019-12-28 Per discussione a . furieri

On Sat, 28 Dec 2019 18:19:02 +0100, Massimiliano Moraca wrote:

sostituendo con buffer ottengo questo
messaggio di errore nel momento in cui voglio salvare il poligono
creato:


Could not commit changes to layer buffer
Errors: ERROR: 1 feature(s) not added.

Provider errors:
PostGIS error while adding features: ERRORE: la query non ha una
destinazione per i dati restituiti
HINT: Se vuoi scartare i risultati di una SELECT, utilizza PERFORM.
CONTEXT: funzione PL/pgSQL intersection_function() riga 3 a
istruzione SQL




Massimiliano,

sempre premettendo che io conosco bene i Triggers di SQLite e molto
poco quelli di PostgreSQL (e paiono sostanzialmente diversi).

ragionando a fil di logica l'errore dovrebbe nascere dal fatto che
tu nel tuo trigger-body in effetti ti limiti a fare una SELECT, ma
non specifichi mai da nessuna parte che quei valori ottenuti dalla
SELECT poi li vuoi inserire nella tavola di output.
verosimilmente quello che ti serve e' definire uno statement SQL
piu' o meno di questo tenore:

INSERT INTO intersection_output (idb, idp, geom)
SELECT a.idb, b.idp, ST_Intersection(a.geom, b.geom)
FROM . etc etc ...

===
hint:
un trigger non e' altro che un normalissimo statement SQL
(piu' o meno complesso) che scatta automaticamente tutte le
volte che si realizza un determinato evento.
di per se non ha nulla di "magico", tutte le azioni che
intendi fare te le devi definire tu una per una.

ciao Sandro
___
Gfoss@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

Re: [Gfoss] Automatizzare l'intersezione con un TRIGGER

2019-12-28 Per discussione Massimiliano Moraca
Ora che mi ci fai ragionare effettivamente il target della INSERT è
sbagliato ma non dovrebbe essere nemmeno polygons che sono "statici" ma
buffer visto che traccio io i poligoni in buffer.
Comunque sostituendo polygons continuo ad ottenere una tabella vuota in
intersection_output mentre sostituendo con buffer ottengo questo messaggio
di errore nel momento in cui voglio salvare il poligono creato:

> Could not commit changes to layer buffer
> Errors: ERROR: 1 feature(s) not added.
>
> Provider errors:
> PostGIS error while adding features: ERRORE: la query non ha una
> destinazione per i dati restituiti
> HINT: Se vuoi scartare i risultati di una SELECT, utilizza PERFORM.
> CONTEXT: funzione PL/pgSQL intersection_function() riga 3 a istruzione SQL



*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*


Il giorno sab 28 dic 2019 alle ore 17:45  ha scritto:

> 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@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
>
> ___
> Gfoss@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
___
Gfoss@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 

Re: [Gfoss] Automatizzare l'intersezione con un TRIGGER

2019-12-28 Per discussione a . furieri

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@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


___
Gfoss@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

[Gfoss] Automatizzare l'intersezione con un TRIGGER

2019-12-28 Per discussione Massimiliano Moraca
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@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