QGIS और पर्यावरण चर का उपयोग करके स्टैंडअलोन अनुप्रयोग


12

मैंने यह देखने के लिए आईआरसी के माध्यम से जाने की कोशिश की है कि क्या लोग मेरी मदद कर सकते हैं, लेकिन माध्यम किसी भी उत्तर को स्पष्ट करने के लिए थोड़ा अनाड़ी लगता है, इसलिए मैं इसके बजाय यह कोशिश करने जा रहा हूं।

मैं PyQGIS का उपयोग करके एक स्टैंडअलोन एप्लिकेशन को प्रोग्राम करना चाहता हूं जिस तरह से मैं पहले से ही ArcPy का उपयोग करके स्टैंडअलोन एप्लिकेशन प्रोग्राम कर सकता हूं।

PyQGIS अपने आप में सीधा है। क्यूजीआईएस कंसोल एडिटर के भीतर पायथन स्क्रिप्ट चलाने में मुझे कोई कठिनाई नहीं हुई। हालांकि, पायथन बाइंडिंग को एक स्टैंडअलोन स्क्रिप्ट में उपयोग करने के लिए, मुझे सलाह दी जाती है कि मुझे बैच स्क्रिप्ट का उपयोग करके पर्यावरण सेटिंग्स को बदलना चाहिए (मैं घर पर विंडोज विस्टा का उपयोग कर रहा हूं, इसलिए हम बैच स्क्रिप्टिंग के लिए विंडोज पर बात कर रहे हैं)। इसके परिणामस्वरूप मेरे अंत में गड़बड़ी हुई है, जैसा कि मैं वास्तव में बैच स्क्रिप्टिंग को नहीं समझता हूं, और मुझे यह विचार पसंद नहीं है कि मैं एक ऐसे वातावरण को रीसेट कर रहा हूं, जिसे मेरे द्वारा चलाए जाने वाले अन्य अनुप्रयोगों के लिए एक निश्चित तरीका होना चाहिए।

मुझे यह समझने में कठिनाई हो रही है कि इन सेटिंग्स को बनाने के लिए निर्देश इतने अनावश्यक रूप से जटिल क्यों हैं, और वे यह कहते हुए कोड की एक पंक्ति तक राशि नहीं देते हैं "जहां बाइंडिंग हैं, उन पुस्तकालयों को बनाएं जिन्हें मैं इस कार्यक्रम के लिए उपयोग करना चाहता हूं। ) निश्चित रूप से आर्कपी को लोगों को कंप्यूटर की पर्यावरण सेटिंग्स के साथ गड़बड़ करने की आवश्यकता नहीं है, इसलिए मुझे यह समझने में कठिनाई हो रही है कि PyGGIS क्यों करता है। मुझे लगता है कि लोग बस खुद को विंडोज बैच स्क्रिप्टिंग भाषा सिखाने के बजाय छोड़ देंगे।

अब, मैंने देखा कि जब मैं QGIS के कंसोल एडिटर में स्क्रिप्ट चलाता हूं, तो यह काम करता है। दी गई, यह स्क्रिप्ट चलाने के बाद बाकी QGIS को भी अनुपयोगी बनाता है, इसलिए मुझे QGIS को फिर से बाद में पुनः आरंभ करना होगा, लेकिन स्क्रिप्ट ठीक उसी तरह काम करती है जैसे मैंने इसे काम करने के लिए प्रोग्राम किया था। लेकिन जब मैं QGIS एप्लिकेशन के बाहर ऐसा करता हूं, तो ऐसा नहीं होता है। यह समस्या प्रतीत नहीं होती है कि मैं QGIS एप्लिकेशन (qgis.core और qgis.utils) द्वारा आयात किए गए कुछ पायथन पैकेज को स्वचालित रूप से आयात करने में विफल रहा हूं - मेरे स्टैंडअलोन स्क्रिप्ट में उन आयात विवरणों के साथ-साथ अन्य सभी पैकेज आयात हैं स्क्रिप्ट की आवश्यकता है। यह मुझे विश्वास दिलाता है कि अंतर यह है कि क्यूजीआईएस एप्लिकेशन बाहरी वातावरण चर को सही ढंग से सेट करता है, लेकिन जब मैं इसे स्टैंडअलोन स्क्रिप्ट के रूप में चलाता हूं तो वे चर ठीक से सेट नहीं होते हैं।

इसके अतिरिक्त, जब मैं स्क्रिप्ट को स्टैंडअलोन स्क्रिप्ट के रूप में चलाता हूं, तो यह बिना किसी त्रुटि के सभी कोड के माध्यम से हो जाता है; यह बस वह नहीं करता है जो कोड कमांड करता है। जब मैं स्क्रिप्ट को कंसोल एडिटर में चलाता हूं, तो यह सब सही तरीके से करता है। जब मैं इसे एक स्टैंडअलोन के रूप में चलाता हूं, तो यह एक खिड़की बनाता है, फिर तुरंत इसे नष्ट कर देता है, जबकि कोई त्रुटि नहीं है। इसलिए इंट्रिप्टर सब कुछ समझता है जो मैं स्क्रिप्ट को करने के लिए कह रहा हूं - यह सिर्फ ऐसा नहीं करेगा।

यहाँ स्क्रिप्ट है:

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 पुस्तकालयों तक पहुंच, मुझे लगता है कि PyQGIS लोगों के लिए बहुत काम का नहीं होगा। मुझे आशा है कि मैं गलत हूं और यह इस प्रकार से आसान है जहां तक ​​यह रहा है। क्या किसी के पास एक समाधान है?

जवाबों:


6

आपको Qt इवेंट लूप का उपयोग शुरू करना होगा:

app.exec_()

मैं QgsApplication.exitQgis () को हटा दूंगा। इसे आदर्श रूप से एक स्लॉट में हैंडल किया जाना चाहिए जो कि एप्लिकेशन के लास्टविंडक्लोस्ड () सिग्नल से जुड़ा हो।


जानकार अच्छा लगा। मैं अपनी ऊर्जाओं को PyQt4 पर पढ़ने के लिए निर्देशित करूंगा, ताकि मैं यह जान सकूं कि भविष्य में काम करने के लिए किसी भी GUI को बनाने के लिए मुझे क्या करने की आवश्यकता है। यदि स्क्रिप्ट रनर प्लगइन के जी। शेरमैन प्रसिद्धि ... मैंने देखा कि जब मैं QgsApplication के संदर्भ के बिना किसी भी इस कोड को चलाने का प्रयास कर रहा था, और def run_script हेडर स्क्रिप्ट रनर की जरूरत है, तो मेरी स्क्रिप्ट ने वही किया जो वह कर रहा था। मैं स्क्रिप्ट की कोशिश कर रहा था जैसा कि एक स्टैंडअलोन स्क्रिप्ट के रूप में ऊपर दिखाया गया है ... एक खिड़की बना रहा है और फिर तुरंत इसे बंद कर रहा है। यह इस बात का हिस्सा था कि मैंने क्यों मान लिया कि मुझे लगातार पर्यावरण चर समस्याएं हो रही हैं।
ज़क कालस

7

PyQGis प्रलेखन से परामर्श करके, आप पाएंगे कि PyQGis API का उपयोग करने के चार मुख्य तरीके हैं:

  1. पायथन कंसोल में कमांड के माध्यम से
  2. प्रसंस्करण में या गैरी शेरमैन के स्क्रीमरनर प्लगइन के साथ पायथन स्क्रिप्ट के माध्यम से
  3. कस्टम प्लगइन्स के विकास के माध्यम से QGis अनुप्रयोग के लिए
  4. QGIS के बाहर (पायथन शेल में या PyQt4 के साथ एक एप्लिकेशन बनाना और टिक्चर नहीं (दो बार आयात क्यों किया गया?)

और आप इस अंतिम बिंदु में रुचि रखते हैं:

  • आप किसी अन्य पायथन मॉड्यूल के रूप में PyQGIS का उपयोग कर सकते हैं। लेकिन पायथन को यह नहीं पता है कि पायक्यूजीस को कहां खोजना है। उसके लिए, आपको PyQGIS फ़ोल्डर को PYTHONPATH में जोड़ना होगा (विंडोज के लिए, विंडोज 7 में pythonpath को कैसे जोड़ना है? ) देखें।

निश्चित रूप से आर्कपी को लोगों को कंप्यूटर की पर्यावरण सेटिंग्स के साथ गड़बड़ करने की आवश्यकता नहीं है, इसलिए मुझे यह समझने में कठिनाई हो रही है कि PyQGIS क्यों करता है

क्योंकि आप अन्य मामलों में आर्कगिस के पायथन संस्करण का उपयोग करते हैं, वही सही है, उदाहरण के लिए, विंडोज पर QGIS (और अभी भी आर्कपीई का उपयोग करें) के साथ उपयोग करने के लिए आर्कपीप के बाहर आर्कफिश या कॉन्फ़िगर कॉन्फ़िगर करें देखें

आपको यहां 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 का वर्णन करते हुए नहीं सुना था, जो कि टिक्टर के लिए एक विशेष विकल्प था, जिसे मैं अब अच्छी तरह से जानता हूं (यकीन नहीं कि मैंने इसे उपरोक्त कोड में दो बार घोषित किया था ... यह सिर्फ एक गलती थी)। PyQt4 ट्यूटोरियल के लिए आपका लिंक ऐसा लगता है कि यह बहुत उपयोगी होगा। आज प्रयोग करने के बाद, मैंने सांत्वना संपादक के माध्यम से अपनी समस्या को हल करने के लिए चुना और स्क्रिप्ट को QGIS GUI की विंडो को कम से कम करने के लिए इसलिए मेरी स्क्रिप्ट की विंडो एक स्टैंडअलोन प्रतीत होती है, पृष्ठभूमि में QGIS चल रहा है - इसलिए मुझे लगता है कि नंबर 1 है 4 संभावनाओं की अपनी सूची में।
ज़क कालस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.