Adicionando camada PostGIS a partir do plugin QGIS Python

9

Eu tento desenvolver um plugin para adicionar camadas postgis ao qgis a partir de um plugin como parte do aprendizado de python.

O código para adicionar uma camada postgis é retirado do livro de receitas e funciona bem se eu executá-la no console python no qgis (se o botão OK for pressionado no resultado da caixa de diálogo == 1 e deve adicionar minha camada ao qgis).

Mas se eu executá-lo no meu plug-in, ele lança a mensagem NameError: name 'QgsDataSourceURI' não está definido. Por que recebo esse erro ao executá-lo no plug-in?

Existe uma diferença em como eu adiciono uma camada de um plugin / dentro de uma função vs do console 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")
geogrow
fonte
Estou tentando usar seu padrão para adicionar a camada PostGIS no console python QGIS, mas sem êxito - "NameError: name 'self' não está definido" (. Você se importa em me dizer o que há de errado? . bom em python) Aqui está o meu código gis.stackexchange.com/questions/245985/...
Jane

Respostas:

9

Porque você precisa importar classes Python antes de usá-las. Basta escrever isso no cabeçalho desse arquivo:

from qgis.core import QgsDataSourceURI

É diferente no QGIS Python Console porque ele carrega automaticamente as classes QGIS quando é aberto.

Observe que, se você ainda não importou a QgsVectorLayerclasse, receberá um erro semelhante. Em vez de adicionar uma nova linha, você pode listar as classes que gostaria de importar da qgis.corebiblioteca, desta maneira:

from qgis.core import QgsVectorLayer, QgsDataSourceURI
Germán Carrillo
fonte
2
Desculpe pela resposta tardia, eu só tive a oportunidade de experimentá-lo e funcionou muito bem! Também obrigado por explicar como é possível listar classes de uma biblioteca, que também era nova para mim. Atenciosamente
geogrow
11
No QGIS 3, ele é renomeado para QgsDataSourceUri.
Jay Cummins