बाहर से QGIS के लिए एक साधारण अजगर स्क्रिप्ट कैसे चलाएं (उदा। पाठ)?


37

मैं QGIS के "बाहर" से QGIS (Mac) के लिए कुछ छोटी और सरल अजगर लिपियों को चलाना चाहूंगा। बाहर से मेरा मतलब है कि इस संदर्भ में, या तो सामान्य ओएस कमांड लाइन (Terminal.app) या इससे भी बेहतर, सीधे सबलेम टेक्स्ट (पाठ-संपादक) से बाहर है, लेकिन निश्चित रूप से इनबिल्ट क्यूजीआईएस पायथन कंसोल के माध्यम से नहीं।

मैंने विभिन्न ट्यूटोरियल जैसे 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()

कृपया मुझे अब जवाब न दें कि कैसे एक प्लगइन या कुछ और "भारी" बनाया जाए। मैं सिर्फ क्विज़ के लिए एक आरामदायक टेक्स्ट-एडिटर से स्क्रिप्ट को शूट करने का एक आसान तरीका ढूंढ रहा हूं।

जवाबों:


32

आपको ifaceयहां ऑब्जेक्ट का संदर्भ नहीं मिल सकता है क्योंकि यह इस संदर्भ में मौजूद नहीं है। iface( QgisInterface) वस्तु प्लगइन्स के लिए एक सुविधा की वस्तु, या उपयोग करने के लिए मुख्य उद्देश्य, नक्शे कैनवास, कथा, संगीतकार जैसे आदि QGIS अंदर चल रहा है, स्क्रिप्ट है, और केवल मौजूद न होने पर मुख्य आवेदन चल रहा है।

जब आप QGIS API का उपयोग करके एक स्टैंडअलोन पायथन स्क्रिप्ट बनाते हैं तो इस सामान में से कोई भी मौजूद नहीं होता है क्योंकि आप अपना स्वयं का मैपिंग एप्लिकेशन बना रहे होते हैं।

तीन अलग-अलग स्थितियां हैं:

  1. एक QGIS प्लगइन
  2. एक स्क्रिप्ट जो ऑटोमेशन के लिए QGIS (प्लगइन नहीं) के अंदर चलती है
  3. क्यूजीआईएस एपीआई का उपयोग करके स्टैंडअलोन ऐप

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.utilsकाम करने के लिए QGIS के अंदर चलाया जाना है । यह स्क्रिप्ट को डालकर PATHऔर import scriptnameपायथन कंसोल में चलाकर या ScriptRunner प्लगइन का उपयोग करके किया जा सकता है ।

निम्नलिखित पर ध्यान दें अभी तक QGIS नहीं है

एक संख्या है 4जिसे अभी तक जोड़ा नहीं गया है, और उम्मीद है कि भविष्य में होगा, और इस कोड को चलाने के लिए कमांडलाइन आर्ग के साथ QGIS को चलाने का विकल्प है।

उदाहरण के लिए:

qgis --code=mycodefile.py

प्लगइन लॉगिंग (संस्करण 1.8)

QGIS लॉग विंडो में जानकारी लॉग करने के लिए आप QgsMessageLog क्लास का उपयोग कर सकते हैं। निचले दाएं कोने में पीला विस्मयबोधक चिह्न।

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 में बदल जाता है। मैंने स्क्रिप्टरनर प्लगइन की भी जाँच की, जो कि आशाजनक है, लेकिन तब मैं क्यूजीआईएस print "debug value"कंसोल को प्राप्त करने में सक्षम नहीं था । क्या आप जानते हैं, किसी भी तरह से, कैसे एक स्क्रिप्ट्रनर स्क्रिप्ट है जो QGIS कंसोल के लिए कुछ प्रिंट कर रहा है? बहुत धन्यवाद! आपके उत्तर की प्रतीक्षा करेंगे और फिर प्रश्न को बंद कर देंगे!
बेनेडिकट ग्रू

अजगर कंसोल वास्तव में उस तरह के आउटपुट के लिए नहीं है, केवल इनपुट के लिए। आप क्या कर सकते हैं QGIS लॉग विंडो में लॉग इन करें। इसे समझाने के लिए जवाब में जोड़ देंगे।
नाथन डब्ल्यू

धन्यवाद! यह बेहद मददगार है। मेरा वर्कअब एक पॉपअप का डिबग आउटपुट के लिए दुरुपयोग करना थाdef info(text): QMessageBox.information(None,"Debug Info", str(text))
बेनेडिकट ग्रो

टाइपो:QgsVector_y_Layer
निक वोलिनकिन

14

मुझे लगता है कि नाथन डब्ल्यू का जवाब पुराना है। मैं निम्न आदेशों का उपयोग करके कमांड लाइन (नाथन के विकल्प 4) से क्यूजीआईएस (संस्करण 2.6) पायथन स्क्रिप्ट चलाने में सक्षम था।

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

यह काम करता है लेकिन केवल "टिप्स" विंडो को बंद करने के बाद ... क्या इंटरफ़ेस को पूरी तरह से अक्षम करने का एक तरीका है और बस --codeअजगर स्क्रिप्ट को निष्पादित करना है ?
एंथनी ओ।

5

नाथन के विकल्प 4 के लिए अपडेट: (विंडोज, QGIS 2.18 लास पालमास)

QGIS सहायता दस्तावेज़ मुद्रित करने के लिए,

छग - तहल

QGIS खोलने के लिए, एक प्रोजेक्ट लोड करें, फिर, एक पायथन स्क्रिप्ट चलाएँ।

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

ये कमांड OSGeo4W शेल पर समस्याओं के बिना चलना चाहिए।


1
मेरा जवाब अभी भी QGIS 3.8 (ज़ांज़ीबार) के लिए मान्य है।
स्वस्तिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.