แอปพลิเคชันแบบสแตนด์อโลนที่ใช้ QGIS และตัวแปรสภาพแวดล้อม


12

ฉันได้ลองใช้ IRC เพื่อดูว่าผู้คนสามารถช่วยฉันได้หรือไม่ แต่สื่อดูเหมือนจะเงอะงะเล็กน้อยสำหรับการตอบคำถามที่ชัดเจนดังนั้นฉันจะลองทำแทน

ฉันต้องการตั้งโปรแกรมแอปพลิเคชันแบบสแตนด์อโลนโดยใช้ PyQGIS วิธีที่ฉันสามารถโปรแกรมแอปพลิเคชันแบบสแตนด์อโลนโดยใช้ ArcPy

PyQGIS นั้นตรงไปตรงมา ฉันไม่มีปัญหาในการใช้งานสคริปต์ Python ภายในเอดิเตอร์คอนโซล QGIS อย่างไรก็ตามเพื่อที่จะใช้การผูก Python ในสคริปต์แบบสแตนด์อโลนฉันแนะนำให้ฉันต้องเปลี่ยนการตั้งค่าสภาพแวดล้อมโดยใช้ชุดสคริปต์ (ฉันใช้ Windows Vista ที่บ้านดังนั้นเราจึงกำลังพูดถึงการเขียนสคริปต์ชุดสำหรับ Windows) สิ่งนี้ส่งผลให้เกิดความยุ่งเหยิงในตอนท้ายของฉันเนื่องจากฉันไม่เข้าใจการเขียนสคริปต์แบบชุดและฉันไม่ชอบความคิดที่ว่าฉันกำลังรีเซ็ตสภาพแวดล้อมที่ต้องเป็นวิธีหนึ่งสำหรับแอปพลิเคชันอื่นที่ฉันใช้

ฉันมีปัญหาในการทำความเข้าใจว่าทำไมคำแนะนำในการสร้างการตั้งค่าเหล่านี้จึงมีความซับซ้อนเกินความจำเป็นและเหตุใดพวกเขาจึงไม่ถึงจำนวนหนึ่งบรรทัดของรหัสว่า "ไปยังที่ที่มีการเชื่อมโยงทำให้ไลบรารีที่ฉันต้องการ ) แน่นอนว่า ArcPy ไม่ต้องการให้ผู้คนยุ่งกับการตั้งค่าสภาพแวดล้อมของคอมพิวเตอร์ดังนั้นฉันจึงมีปัญหาในการเข้าใจว่าทำไม PyQGIS ทำเช่นนั้นดูเหมือนว่าฉันจะยอมแพ้แทนที่จะสอนภาษา Windows Batch Script ให้ตัวเอง

ตอนนี้ฉันสังเกตเห็นว่าเมื่อฉันเรียกใช้สคริปต์ในตัวแก้ไขคอนโซลของ QGIS มันทำงานได้ ได้รับมันยังทำให้ส่วนที่เหลือของ QGIS ใช้งานไม่ได้หลังจากที่สคริปต์ทำงานดังนั้นฉันต้องรีสตาร์ท QGIS อีกครั้งหลังจากนั้น แต่สคริปต์ทำงานตรงตามที่ฉันได้ตั้งโปรแกรมให้ทำงาน แต่เมื่อฉันทำนอกเหนือจากแอปพลิเคชัน QGIS มันไม่ได้ ปัญหาดูเหมือนว่าฉันไม่ได้นำเข้าแพคเกจ Python บางอย่างที่นำเข้าโดยอัตโนมัติโดยแอปพลิเคชัน QGIS (qgis.core และ qgis.utils) - ฉันมีคำสั่งการนำเข้าเหล่านั้นในสคริปต์แบบสแตนด์อโลนของฉันพร้อมกับการนำเข้าแพ็คเกจอื่น ๆ สคริปต์ต้องการ สิ่งนี้ทำให้ฉันเชื่อว่าความแตกต่างคือแอปพลิเคชัน QGIS ตั้งค่าตัวแปรสภาพแวดล้อมภายนอกอย่างถูกต้อง แต่ตัวแปรเหล่านั้นไม่ได้ตั้งค่าอย่างถูกต้องเมื่อฉันเรียกใช้เป็นสคริปต์แบบสแตนด์อโลน

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

นี่คือสคริปต์:

from PyQt4 import *
from PyQt4 import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *
from qgis.utils import *
import Tkinter
from Tkinter import *
import sys
import os

qgishome = "c:/OSGeo4W/apps/qgis/"
app = QgsApplication([], True)
QgsApplication.setPrefixPath(qgishome, True)
QgsApplication.initQgis()

canvas = QgsMapCanvas()
canvas.setCanvasColor(Qt.yellow)
canvas.enableAntiAliasing(True)
canvas.show()

layer = QgsVectorLayer(r"c:/GIS Data/fed308/cpc.shp", "Ridings", "ogr")
reg = QgsMapLayerRegistry.instance()
reg.addMapLayer(layer)
canvas.setExtent(layer.extent())
canvas.setLayerSet([QgsMapCanvasLayer(layer)])
QgsApplication.exitQgis()

ได้โปรด ... มีวิธีใดบ้างที่ฉันสามารถเรียกใช้สคริปต์นี้นอก QGIS และใช้งานได้เหมือนใน QGIS (โดยไม่ต้องปิดท้ายที่สุด)

QGIS เป็นโปรแกรมที่ยอดเยี่ยมและ PyQGIS นั้นใช้งานง่ายเหมือน ArcPy และจะเป็นข้อได้เปรียบที่แท้จริงสำหรับซอฟต์แวร์โอเพนซอร์ซที่จะมี - แต่ถ้าผู้คนต้องผ่านทุกห่วงที่ฉันเคยผ่านมาแล้วและยังไม่มีแอปพลิเคชันแบบสแตนด์อโลน การเข้าถึงห้องสมุด PyQGIS ในแบบที่พวกเขามีการเข้าถึง ArcPy ดูเหมือนว่า PyQGIS ของฉันจะไม่ใช้งานกับผู้คนมากนัก ฉันหวังว่าฉันผิดและมันง่ายกว่านี้มาก ไม่มีใครมีทางออกหรือไม่?

คำตอบ:


6

คุณต้องเริ่มวนรอบเหตุการณ์ Qt โดยใช้:

app.exec_()

ฉันจะลบ QgsApplication.exitQgis () ควรจัดการในช่องเสียบที่เชื่อมต่อกับสัญญาณ lastWindowClosed () ของแอปพลิเคชัน


ดีแล้วที่รู้. ฉันจะนำพลังงานของฉันไปอ่านบน PyQt4 ดังนั้นฉันจึงรู้เพิ่มเติมว่าฉันต้องทำอะไรเพื่อสร้าง GUI ที่ฉันพยายามทำในอนาคต ถ้าชื่อเสียงของปลั๊กอิน G. Sherman ของ Script Runner ... ฉันสังเกตเห็นเมื่อฉันพยายามเรียกใช้รหัสนี้โดยไม่มีการอ้างอิงถึง QgsApplication ใด ๆ และด้วยความต้องการส่วนหัวของ run run script script Runner สคริปต์ของฉันก็ทำในสิ่งที่มันทำเมื่อ ฉันลองใช้สคริปต์ตามที่แสดงด้านบนเป็นสคริปต์แบบสแตนด์อโลน ... กำลังสร้างหน้าต่างจากนั้นปิดทันที นี่เป็นส่วนหนึ่งของสาเหตุที่ฉันคิดว่าฉันกำลังประสบปัญหาตัวแปรด้านสิ่งแวดล้อม
Zak Klaas

7

ให้คำปรึกษากับเอกสาร PyQGis คุณจะพบว่ามีวิธีหลัก ๆ สี่วิธีในการใช้ PyQGis API:

  1. ผ่านคำสั่งในคอนโซล Python
  2. ผ่านสคริปต์ Python ในการประมวลผลหรือด้วยปลั๊กอินScritRunnerของ Gary Sherman
  3. ผ่านการพัฒนาปลั๊กอินที่กำหนดเองไปยังแอปพลิเคชัน QGis
  4. นอก QGIS (ใน Python shell หรือสร้างแอปพลิเคชั่นด้วย PyQt4 ไม่ใช่ Tkinter (ทำไมนำเข้า Tkinter สองครั้ง)

และคุณมีความสนใจในจุดสุดท้ายนี้:

  • คุณสามารถใช้ PyQGIS เป็นโมดูล Python อื่น ๆ แต่หลามไม่ทราบว่าจะหา PyQGIS ได้ที่ไหน เพื่อที่คุณจะต้องเพิ่มโฟลเดอร์ PyQGIS ใน PYTHONPATH (สำหรับ Windows ดูที่วิธีเพิ่มไปยัง pythonpath ใน windows 7? )

แน่นอนว่า ArcPy ไม่ต้องการให้ผู้คนยุ่งกับการตั้งค่าสภาพแวดล้อมของคอมพิวเตอร์ดังนั้นฉันจึงมีปัญหาในการทำความเข้าใจว่าทำไม PyQGIS ถึงทำ

เพราะคุณใช้รุ่นหลามของ ArcGIS ในกรณีอื่น ๆ เดียวกันเป็นจริงดูใช้ arcmap นอก arcpyหรือกำหนดค่า PyScripter ที่จะใช้กับ QGIS (และยังคงใช้ arcpy) บน Windowsเช่น

คุณไม่ต้องการที่นี่ PyQt4, Tkinter หรือ qgis.gui:

from qgis.core import *
QgsApplication.setPrefixPath("yourpath", True)
QgsApplication.initQgis()
# or your solution
# read a shapefile 
layer = QgsVectorLayer('your.shp', 'your', 'ogr')
layer.isValid()
True
# loop through layer 
for elem in layer.getFeatures():
    geom= elem.geometry()
    attr =elem.attributes()
    (processing)

 # interaction with other Python module: Shapely, for example
 from shapely.geometry import shape
 from json import loads
 for elem in layer.getFeatures():
       shapely_geometry = shape(loads(elem.geometry().exportToGeoJSON()))
  • คุณสามารถสร้างแอปพลิเคชัน คุณต้องการ PyQt4 ที่นี่ (ไม่ใช่ Tkinter) และ qgis.gui

ฉันต้องการตั้งโปรแกรมแอปพลิเคชันแบบสแตนด์อโลนโดยใช้ PyQGIS วิธีที่ฉันสามารถโปรแกรมแอปพลิเคชันแบบสแตนด์อโลนโดยใช้ ArcPy

ดังนั้นเพื่อให้คุณต้องเรียนรู้ PyQt4 เช่นคุณต้องเรียนรู้ Tkinter (หรือ wxPython) นี่คือปัญหาอื่น: วิธีแก้ปัญหาที่ได้รับจาก gsherman เป็นปัญหาของ PyQt4 ไม่ใช่ของ PyQGIS (ดูที่การสอน PyQt4เป็นต้น)


ขอบคุณ ฉันยังไม่เคยได้ยินใครบอก PyQt4 ว่าเป็นทางเลือกพิเศษของ Tkinter ซึ่งตอนนี้ฉันรู้แล้วค่อนข้างดี (ไม่แน่ใจว่าทำไมฉันถึงประกาศสองครั้งในรหัสด้านบน ... นั่นเป็นเพียงความผิดพลาด) ลิงก์ของคุณไปยังบทช่วยสอน PyQt4 ดูเหมือนจะมีประโยชน์มาก หลังจากการทดลองในวันนี้ฉันเลือกที่จะแก้ปัญหาของฉันด้วยเครื่องมือแก้ไขคอนโซลและให้สคริปต์ย่อหน้าต่าง QGIS GUI ให้เล็กที่สุดหน้าต่างของสคริปต์ของฉันดูเหมือนจะเป็นแบบสแตนด์อโลนโดยที่ QGIS ทำงานในพื้นหลัง - ดังนั้นฉันจึงเดาว่าหมายเลขนั้น ในรายการความเป็นไปได้ 4 รายการของคุณ
Zak Klaas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.