Thêm lớp PostGIS từ plugin QGIS Python


9

Tôi cố gắng phát triển một plugin để thêm các lớp postgis vào qgis từ một plugin như là một phần của việc học python.

Mã để thêm một lớp postgis được lấy từ sách dạy nấu ăn và hoạt động tốt nếu tôi chạy nó từ bảng điều khiển python trong qgis (Nếu nút OK được nhấn trong hộp thoại result == 1 và nên thêm lớp của tôi vào qgis).

Nhưng nếu tôi chạy nó từ plugin của mình, nó sẽ ném thông báo NameError: tên 'QssDataSourceURI' không được xác định. Tại sao tôi gặp lỗi đó khi chạy nó từ plugin?

Có sự khác biệt nào khi tôi thêm một lớp từ plugin / bên trong hàm so với bảng điều khiển python không?

 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")

Tôi đang cố gắng sử dụng mẫu của bạn để thêm lớp PostGIS trong bảng điều khiển python QGIS nhưng không thành công - "NameError: tên 'tự' không được xác định" (Bạn có phiền khi nói với tôi xin lỗi không? Ý tôi là gì giỏi về trăn). Đây là mã của tôi gis.stackexchange.com/questions/245985/ mẹo
Jane

Câu trả lời:


9

Bởi vì bạn cần nhập các lớp Python trước khi sử dụng chúng. Chỉ cần viết điều này trong tiêu đề của tập tin đó:

from qgis.core import QgsDataSourceURI

Nó khác với Bảng điều khiển Python của QGIS vì nó tự động tải các lớp QGIS khi nó được mở.

Lưu ý rằng nếu bạn chưa nhập QgsVectorLayerlớp, bạn sẽ gặp một lỗi tương tự. Thay vì thêm một dòng mới, bạn có thể liệt kê các lớp bạn muốn nhập từ qgis.corethư viện, theo cách này:

from qgis.core import QgsVectorLayer, QgsDataSourceURI

2
Xin lỗi vì đã trả lời trễ, tôi chỉ có cơ hội dùng thử và nó hoạt động rất tốt! Cũng cảm ơn bạn đã giải thích làm thế nào có thể liệt kê các lớp từ một thư viện, đó cũng là điều mới đối với tôi. Trân trọng
geogrow

1
Trong QGIS 3, nó được đổi tên thành QgsDataSourceUri.
Jay Cummins
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.