Додавання рівня PostGIS з плагіна QGIS Python


9

Я намагаюся розробити плагін, щоб додати шари postgis до qgis з плагіна як частину навчального пітона.

Код для додавання шару 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")

Я намагаюся використовувати ваш шаблон, щоб додати шар PostGIS в консоль python QGIS, але безуспішно - "NameError: ім'я" self "не визначено" (. Ви не проти сказати, будь ласка, що не так? Що означає "Я" (я не дуже добре в python) Ось мій код gis.stackexchange.com/questions/245985/…
Jane

Відповіді:


9

Тому що вам потрібно імпортувати класи Python перед їх використанням. Просто напишіть це у заголовку цього файлу:

from qgis.core import QgsDataSourceURI

У консолі QGIS Python він відрізняється тим, що він автоматично завантажує класи QGIS під час його відкриття.

Зауважте, що якщо ви ще не імпортували QgsVectorLayerклас, ви отримаєте подібну помилку. Замість додавання нового рядка ви можете перелічити класи, які ви хочете імпортувати з qgis.coreбібліотеки, таким чином:

from qgis.core import QgsVectorLayer, QgsDataSourceURI

2
Вибачте за пізню відповідь, у мене просто була можливість спробувати це, і він спрацював чудово! Також дякую вам за пояснення, як можна перераховувати класи з однієї бібліотеки, що також було для мене новим. З найкращими побажаннями
geogrow

1
У QGIS 3 вона перейменована в QgsDataSourceUri.
Джей Каммінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.