QGis, postgres e le viste

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

QGis, postgres e le viste

Andrea Peri
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 àèìòù
-----------------


_______________________________________________
Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
[hidden email]
http://lists.faunalia.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell'Associazione GFOSS.it.
Reply | Threaded
Open this post in threaded view
|

Re: [Gfoss] QGis, postgres e le viste

Paolo Corti
> 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
_______________________________________________
Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
[hidden email]
http://lists.faunalia.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell'Associazione GFOSS.it.
Reply | Threaded
Open this post in threaded view
|

Re: [Gfoss] QGis, postgres e le viste

Andrea Peri
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 <[hidden email]> 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 àèìòù
-----------------


_______________________________________________
Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
[hidden email]
http://lists.faunalia.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell'Associazione GFOSS.it.