การเพิ่มเลเยอร์ PostGIS จากปลั๊กอิน QGIS Python


9

ฉันพยายามพัฒนาปลั๊กอินเพื่อเพิ่มเลเยอร์ postgis ลงใน qgis จากปลั๊กอินซึ่งเป็นส่วนหนึ่งของการเรียนรู้ภาษาไพ ธ อน

รหัสสำหรับการเพิ่มเลเยอร์ postgis ถูกนำมาจากตำราอาหารและทำงานได้ดีถ้าฉันเรียกใช้จากคอนโซล Python ภายใน qgis (หากกดปุ่ม OK ในกล่องโต้ตอบผลลัพธ์ == 1 และควรเพิ่มเลเยอร์ของฉันไปยัง qgis)

แต่ถ้าฉันเรียกใช้จากปลั๊กอินมันจะพ่นข้อความ NameError: ชื่อ 'QgsDataSourceURI' ไม่ได้ถูกกำหนดไว้ เหตุใดฉันจึงได้รับข้อผิดพลาดในการเรียกใช้จากปลั๊กอิน

ฉันจะเพิ่มเลเยอร์จากปลั๊กอิน / ภายในฟังก์ชั่นกับความแตกต่างจากคอนโซลหลามได้หรือไม่

 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 console QGIS แต่ไม่สำเร็จ - "NameError: ชื่อ 'self' ไม่ได้ถูกกำหนด" (. คุณรังเกียจที่จะบอกฉันว่ามีอะไรผิดปกติตัวเองหมายถึงอะไร ดีในงูหลาม) นี่คือรหัสของฉันgis.stackexchange.com/questions/245985/…
Jane

คำตอบ:


9

เพราะคุณต้องนำเข้าคลาส Python ก่อนที่จะใช้ เพียงแค่เขียนสิ่งนี้ในส่วนหัวของไฟล์นั้น:

from qgis.core import QgsDataSourceURI

มันแตกต่างใน QGIS Python Console เพราะโหลดคลาส QGIS โดยอัตโนมัติเมื่อเปิด

โปรดทราบว่าหากคุณยังไม่ได้นำเข้าQgsVectorLayerชั้นเรียนคุณจะได้รับข้อผิดพลาดที่คล้ายกัน แทนที่จะเพิ่มบรรทัดใหม่คุณสามารถแสดงรายการคลาสที่คุณต้องการนำเข้าจากqgis.coreไลบรารีด้วยวิธีนี้:

from qgis.core import QgsVectorLayer, QgsDataSourceURI

2
ขออภัยสำหรับการตอบกลับล่าช้าฉันเพิ่งได้ลองใช้งานและใช้งานได้ดี! นอกจากนี้ขอขอบคุณสำหรับการอธิบายว่ามันเป็นไปได้อย่างไรในการลิสต์คลาสจากไลบรารีหนึ่งไลบรารีซึ่งเป็นสิ่งใหม่สำหรับฉัน ขอแสดงความนับถือ
geogrow

1
ใน QGIS 3 QgsDataSourceUriก็จะเปลี่ยนชื่อเป็น
Jay Cummins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.