Aplikasi mandiri menggunakan QGIS dan variabel lingkungan

12

Saya sudah mencoba melalui IRC untuk melihat apakah orang-orang dapat membantu saya dengan ini, tetapi media tampaknya agak canggung untuk membuat jawaban yang jelas, jadi saya akan coba ini.

Saya ingin memprogram aplikasi mandiri menggunakan PyQGIS seperti saya sudah bisa memprogram aplikasi mandiri menggunakan ArcPy.

PyQGIS sendiri sangat mudah. Saya tidak kesulitan menggunakan menjalankan skrip Python di dalam editor konsol QGIS. Namun, untuk menggunakan binding Python dalam skrip mandiri, saya disarankan untuk mengubah pengaturan lingkungan menggunakan skrip batch (saya menggunakan Windows Vista di rumah, jadi kami berbicara skrip batch untuk Windows). Ini telah mengakibatkan kekacauan pada saya, karena saya tidak benar-benar memahami skrip batch, dan saya tidak suka gagasan bahwa saya mengatur ulang lingkungan yang perlu menjadi cara tertentu untuk aplikasi lain yang saya jalankan.

Saya mengalami kesulitan memahami mengapa instruksi untuk membuat pengaturan ini sangat tidak perlu rumit, dan mengapa mereka tidak berjumlah satu baris kode yang mengatakan "pergi ke tempat binding, buat perpustakaan yang saya inginkan tersedia untuk digunakan oleh program ini untuk digunakan oleh program ini Tentu saja ArcPy tidak mengharuskan orang untuk main-main dengan pengaturan lingkungan komputer, jadi saya mengalami kesulitan memahami mengapa PyQGIS melakukannya. Tampaknya bagi saya orang-orang hanya akan menyerah daripada mengajari diri mereka sendiri Windows Batch Scripting Language.

Sekarang, saya perhatikan bahwa ketika saya menjalankan skrip di editor konsol QGIS, itu berfungsi. Memang, itu juga membuat sisa QGIS tidak dapat digunakan setelah skrip berjalan, jadi saya harus me-restart QGIS lagi setelahnya, tetapi skrip bekerja persis seperti saya memprogramnya agar berfungsi. Tetapi ketika saya melakukannya di luar aplikasi QGIS, itu tidak. Masalahnya tampaknya bukan karena saya gagal mengimpor beberapa paket Python yang secara otomatis diimpor oleh aplikasi QGIS (qgis.core dan qgis.utils) - Saya memiliki pernyataan impor dalam skrip mandiri, bersama dengan semua paket lainnya yang mengimpor script membutuhkan. Ini membuat saya percaya bahwa perbedaannya adalah bahwa aplikasi QGIS dengan benar menetapkan variabel lingkungan eksternal, tetapi variabel-variabel itu tidak diatur dengan benar ketika saya menjalankannya sebagai skrip mandiri.

Selain itu, ketika saya menjalankan skrip sebagai skrip mandiri, skrip tersebut dapat melewati semua kode tanpa membuat kesalahan; itu hanya tidak melakukan apa yang diperintahkan kode. Ketika saya menjalankan skrip di editor konsol, semuanya berjalan dengan benar. Ketika saya menjalankannya sebagai standalone, ia menciptakan sebuah jendela, lalu segera menghancurkannya, sambil tidak membuang kesalahan. Jadi intepreter mengerti semua yang saya minta skrip lakukan - itu tidak akan melakukannya.

Ini skripnya:

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

Tolong ... adakah beberapa cara saya dapat menjalankan skrip ini di luar QGIS dan membuatnya berfungsi seperti halnya di dalam QGIS (idealnya tanpa menutup semuanya pada akhirnya)?

QGIS adalah program yang luar biasa, dan PyQGIS tampaknya seintuitif ArcPy dan akan menjadi keuntungan nyata bagi perangkat lunak open source untuk dimiliki - tetapi jika orang harus melalui semua simpang yang telah saya lalui, dan masih belum memiliki aplikasi mandiri. akses ke perpustakaan PyQGIS sebagaimana mereka memiliki akses ke ArcPy, menurut saya PyQGIS tidak akan banyak berguna bagi orang-orang. Saya harap saya salah dan ini lebih mudah daripada sejauh ini. Adakah yang punya solusi?

Zak Klaas
sumber

Jawaban:

6

Anda harus memulai loop acara Qt menggunakan:

app.exec_()

Saya akan menghapus QgsApplication.exitQgis (). Idealnya harus ditangani dalam slot yang terhubung ke sinyal lastWindowClosed () dari aplikasi.

tuan
sumber
Senang mendengarnya. Saya akan mengarahkan energi saya untuk membaca di PyQt4 jadi saya tahu lebih banyak apa yang harus saya lakukan untuk membuat GUI yang saya coba di masa depan. Jika G. Sherman dari plugin Script Runner terkenal ... saya perhatikan ketika saya mencoba untuk menjalankan kode ini tanpa referensi ke QgsApplication, dan dengan header def run_script yang dibutuhkan Script Runner, skrip saya melakukan persis apa yang dilakukan ketika Saya sedang mencoba skrip seperti yang ditunjukkan di atas sebagai skrip mandiri ... membuat jendela dan kemudian segera menutupnya. Ini adalah bagian dari mengapa saya berasumsi saya mengalami masalah variabel lingkungan yang berkelanjutan.
Zak Klaas
7

Berkonsultasi dengan dokumentasi PyQGis, Anda akan menemukan bahwa ada empat cara utama untuk memanfaatkan API PyQGis:

  1. melalui perintah di konsol Python
  2. melalui skrip Python dalam Memproses atau dengan plugin ScritRunner dari Gary Sherman
  3. melalui pengembangan plugin khusus ke aplikasi QGis
  4. di luar QGIS (di shell Python atau membuat aplikasi dengan PyQt4 dan bukan Tkinter (mengapa mengimpor Tkinter dua kali?)

dan Anda tertarik pada poin terakhir ini:

  • Anda dapat menggunakan PyQGIS seperti modul Python lainnya. Tapi Python tidak tahu di mana menemukan PyQGIS. Untuk itu, Anda perlu menambahkan folder PyQGIS ke PYTHONPATH (untuk Windows, lihat Cara menambahkan ke pythonpath di windows 7? ).

Tentu saja ArcPy tidak mengharuskan orang untuk mengutak-atik pengaturan lingkungan komputer, jadi saya mengalami kesulitan memahami mengapa PyQGIS melakukannya

Karena Anda menggunakan versi Python ArcGIS, dalam kasus lain, hal yang sama juga berlaku, lihat menggunakan arcpy di luar arcmap atau Konfigurasikan PyScripter untuk digunakan dengan QGIS (dan masih menggunakan arcpy) di Windows , misalnya.

Anda tidak perlu di sini PyQt4, Tkinter atau 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()))
  • Anda dapat membuat aplikasi. Anda perlu di sini PyQt4 (dan bukan Tkinter) dan qgis.gui.

Saya ingin memprogram aplikasi mandiri menggunakan PyQGIS seperti saya sudah bisa memprogram aplikasi mandiri menggunakan ArcPy.

Jadi, untuk itu, Anda harus belajar PyQt4, karena Anda harus belajar Tkinter (atau wxPython), misalnya. Ini adalah masalah lain: solusi yang diberikan oleh gsherman adalah masalah PyQt4, bukan PyQGIS (lihat tutorial PyQt4 , misalnya)

gen
sumber
Terima kasih. Saya belum pernah mendengar orang menggambarkan PyQt4 sebagai sesuatu yang merupakan alternatif eksklusif untuk Tkinter, yang saya kenal dengan baik sekarang (tidak yakin mengapa saya mendeklarasikannya dua kali dalam kode di atas ... itu hanya kesalahan). Tautan Anda ke tutorial PyQt4 sepertinya akan sangat membantu. Setelah bereksperimen hari ini, saya memilih untuk menyelesaikan masalah saya melalui editor konsol dan membuat skrip meminimalkan jendela GUI QGIS sehingga jendela skrip saya tampak mandiri, dengan QGIS berjalan di latar belakang - jadi saya rasa itu nomor 1 dalam daftar 4 kemungkinan Anda.
Zak Klaas