QGIS ve ortam değişkenlerini kullanan bağımsız uygulamalar


12

İnsanların bana bu konuda yardımcı olup olamayacağını görmek için IRC'den geçmeye çalıştım, ancak ortam herhangi bir cevabı netleştirmek için biraz beceriksiz görünüyor, bu yüzden bunu deneyeceğim.

ArcPy kullanarak zaten bağımsız uygulamaları programlayabildiğim şekilde PyQGIS kullanarak bağımsız bir uygulama programlamak istiyorum.

PyQGIS'in kendisi açıktır. QGIS konsol düzenleyicisi içinde Python komut dosyalarını çalıştırmakta zorluk çekmedim. Ancak, bağımsız bir komut dosyasında Python bağlarını kullanmak için, bir toplu iş komut dosyası kullanarak ortam ayarlarını değiştirmem gerektiği önerilir (evde Windows Vista kullanıyorum, bu nedenle Windows için toplu komut dosyası konuşuyoruz). Toplu komut dosyasını gerçekten anlamadığım için bu benim tarafımda bir karmaşaya neden oldu ve çalıştırdığım diğer uygulamalar için belirli bir yol olması gereken bir ortamı sıfırladığım fikrinden hoşlanmıyorum.

Neden bu ayarları oluşturmak için talimatlar bu kadar gereksiz karmaşık anlamak ve neden "bağlamaların olduğu yere gidin, bu programın kullanmasını istediğiniz kitaplıkları olun diyen bir kod satırına neden yok anlamak zorlanıyorum ArcPy, insanların bilgisayarın çevre ayarlarıyla uğraşmalarını gerektirmez, bu yüzden PyQGIS'in neden yaptığını anlamakta zorluk çekiyorum. Bana öyle geliyor ki insanlar kendilerine Windows Toplu Komut Dosyası Dili öğretmek yerine vazgeçecekler.

Şimdi, QGIS'in konsol düzenleyicisinde bir komut dosyası çalıştırdığımda çalıştığını fark ettim. Ayrıca, komut dosyası çalıştıktan sonra QGIS'in geri kalanını da kullanılamaz hale getirir, bu nedenle daha sonra tekrar QGIS'i yeniden başlatmam gerekir, ancak komut dosyası tam olarak çalışmayı programladığım şekilde çalışır. Ama bunu QGIS uygulamasının dışında yaptığım zaman yapmaz. Sorun, QGIS uygulaması (qgis.core ve qgis.utils) tarafından otomatik olarak içe aktarılan bazı Python paketini içe aktarmada başarısız olduğum gibi görünmüyor - Diğer tüm paket içe aktarmalarıyla birlikte bağımsız komut dosyamda bu içe aktarma ifadeleri var komut dosyası gerektirir. Bu, farkın QGIS uygulamasının harici ortam değişkenlerini doğru şekilde ayarladığına inanmasına neden oluyor, ancak bağımsız bir komut dosyası olarak çalıştırdığımda bu değişkenler düzgün ayarlanmadı.

Ayrıca, bağımsız bir komut dosyası olarak komut dosyasını çalıştırdığınızda, bir hata atmadan tüm kod üzerinden alır; sadece kod komutlarını yapmaz. Komut dosyasını konsol düzenleyicisinde çalıştırdığımda her şeyi doğru yapıyor. Bağımsız olarak çalıştırdığımda, bir pencere oluşturur, daha sonra hiçbir hata atmadan hemen onu yok eder. Böylece yorumlayıcı senaryodan yapmasını istediğim her şeyi anlar - bunu yapmaz.

İşte senaryo:

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

Lütfen ... Bu komut dosyasını QGIS dışında çalıştırabilmemin ve QGIS içinde olduğu gibi çalışmasını sağlamanın bir yolu var mı (ideal olarak en sonunda işleri kapatmadan)?

QGIS harika bir program ve PyQGIS, ArcPy'nin yaptığı kadar sezgisel görünüyor ve açık kaynaklı bir yazılımın sahip olması için gerçek bir avantaj olacak - ancak insanlar şimdiye kadar yaşadığım tüm çemberlerden geçmek zorunda kalırsa ve hala bağımsız bir uygulamaya sahip değilseniz ArcPy'e erişimi olduğu gibi PyQGIS kütüphanelerine erişim, bana öyle geliyor ki PyQGIS insanlara pek faydası olmayacak. Umarım yanılıyorum ve bu şimdiye kadar olduğundan daha kolay. Herkesin bir çözümü var mı?

Yanıtlar:


6

Qt olay döngüsünü aşağıdakileri kullanarak başlatmanız gerekir:

app.exec_()

QgsApplication.exitQgis () kaldırmak. İdeal olarak uygulamanın lastWindowClosed () sinyaline bağlı bir yuvada ele alınması gerekir.


Bunu bildiğim iyi oldu. Enerjilerimi PyQt4'te okumaya yönlendireceğim, böylece gelecekte çalışacağım GUI'leri yapmak için ne yapmam gerektiğini biliyorum. Script Runner eklenti şöhretinden G.Sherman ... QgsApplication referansları olmadan bu kodu çalıştırmaya çalıştığımda ve def run_script üstbilgisi Script Runner'ın ihtiyaç duyduğu zaman fark ettim, betiğim tam olarak ne yaptığını yaptı Komut dosyasını yukarıda gösterildiği gibi bağımsız bir komut dosyası olarak deniyordum ... bir pencere oluşturup hemen kapatıyorum. Bu, sürekli çevresel değişkenler sorunları yaşadığımı varsaymamın bir parçasıydı.
Zak Klaas

7

PyQGis belgelerine başvurduğunuzda, PyQGis API'sini kullanmanın dört ana yolu olduğunu göreceksiniz:

  1. Python konsolundaki komutlar aracılığıyla
  2. İşleme'deki Python komut dosyaları veya Gary Sherman'ın ScritRunner eklentisi ile
  3. QGis uygulamasına özel eklentiler geliştirerek
  4. QGIS dışında (Python kabuğunda veya Tkinter yerine PyQt4 ile bir uygulama oluşturma (neden Tkinter iki kez içe aktarılsın?)

ve bu son nokta ile ilgileniyorsunuz:

Elbette ArcPy, insanların bilgisayarın çevre ayarlarıyla uğraşmasını gerektirmez, bu yüzden PyQGIS'in neden yaptığını anlamakta zorluk çekiyorum

ArcGIS'in Python sürümünü kullandığınız için, diğer durumlarda aynı doğrudur, arcmap dışında arcpy kullanmaya bakın veya Windows'ta QGIS ile kullanmak için PyScripter'ı yapılandırın (ve hala arcpy kullanın) .

Burada PyQt4, Tkinter veya qgis.gui'ye ihtiyacınız yok:

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()))
  • bir uygulama oluşturabilirsiniz. Burada PyQt4 (Tkinter değil) ve qgis.gui gerekir.

ArcPy kullanarak zaten bağımsız uygulamaları programlayabildiğim şekilde PyQGIS kullanarak bağımsız bir uygulama programlamak istiyorum.

Bu nedenle, örneğin, Tkinter (veya wxPython) öğrenmek zorunda olduğunuz için PyQt4'ü öğrenmelisiniz. Bu başka bir sorundur: gsherman tarafından verilen çözüm, PyQGIS değil, PyQt4 sorunudur ( örneğin PyQt4 eğitimine bakın )


Teşekkürler. Henüz kimsenin PyQt4'ü şu anda oldukça iyi bildiğim Tkinter'e özel bir alternatif olarak tanımladığı bir şey duymadım (neden yukarıdaki kodda iki kez beyan ettiğinden emin değilim ... bu sadece bir hataydı). PyQt4 öğreticisine bağlantınız çok yardımcı olacak gibi görünüyor. Bugün deney sonra ben konsol editörü aracılığıyla sorunumu çözmek ve benim komut dosyasının pencere böylece komut QGIS GUI penceresi minimize sahip seçildi görünen QGIS arka planda çalışan, tek başına olmak - sanırım böylece 1 numaralı 4 olasılıklar listenizde.
Zak Klaas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.