[QGIS-it-user] Connessione PostGIS in App PyQT

Ciao a tutti;
Sto sviluppando un plugin del QGis che mi consenta “semplicemente”, di gestire il mio Geo-DB realizzato in PostGIS.

Sono riuscito a creare la WindowDialog con il QT (e python come linguaggio per gli script) e a caricarla nel QGis.

A questo punto gli ho aggiunto un oggetto Button che vorrei, quando viene cliccato, che ti permetta di connetterti al mio GeoDB di PostGis, cosi’ poi da poter inserire nel mio plugin delle routine e script Python che “lavorino” sugli attributi delle tabelle del mio Geo-DB.

In particolare mi interessa poterci fare delle Query SQL, di “filtro” essenzialmente e che esse possano chiaramente essere lanciate da un utente qualsiasi con dei click o flag sulla Window principale.

Il problema e’ che non trovo il codice pyQgis che mi consenta di fare la connessione al Geo-DB.

Ma secondo voi per fare un lavoro di questo tipo sarebbe piu’ semplice usare il PyQGis direttamente dal QGis, nella console apposita o tramite plugin? Quindi lasciar perdere il PostGIS e agire sui layers caricati e presenti nel progetto e quindi fare delle query (sempre SQL suppongo) sulle loro tab attributi??

Grazie.

Andrea Gagna

http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/loadlayer.html#vector-layers
Luigi Pirelli

**************************************************************************************************
* Boundless QGIS Support/Development: lpirelli AT boundlessgeo DOT com
* LinkedIn: https://www.linkedin.com/in/luigipirelli
* Stackexchange: http://gis.stackexchange.com/users/19667/luigi-pirelli
* GitHub: https://github.com/luipir
* Mastering QGIS:
https://www.packtpub.com/application-development/mastering-qgis
**************************************************************************************************

2016-02-29 11:13 GMT+01:00 Andrea Gagna <g.andre87@gmail.com>:

Ciao a tutti;
Sto sviluppando un plugin del QGis che mi consenta "semplicemente", di
gestire il mio Geo-DB realizzato in PostGIS.

Sono riuscito a creare la WindowDialog con il QT (e python come linguaggio
per gli script) e a caricarla nel QGis.

A questo punto gli ho aggiunto un oggetto Button che vorrei, quando viene
cliccato, che ti permetta di connetterti al mio GeoDB di PostGis, cosi' poi
da poter inserire nel mio plugin delle routine e script Python che
"lavorino" sugli attributi delle tabelle del mio Geo-DB.

In particolare mi interessa poterci fare delle Query SQL, di "filtro"
essenzialmente e che esse possano chiaramente essere lanciate da un utente
qualsiasi con dei click o flag sulla Window principale.

Il problema e' che non trovo il codice pyQgis che mi consenta di fare la
connessione al Geo-DB.

Ma secondo voi per fare un lavoro di questo tipo sarebbe piu' semplice usare
il PyQGis direttamente dal QGis, nella console apposita o tramite plugin?
Quindi lasciar perdere il PostGIS e agire sui layers caricati e presenti nel
progetto e quindi fare delle query (sempre SQL suppongo) sulle loro tab
attributi??

Grazie.

Andrea Gagna

_______________________________________________
QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-it-user

1) scrivere anche sulla lista utenti... cosi' chi ha lo stesso
problema trova le risposte senza fare mille volte le stesse domende

2) la where filtra gia' lato server... cosa che non conviene se vuoi
layer che cambino con la queri... ti consiglio di usare
QgsFeatureRequest come da:
http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html

in definitiva una volta che hai il layer, che sia su file o remoto a
qgis non fa ne caldo ne freddo (+o-)

inoltre ci sono una quintalata di plugin per postgres/postgis ben
fatti... puoi leggere il codice direttametne da quelli (ma leggi prima
il cookbook)
ci sono anceh libri che ti guidano passo passo.

non ho studiato il codice del plugin di postgres su Ferraguti... ma mi
sembra da studiare

una cosa basica... leggere il manuale! e verificare che la stessa
domanda non sia stata fatta e risolta su gis.stackexchange.com
Luigi Pirelli

**************************************************************************************************
* Boundless QGIS Support/Development: lpirelli AT boundlessgeo DOT com
* LinkedIn: https://www.linkedin.com/in/luigipirelli
* Stackexchange: http://gis.stackexchange.com/users/19667/luigi-pirelli
* GitHub: https://github.com/luipir
* Mastering QGIS:
https://www.packtpub.com/application-development/mastering-qgis
**************************************************************************************************

2016-02-29 11:48 GMT+01:00 Andrea Gagna <g.andre87@gmail.com>:

Ciao Luigi,
Ti ringrazio per avermi rimandato alla parte di doc. ufficiale che ne parla.
Quindi devo scrivere questo codice con i riferimenti della mia connessione
PostGIS:

uri = QgsDataSourceURI()
# set host name, port, database name, username and password
uri.setConnection("localhost", "5432", "dbname", "johny", "xxx")
# set database schema, table name, geometry column and optionally
# subset (WHERE clause)
uri.setDataSource("public", "roads", "the_geom", "cityid = 2643")

vlayer = QgsVectorLayer(uri.uri(), "layer name you like", "postgres")

La cosa che non capisco bene e' la fase di filtro; in questo esempio lo fa
con un semplicissimo "WHERE" e ok.

Se volessi fare Query piu' complesse che formato posso usare? l'SQL non lo
posso fare se voglio fare dei JOIN ad esempio??

Grazie.

Il 29/feb/2016 11:27 "Luigi Pirelli" <luipir@gmail.com> ha scritto:

http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/loadlayer.html#vector-layers
Luigi Pirelli

**************************************************************************************************
* Boundless QGIS Support/Development: lpirelli AT boundlessgeo DOT com
* LinkedIn: https://www.linkedin.com/in/luigipirelli
* Stackexchange: http://gis.stackexchange.com/users/19667/luigi-pirelli
* GitHub: https://github.com/luipir
* Mastering QGIS:
https://www.packtpub.com/application-development/mastering-qgis

**************************************************************************************************

2016-02-29 11:13 GMT+01:00 Andrea Gagna <g.andre87@gmail.com>:
> Ciao a tutti;
> Sto sviluppando un plugin del QGis che mi consenta "semplicemente", di
> gestire il mio Geo-DB realizzato in PostGIS.
>
> Sono riuscito a creare la WindowDialog con il QT (e python come
> linguaggio
> per gli script) e a caricarla nel QGis.
>
> A questo punto gli ho aggiunto un oggetto Button che vorrei, quando
> viene
> cliccato, che ti permetta di connetterti al mio GeoDB di PostGis, cosi'
> poi
> da poter inserire nel mio plugin delle routine e script Python che
> "lavorino" sugli attributi delle tabelle del mio Geo-DB.
>
> In particolare mi interessa poterci fare delle Query SQL, di "filtro"
> essenzialmente e che esse possano chiaramente essere lanciate da un
> utente
> qualsiasi con dei click o flag sulla Window principale.
>
> Il problema e' che non trovo il codice pyQgis che mi consenta di fare la
> connessione al Geo-DB.
>
> Ma secondo voi per fare un lavoro di questo tipo sarebbe piu' semplice
> usare
> il PyQGis direttamente dal QGis, nella console apposita o tramite
> plugin?
> Quindi lasciar perdere il PostGIS e agire sui layers caricati e presenti
> nel
> progetto e quindi fare delle query (sempre SQL suppongo) sulle loro tab
> attributi??
>
> Grazie.
>
> Andrea Gagna
>
>
> _______________________________________________
> QGIS-it-user mailing list
> QGIS-it-user@lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/qgis-it-user
>

continui a scrivere solo a me... comunque

Comunque ok ti ringrazio; ho visto anche cosa fa il QgsFeatureRequest ed e'
interessante ma non risolve la mia necessita', che e' quella di poter
scrivere Query in SQL...

a parte leggersi l'ottimo plugin di Enrico Ferraguti che in
particolare ha quel che cerchi qui:
https://github.com/enricofer/postgisQueryBuilder/blob/master/PSQL.py

e in particolare questa linea che svela il trucco (che puoi trovare su
qgis.stackexchange)... o leggendo il codice di qgis:
https://github.com/enricofer/postgisQueryBuilder/blob/master/PSQL.py#L450

unico problema... non puoi fare query composte... tipo una com query
multiple con una vista materializzata su cui fare una seconda
query.... almeno fino a poco tempo fa.
La ragione e' che qgis cerca di prendere la primary_key dalla I query
e fallisce... sarebbe una patch non tanto difficile da realizzare per
permettere questo.

okkio anche alla possibilita' di usare psql o QSql come fa
Ferraguti.... suo due versioni viabili su cui poi eventualmente
contruire un layer

Il problema per chi come me non e' esperto e' anche capire come muoversi.

concordo... il capitolo 9 che ho scritto su Mastering QGIS e' proprio
rivolto a questo. Generalmente qgis.stackexchange.org offre una
comunita' per le soluzioni

Luigi Pirelli

**************************************************************************************************
* Boundless QGIS Support/Development: lpirelli AT boundlessgeo DOT com
* LinkedIn: https://www.linkedin.com/in/luigipirelli
* Stackexchange: http://gis.stackexchange.com/users/19667/luigi-pirelli
* GitHub: https://github.com/luipir
* Mastering QGIS:
https://www.packtpub.com/application-development/mastering-qgis
**************************************************************************************************

Ciao Luigi…Si, hai ragione ho continuato per sbaglio a inviarti messaggi solo a te e non all’intero gruppo…
Dovete scusarmi e avere pazienza, sono alle prime armi.

Comunque avevo il problema di non sapere come si potesse connettere il plugin che sto sviluppando con il PyQT al mio Geo-DB realizzato in PostGIS.

Poi grazie ai consigli di Luigi la connessione al PostGis da applicazione WindowDialog realizzata con il QT creator e il PyQgis, sono riuscito a farla e funziona dato che sono riuscito anche a fare una prima semplice query di interrogazione.

In realta’ mi sembra che le query SQL si possano fare normalmente e anche a livello medio-alto. Volendo le si puo’ anche autogenerare dai legami che puoi fare tra le tabelle all’interno del PostGIS stesso (in cui hai il tuo Geo-DB chiaramente). Funziona un po’ come Access e dal punto di vista della programmazione a oggetti e’ molto simile al Visual Studio.NET, con la differenza che sia quest’ultimo che Access costano un botto e non sono specifici per gestire dati geo-spaziali mentre il PostgreSQL con ext. PostGIS lo e’, oltre che ad essere chiaramente un prodotto Open Source ;-)!!!

Quindi volendo puoi anche fare i legami tra i campi delle tue tabelle in PostGis, vedere il codice SQL autogenerato, copiarlo e salvarlo in una normale variabile “string” nel tuo codice di sviluppo PyQgis del tuo plugin o applicativo e poi lanciarlo realizzando un semplice “button” nell’interfaccia grafica WindowDialog del QT creator.

Il QT design che viene gia’ scaricato nel “pacchetto Osgeo” e che dovrebbe essere specifico e customizzato sul QGis invece mi sembra paradossalmente piu’ complesso da usare rispetto l’associazione QT creator + Notepad++…

Sarebbe bello che in una futura nuova versione del QGis ci sia gia’ una piattaforma interna di sviluppo, con le API e le librerie fondamentali gia’ importate di default. Una sorta di “VisualPyQgis Creator”…

Pero’ non so se e’ una cosa fattibile oppure molto complessa e articolata…

E’ un’idea.

Grazie ancora, per ora problema risolto!

Andrea Gagna.

Il 29/feb/2016 14:54 “Andrea Gagna” <g.andre87@gmail.com> ha scritto:

Comunque mi sembra che Io ho scritto sulla lista utenti.

Comunque ok ti ringrazio; ho visto anche cosa fa il QgsFeatureRequest ed e’ interessante ma non risolve la mia necessita’, che e’ quella di poter scrivere Query in SQL…

A questo link della documentazione ufficiale mette le espressioni QGis SQL…ma non le capisco perche’ non e’ un normale SQL…
Link: http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/expressions.html#expressions

Quindi non capisco bene…

Io capisco che ci siano materiali, tutorial infiniti, etc…ma penso sia normale che il 90% delle domande che un utente non esperto fa qui siano gia’ state risolte…(anche se la mia e’ solo parzialmente risolta.)

Il problema per chi come me non e’ esperto e’ anche capire come muoversi.

Grazie comunque.

  1. scrivere anche sulla lista utenti… cosi’ chi ha lo stesso
    problema trova le risposte senza fare mille volte le stesse domende

  2. la where filtra gia’ lato server… cosa che non conviene se vuoi
    layer che cambino con la queri… ti consiglio di usare
    QgsFeatureRequest come da:
    http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html

in definitiva una volta che hai il layer, che sia su file o remoto a
qgis non fa ne caldo ne freddo (+o-)

inoltre ci sono una quintalata di plugin per postgres/postgis ben
fatti… puoi leggere il codice direttametne da quelli (ma leggi prima
il cookbook)
ci sono anceh libri che ti guidano passo passo.

non ho studiato il codice del plugin di postgres su Ferraguti… ma mi
sembra da studiare

una cosa basica… leggere il manuale! e verificare che la stessa
domanda non sia stata fatta e risolta su gis.stackexchange.com
Luigi Pirelli



2016-02-29 11:48 GMT+01:00 Andrea Gagna <g.andre87@gmail.com>:

Ciao Luigi,
Ti ringrazio per avermi rimandato alla parte di doc. ufficiale che ne parla.
Quindi devo scrivere questo codice con i riferimenti della mia connessione
PostGIS:

uri = QgsDataSourceURI()

set host name, port, database name, username and password

uri.setConnection(“localhost”, “5432”, “dbname”, “johny”, “xxx”)

set database schema, table name, geometry column and optionally

subset (WHERE clause)

uri.setDataSource(“public”, “roads”, “the_geom”, “cityid = 2643”)

vlayer = QgsVectorLayer(uri.uri(), “layer name you like”, “postgres”)

La cosa che non capisco bene e’ la fase di filtro; in questo esempio lo fa
con un semplicissimo “WHERE” e ok.

Se volessi fare Query piu’ complesse che formato posso usare? l’SQL non lo
posso fare se voglio fare dei JOIN ad esempio??

Grazie.

Il 29/feb/2016 11:27 “Luigi Pirelli” <luipir@gmail.com> ha scritto:

http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/loadlayer.html#vector-layers
Luigi Pirelli



2016-02-29 11:13 GMT+01:00 Andrea Gagna <g.andre87@gmail.com>:

Ciao a tutti;
Sto sviluppando un plugin del QGis che mi consenta “semplicemente”, di
gestire il mio Geo-DB realizzato in PostGIS.

Sono riuscito a creare la WindowDialog con il QT (e python come
linguaggio
per gli script) e a caricarla nel QGis.

A questo punto gli ho aggiunto un oggetto Button che vorrei, quando
viene
cliccato, che ti permetta di connetterti al mio GeoDB di PostGis, cosi’
poi
da poter inserire nel mio plugin delle routine e script Python che
“lavorino” sugli attributi delle tabelle del mio Geo-DB.

In particolare mi interessa poterci fare delle Query SQL, di “filtro”
essenzialmente e che esse possano chiaramente essere lanciate da un
utente
qualsiasi con dei click o flag sulla Window principale.

Il problema e’ che non trovo il codice pyQgis che mi consenta di fare la
connessione al Geo-DB.

Ma secondo voi per fare un lavoro di questo tipo sarebbe piu’ semplice
usare
il PyQGis direttamente dal QGis, nella console apposita o tramite
plugin?
Quindi lasciar perdere il PostGIS e agire sui layers caricati e presenti
nel
progetto e quindi fare delle query (sempre SQL suppongo) sulle loro tab
attributi??

Grazie.

Andrea Gagna


QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-it-user