Agregar capa PostGIS desde el complemento QGIS Python

9

Intento desarrollar un complemento para agregar capas postgis a qgis desde un complemento como parte del aprendizaje de Python.

El código para agregar una capa postgis se toma del libro de cocina y funciona bien si lo ejecuto desde la consola de Python dentro de qgis (si se presiona el botón OK en el cuadro de diálogo resultado == 1 y debería agregar mi capa a qgis).

Pero si lo ejecuto desde mi complemento, arroja el mensaje NameError: el nombre 'QgsDataSourceURI' no está definido. ¿Por qué aparece ese error ejecutándolo desde el complemento?

¿Hay alguna diferencia en cómo agrego una capa desde un complemento / dentro de una función frente a la consola de 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
fuente
Estoy tratando de usar su patrón para agregar la capa PostGIS en la consola de Python QGIS, pero sin éxito - "NameError: name 'self' no está definido" (. ¿Te importaría decirme qué está mal? ¿Qué significa self? bueno en python). Aquí está mi código gis.stackexchange.com/questions/245985/…
Jane

Respuestas:

9

Porque necesita importar clases de Python antes de usarlas. Simplemente escriba esto en el encabezado de ese archivo:

from qgis.core import QgsDataSourceURI

Es diferente en la consola QGIS Python porque carga automáticamente las clases QGIS cuando se abre.

Tenga en cuenta que si aún no ha importado la QgsVectorLayerclase, obtendrá un error similar. En lugar de agregar una nueva línea, puede enumerar las clases que desea importar de la qgis.corebiblioteca de esta manera:

from qgis.core import QgsVectorLayer, QgsDataSourceURI
Germán Carrillo
fuente
2
Perdón por la respuesta tardía, tuve la oportunidad de probarlo y funcionó muy bien. También gracias por explicar cómo es posible enumerar las clases de una biblioteca, eso también fue nuevo para mí. Saludos
cordiales
1
En QGIS 3, se renombra a QgsDataSourceUri.
Jay Cummins