วิธีการเรียกใช้สคริปต์ python อย่างง่ายสำหรับ QGIS จากภายนอก (เช่น Sublime Text)


37

ฉันต้องการเรียกใช้สคริปต์หลามขนาดเล็กและเรียบง่ายสำหรับ QGIS (Mac) จาก "นอก" ของ QGIS ภายนอกฉันหมายถึงในบริบทนี้ทั้งบรรทัดคำสั่ง os ปกติ (terminal.app) หรือดีกว่าโดยตรงจาก Sublime Text (text-editor) แต่ไม่แน่นอนผ่านคอนโซลงูหลาม QGIS inbuilt

ผมเคยอ่านผ่านช่องทางต่างๆเช่นการกวดวิชาhttp://www.qgis.org/pyqgis-cookbook/intro.html#python-applicationsและผมสามารถที่จะได้รับการอ้างอิงไปยังแอป QGIS แต่น่าเสียดายที่ไม่ได้ไปqgis.utils.ifaceหรือสิ่งอื่นที่ลึก . ตัวอย่างรหัสขนาดเล็กนี้ควรพิมพ์ชื่อของชั้นที่ใช้งานอยู่ ... นี่คือสิ่งที่ฉันมี:

    import sys
    sys.path.append("/Applications/QGIS.app/Contents/Resources/python")

    from qgis.core import *
    import qgis.utils

    print "helo" # console output: helo

    QgsApplication.setPrefixPath("/Applications/QGIS.app/", True)
    QgsApplication.initQgis()

    print QgsApplication # console output: <class 'qgis.core.QgsApplication'>

    print qgis.utils.iface # = console output: none

    aLayer = qgis.utils.iface.activeLayer()
    print aLayer.name()

    QgsApplication.exitQgis()

โปรดอย่าตอบฉันในขณะนี้วิธีการสร้างปลั๊กอินหรืออย่างอื่น "หนัก" ฉันกำลังมองหาวิธีที่ง่ายและรวดเร็วในการถ่ายสคริปต์จากโปรแกรมแก้ไขข้อความที่สะดวกสบายให้กับ QGIS

คำตอบ:


32

คุณไม่สามารถรับการอ้างอิงถึงifaceวัตถุที่นี่เนื่องจากไม่มีอยู่ในบริบทนี้ iface( QgisInterface) วัตถุเป็นวัตถุที่สะดวกสบายสำหรับปลั๊กอินหรือสคริปต์การทำงานภายใน QGIS การเข้าถึงวัตถุหลักเช่นแผนที่ผ้าใบตำนานนักแต่งเพลง ฯลฯ และมีอยู่เพียงเมื่อโปรแกรมหลักคือการทำงาน

เมื่อคุณสร้างสคริปต์ Python แบบสแตนด์อโลนโดยใช้ QGIS API ไม่มีสิ่งนี้อยู่เนื่องจากคุณกำลังสร้างแอปพลิเคชันการทำแผนที่ของคุณเอง

มีสามสถานการณ์ที่แตกต่างกัน:

  1. ปลั๊กอิน QGIS
  2. สคริปต์ที่ทำงานภายใน QGIS (ไม่ใช่ปลั๊กอิน) สำหรับระบบอัตโนมัติ
  3. แอปแบบสแตนด์อโลนที่ใช้ QGIS API

1.และ2.เข้าถึงได้ifaceไฟล์ล่าสุดไม่ได้

สำหรับ3ถ้าคุณต้องการสร้างสคริปต์ที่เปิดเลเยอร์ในพื้นที่วาดแผนที่คุณจะทำเช่นนี้หลังจากนั้นQgsApplication.initQgis()

map = QgsMapCanavs()
layer = QgsVectoryLayer('path.shp','myshapefile','ogr')
map.setLayerSet([layer])

อย่างไรก็ตามหากคุณกำลังมองหาบางอย่างเช่น2นั้นคุณสามารถเขียนสิ่งนี้ในโปรแกรมแก้ไขสคริปต์ของคุณ

from qgis.core import *
from qgis.gui import *
import qgis.utils

qgis.utils.iface.activeLayer()

แต่สิ่งนี้จะต้องถูกเรียกใช้ภายใน QGIS เพื่อqgis.utilsการทำงาน สามารถทำได้โดยการวางสคริปต์PATHและเรียกใช้import scriptnameในคอนโซล Python หรือโดยใช้ปลั๊กอิน ScriptRunner

ทราบว่าต่อไปนี้ยังไม่ได้เป็น QGIS

มีตัวเลข4ที่ยังไม่ได้เพิ่มและหวังว่าจะมีในอนาคตและนั่นคือตัวเลือกในการเรียกใช้ QGIS ด้วย commandline arg เพื่อเรียกใช้รหัสนี้

ตัวอย่างเช่น:

qgis --code=mycodefile.py

การบันทึกปลั๊กอิน (รุ่น 1.8)

คุณสามารถใช้คลาส QgsMessageLog เพื่อบันทึกข้อมูลไปยังหน้าต่างบันทึก QGIS เครื่องหมายอัศเจรีย์สีเหลืองที่มุมขวาล่าง

from qgis.core import *
log = lambda m: QgsMessageLog.logMessage(m,'My Plugin') 
log('My message')

หรือไม่ใช้แลมบ์ดา

QgsMessageLog.logMessage('My message', 'My Plugin')

ฉันชอบแลมบ์ดาเพราะมันสั้นและพิมพ์น้อยลงทุกครั้งที่คุณต้องการบันทึกบางอย่าง


ขอบคุณสำหรับคำชี้แจงและการตอบกลับอย่างรวดเร็ว! 4แล้วฉันรอหมดสำหรับตัวเลือก ในระหว่างนี้ฉันต้องอยู่กับ2มันซึ่งเป็นความเจ็บปวดจริงๆที่ต้องทำตลอดเวลาimport scriptตามด้วยreload(script)และแน่นอนเปลี่ยนจากบรรณาธิการของฉันเป็น QGIS ฉันยังตรวจสอบปลั๊กอิน scriptrunner ซึ่งเป็นสัญญา แต่แล้วฉันก็ไม่สามารถไปprint "debug value"ยังคอนโซล QGIS ได้ คุณรู้ไหมว่ามีวิธีการให้สคริปต์ scriptrunner พิมพ์อะไรบางอย่างไปยังคอนโซล QGIS หรือไม่? ขอบคุณมาก! จะรอคำตอบของคุณแล้วปิดคำถาม!
Benedikt Groß

python console ไม่ได้มีไว้สำหรับเอาต์พุตประเภทนั้นเพียงเพื่อการป้อนข้อมูลเท่านั้น สิ่งที่คุณสามารถทำได้คือเข้าสู่หน้าต่างบันทึก QGIS จะเพิ่มคำตอบเพื่ออธิบายสิ่งนี้
Nathan W

ขอบคุณ! นั่นเป็นประโยชน์อย่างมาก วิธีแก้ปัญหาของฉันคือการละเมิดป๊อปอัพที่จะมีการแก้ปัญหาการส่งออกdef info(text): QMessageBox.information(None,"Debug Info", str(text))
Benedikt Groß

ประเภท:QgsVector_y_Layer
Nick Volynkin

14

ฉันคิดว่าคำตอบของ Nathan W ล้าสมัย ฉันสามารถรันสคริปต์ Python ของ QGIS (เวอร์ชัน 2.6) ได้จากบรรทัดคำสั่ง (ตัวเลือก Nathan 4) โดยใช้คำสั่งต่อไปนี้

man qgis
qgis -nologo --project /path/foo.qgs --code /path/foo.py

มันใช้งานได้ แต่หลังจากที่ฉันปิดหน้าต่าง "เคล็ดลับ" ... มีวิธีการปิดการใช้งานอินเทอร์เฟซทั้งหมดและรัน--codeสคริปต์ python หรือไม่?
Anthony O.

5

อัพเดทสำหรับตัวเลือกของนาธาน 4: (Windows, QGIS 2.18 Las Palmas)

หากต้องการพิมพ์เอกสารช่วยเหลือของ QGIS

qgis - ช่วย

หากต้องการเปิด QGIS ให้โหลดโครงการจากนั้นเรียกใช้สคริปต์ python

qgis --nologo --project c: /path/to/projfile.qgs --code c: /path/to/code.py

คำสั่งเหล่านี้ควรรันบน OSGeo4W Shell โดยไม่มีปัญหา


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