Aggiunta del livello PostGIS dal plug-in QGIS Python


9

Provo a sviluppare un plugin per aggiungere livelli postgis a qgis da un plugin come parte dell'apprendimento di Python.

Il codice per aggiungere un livello Postgis è preso dal ricettario e funziona benissimo se lo eseguo dalla console Python in qgis (Se il pulsante OK viene premuto nella finestra di dialogo risultato == 1 e dovrei aggiungere il mio livello a qgis).

Ma se lo eseguo dal mio plugin genera il messaggio NameError: il nome 'QgsDataSourceURI' non è definito. Perché ottengo quell'errore eseguendolo dal plugin?

C'è una differenza nel modo in cui aggiungo un layer da un plugin / all'interno di una funzione rispetto alla console di Python?

 def run(self):
        """Run method that performs all the real work"""

        # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result == 1:
            # Do something useful here - delete the line containing pass and
            # substitute with your code.
            uri = QgsDataSourceURI()
            uri.setConnection("localhost", "5432", "test", "postgres", "postgres")
            #set database schema, table name, geometry column and optionaly subset(WHERE clause)
            uri.setDataSource ("basic", "cities", "geom")
            # Defining the layer name and layer type for QGIS?
            vlayer=QgsVectorLayer (uri .uri() ,"cities","postgres")

Sto cercando di usare il tuo schema per aggiungere il livello PostGIS nella console Python QGIS ma senza successo - "NameError: il nome 'self' non è definito" (. Ti dispiace dirmi per favore cosa c'è che non va? buono in Python.) Ecco il mio codice gis.stackexchange.com/questions/245985/…
Jane

Risposte:


9

Perché è necessario importare le classi Python prima di usarle. Basta scrivere questo nell'intestazione di quel file:

from qgis.core import QgsDataSourceURI

È diverso in QGIS Python Console perché carica automaticamente le classi QGIS quando viene aperto.

Nota che se non hai ancora importato la QgsVectorLayerclasse, otterrai un errore simile. Invece di aggiungere una nuova riga, puoi elencare le classi che desideri importare dalla qgis.corelibreria, in questo modo:

from qgis.core import QgsVectorLayer, QgsDataSourceURI

2
Ci scusiamo per la risposta tardiva, ho appena avuto l'opportunità di provarlo e ha funzionato alla grande! Grazie anche per aver spiegato come è possibile elencare le lezioni da una libreria, che era anche una novità per me. I migliori saluti
geogrow

1
In QGIS 3, viene rinominato QgsDataSourceUri.
Jay Cummins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.