Ajout d'une couche PostGIS à partir du plugin QGIS Python

9

J'essaie de développer un plugin pour ajouter des couches postgis aux qgis à partir d'un plugin dans le cadre de l'apprentissage de python.

Le code pour ajouter une couche postgis est tiré du livre de recettes et fonctionne correctement si je l'exécute à partir de la console python dans qgis (si le bouton OK est enfoncé dans la boîte de dialogue, résultat == 1 et devrait ajouter ma couche à qgis).

Mais si je l'exécute à partir de mon plugin, il envoie le message NameError: le nom 'QgsDataSourceURI' n'est pas défini. Pourquoi ai-je cette erreur en l'exécutant à partir du plugin?

Y a-t-il une différence entre l'ajout d'une couche à partir d'un plugin / à l'intérieur d'une fonction et celle de la 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
la source
J'essaie d'utiliser votre modèle pour ajouter une couche PostGIS dans la console python QGIS mais sans succès - "NameError: le nom 'self' n'est pas défini" (.. bon en python) .Voici
Jane

Réponses:

9

Parce que vous devez importer des classes Python avant de les utiliser. Écrivez simplement ceci dans l'en-tête de ce fichier:

from qgis.core import QgsDataSourceURI

C'est différent dans la console QGIS Python car il charge automatiquement les classes QGIS lors de son ouverture.

Notez que si vous n'avez pas encore importé la QgsVectorLayerclasse, vous obtiendrez une erreur similaire. Au lieu d'ajouter une nouvelle ligne, vous pouvez lister les classes que vous souhaitez importer de la qgis.corebibliothèque, de cette façon:

from qgis.core import QgsVectorLayer, QgsDataSourceURI
Germán Carrillo
la source
2
Désolé pour la réponse tardive, j'ai eu l'occasion de l'essayer et cela a très bien fonctionné! Merci également d'avoir expliqué comment il est possible de lister les classes d'une bibliothèque, c'était aussi nouveau pour moi. Meilleures salutations
geogrow
1
Dans QGIS 3, il est renommé en QgsDataSourceUri.
Jay Cummins