Добавление слоя PostGIS из плагина QGIS Python

9

Я пытаюсь разработать плагин для добавления слоев postgis к qgis из плагина в рамках изучения Python.

Код для добавления слоя postgis взят из кулинарной книги и работает нормально, если я запускаю его из консоли python в qgis (если кнопка OK нажата в диалоговом окне, то результат == 1 и должен добавить мой слой в qgis).

Но если я запускаю его из своего плагина, он выдает сообщение NameError: имя 'QgsDataSourceURI' не определено. Почему я получаю эту ошибку при запуске плагина?

Есть ли разница, как добавить слой из плагина / внутри функции против консоли 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
источник
Я пытаюсь использовать ваш шаблон для добавления слоя PostGIS в консоли Python QGIS, но безуспешно - "NameError: имя 'self' не определено" (. Не могли бы вы сказать мне, пожалуйста, что не так? Что я имею в виду (я не очень хорошо в питоне). Вот мой код gis.stackexchange.com/questions/245985/…
Джейн

Ответы:

9

Потому что вам нужно импортировать классы Python перед их использованием. Просто напишите это в заголовке этого файла:

from qgis.core import QgsDataSourceURI

В консоли Python QGIS все по-другому, потому что она автоматически загружает классы QGIS при открытии.

Обратите внимание, что если вы еще не импортировали QgsVectorLayerкласс, вы получите похожую ошибку. Вместо добавления новой строки вы можете перечислить классы, которые вы хотите импортировать из qgis.coreбиблиотеки, следующим образом:

from qgis.core import QgsVectorLayer, QgsDataSourceURI
Герман Каррильо
источник
2
Извините за поздний ответ, у меня только была возможность попробовать это, и это работало отлично! Также спасибо за объяснение того, как можно перечислить классы из одной библиотеки, что также было новым для меня. С наилучшими пожеланиями
geogrow
1
В QGIS 3 он переименован в QgsDataSourceUri.
Джей Камминс