[Gfoss] QGis, postgres e le viste

Salve,

Dopo una serata passata a cercare di convincere qgis ad accettare una complicata vista impostata su postgres,
sono giunto ad alcune conclusioni , e a una soluzione tampone che ritengo sia utile da condividere.

Una piccola premessa:

Come si sa’ il buon qgis per visualizzare una tabella (o vista) vuole un campo intero con valori univoci.

Per cui una tabella siffatta

ID, GEOMETRY
1, geom1
1, geom2
1, geom3
2, geom4,
2, geom5,
2, geom6

A lui non va’ bene.

D’altronde qgis accetta di visualizzare anche da una vista ,
per cui in teoria dovrebbe accettare , e non avrebbe alcuna ragione per rifiutare una vista cosi’ definita:

create view as
select id as new_id, ST_Union(geometry) as new_geom from table group by id

Infatti il risultato di questa vista sarebbe:

new_id, new_geom
1, (geom1 + geom2 + geom3)
2, (geom4 + geom5 + geom6)

e quindi perfettamente compatibile con le aspettative di qgis.

Il buon qgis, pero’ , tanto per complicare la vita, anziche’ limitarsi a pesare i valori che riceve dalla vista, vuole andare a pesare i singoli componenti che la compongono,
e nel fare questo pero’ si dimentica di considerare che nella vista e’ presente un costrutto “group-b” che potrebbe rendere univoci i valori.
Per cui , dato che i componenti della vista , ovvero, nell’esempio riportato, la tabella suddetta, non presentano un campo con valori univoci, per qgis e’ una vista da rifiutare.
Sebbene la presenza del costrutto “group by” in realta’ renderebbe univoci i valori del campo ID.

Esiste pero’ una strada per “gabbare” qgis, ovvero definire una vista di una vista.
Si definisce una prima vista che effettua il group-by, e poi si definisce una seconda vista che peschi dalla prima

create view1 as
select id as new_id, ST_Union(geometry) as new_geom from table group by id

create view2 as
select new_id, new_geom from view1;

A questo punto si dice a qgis di visualizzare il contenuto della vista2 e il gioco e’ fatto.

Saluti,

Andrea Peri
. . . . . . . . .
qwerty àèìòù

Esiste pero' una strada per "gabbare" qgis, ovvero definire una vista di una
vista.
Si definisce una prima vista che effettua il group-by, e poi si definisce
una seconda vista che peschi dalla prima

create view1 as
select id as new_id, ST_Union(geometry) as new_geom from table group by id

create view2 as
select new_id, new_geom from view1;

A questo punto si dice a qgis di visualizzare il contenuto della vista2 e il
gioco e' fatto.

hai provato a vedere che succede con una subquery?
ad es:

create view 1 as
select * from (select id as new_id, ST_Union(geometry) as new_geom
from table group by id) as tab1

se va come credo, magari ti risparmi una vista...

ciao
Paolo

--
Paolo Corti
GIS Architect and Developer
mobile: +39 335 7635561
web: http://www.paolocorti.net
twitter: @capooti

Si, avevo provato , sia con il group-by nella prima select che con il group-by nella sub-query.

Alla fine l’unica soluzione che ha funzionato e’ fare due viste.
Farne due e’ molto fastidioso, anche perche’ obbliga ad avere una impostazione server-side.

Comunque l’importante e’ che alla fine esista una strada per farlo funzionare.

Andrea.

Il giorno 23 gennaio 2010 00.10, Paolo Corti <pcorti@gmail.com> ha scritto:

Esiste pero’ una strada per “gabbare” qgis, ovvero definire una vista di una
vista.
Si definisce una prima vista che effettua il group-by, e poi si definisce
una seconda vista che peschi dalla prima

create view1 as
select id as new_id, ST_Union(geometry) as new_geom from table group by id

create view2 as
select new_id, new_geom from view1;

A questo punto si dice a qgis di visualizzare il contenuto della vista2 e il
gioco e’ fatto.

hai provato a vedere che succede con una subquery?
ad es:

create view 1 as
select * from (select id as new_id, ST_Union(geometry) as new_geom
from table group by id) as tab1

se va come credo, magari ti risparmi una vista…

ciao
Paolo


Paolo Corti
GIS Architect and Developer
mobile: +39 335 7635561
web: http://www.paolocorti.net
twitter: @capooti

Andrea Peri
. . . . . . . . .
qwerty àèìòù