Dodawanie warstwy PostGIS z wtyczki QGIS Python

9

Próbuję opracować wtyczkę, aby dodać warstwy postgis do qgis z wtyczki w ramach uczenia się języka Python.

Kod dodawania warstwy postgis jest pobierany z książki kucharskiej i działa dobrze, jeśli uruchomię go z konsoli pythona w qgis (jeśli przycisk OK zostanie naciśnięty w wyniku w oknie dialogowym == 1 i powinien dodać moją warstwę do qgis).

Ale jeśli uruchomię go z mojej wtyczki, wyśle ​​komunikat NameError: nazwa „QgsDataSourceURI” nie jest zdefiniowana. Dlaczego dostaję ten błąd, uruchamiając go z wtyczki?

Czy jest różnica w tym, jak dodać warstwę z wtyczki / wewnątrz funkcji w porównaniu z konsolą Pythona?

 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
źródło
Próbuję użyć twojego wzorca, aby dodać warstwę PostGIS do QGIS konsoli Pythona, ale bezskutecznie - „NameError: nazwa„ jaźń ”nie jest zdefiniowana” (. Czy możesz mi powiedzieć, proszę, co jest nie tak? Co mam na myśli (nie bardzo dobry w python). Oto mój kod gis.stackexchange.com/questions/245985/...
Jane

Odpowiedzi:

9

Ponieważ musisz zaimportować klasy Python przed ich użyciem. Po prostu napisz to w nagłówku tego pliku:

from qgis.core import QgsDataSourceURI

Inaczej jest w QGIS Python Console, ponieważ automatycznie ładuje klasy QGIS po otwarciu.

Pamiętaj, że jeśli jeszcze nie zaimportowałeś QgsVectorLayerklasy, pojawi się podobny błąd. Zamiast dodawać nowy wiersz, możesz wymienić klasy, które chcesz zaimportować z qgis.corebiblioteki, w ten sposób:

from qgis.core import QgsVectorLayer, QgsDataSourceURI
Germán Carrillo
źródło
2
Przepraszam za spóźnioną odpowiedź. Właśnie miałem okazję go wypróbować i zadziałało świetnie! Dziękuję również za wyjaśnienie, w jaki sposób można wyświetlić listę klas z jednej biblioteki, co również było dla mnie nowe. Z pozdrowieniami
geogrow
1
W QGIS 3 zmieniono jego nazwę na QgsDataSourceUri.
Jay Cummins,