Hinzufügen einer PostGIS-Ebene aus dem QGIS Python-Plugin

9

Ich versuche, ein Plugin zu entwickeln, um QGIS Postgis-Ebenen von einem Plugin als Teil des Lernens von Python hinzuzufügen.

Der Code zum Hinzufügen einer Postgis-Ebene stammt aus dem Kochbuch und funktioniert einwandfrei, wenn ich ihn über die Python-Konsole in qgis ausführe (Wenn die Schaltfläche OK im Dialogfeld Ergebnis == 1 gedrückt wird und meine Ebene zu qgis hinzugefügt werden soll).

Wenn ich es jedoch von meinem Plugin aus starte, wird die Meldung NameError ausgegeben: Der Name 'QgsDataSourceURI' ist nicht definiert. Warum wird dieser Fehler vom Plugin ausgeführt?

Gibt es einen Unterschied, wie ich eine Ebene aus einem Plugin / innerhalb einer Funktion hinzufüge, gegenüber der Python-Konsole?

 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
quelle
Ich versuche, Ihr Muster zu verwenden, um eine PostGIS-Ebene in der Python-Konsole QGIS hinzuzufügen, aber erfolglos - "NameError: Name 'self' ist nicht definiert" (. Haben Sie etwas dagegen, mir bitte zu sagen, was falsch ist? Was self bedeutet (ich bin nicht sehr) gut in Python). Hier ist mein Code gis.stackexchange.com/questions/245985/…
Jane

Antworten:

9

Weil Sie Python-Klassen importieren müssen, bevor Sie sie verwenden können. Schreiben Sie dies einfach in die Überschrift dieser Datei:

from qgis.core import QgsDataSourceURI

In der QGIS Python Console ist dies anders, da beim Öffnen automatisch QGIS-Klassen geladen werden.

Beachten Sie QgsVectorLayer, dass ein ähnlicher Fehler angezeigt wird, wenn Sie die Klasse noch nicht importiert haben . Anstatt eine neue Zeile hinzuzufügen, können Sie die Klassen, die Sie aus der qgis.coreBibliothek importieren möchten, folgendermaßen auflisten :

from qgis.core import QgsVectorLayer, QgsDataSourceURI
Germán Carrillo
quelle
2
Entschuldigung für die späte Antwort, ich hatte gerade Gelegenheit, es auszuprobieren und es hat super funktioniert! Vielen Dank auch für die Erklärung, wie es möglich ist, Klassen aus einer Bibliothek aufzulisten, was auch für mich neu war. Beste Grüße
Geogrow
1
In QGIS 3 wird es in umbenannt QgsDataSourceUri.
Jay Cummins