स्टैंड-अलोन अजगर लिपि में QGIS प्रोसेसिंग का आयात?


10

मैं कुछ स्टैंड-अलोन स्क्रिप्ट लिखना चाहता हूं जो Qgis के प्रोसेसिंग टूलबॉक्स का उपयोग करती हैं।

मैंने कुछ सूत्र पढ़े हैं ( यहाँ और यहाँ , उदाहरण के लिए), लेकिन अभी तक कोई समाधान नहीं मिल सका है।

Ubuntu Xenial 16.04 LTS पर Qgis 2.16.1 का उपयोग करना

मेरी स्क्रिप्ट का आयात अनुभाग इस तरह दिखता है:

# Python modules
import sys
import time
import os

# Qgis modules
from qgis.core import *
import qgis.utils
from PyQt4.QtCore import QFileInfo, QSettings

किसी को पता है कि प्रसंस्करण मॉड्यूल आयात करने में सक्षम होने के लिए मुझे क्या याद आ रही है?

एक साधारण आयात प्रसंस्करण के साथ , मुझे यह मिलता है:

Original exception was:
Traceback (most recent call last):
 File "/home/steph/Documents/Projets/20141227-CIM_Bishkek/Scripts/python/00-projets/20160811-AnalysesUAVs/20160811-UAVAnalyse.py", line 36, in <module>
import processing
 File "/usr/lib/python2.7/dist-packages/qgis/utils.py", line 607, in _import
mod = _builtin_import(name, globals, locals, fromlist, level)
ImportError: No module named processing

EDIT (जोसेफ की टिप्पणी के बाद)

मैंने इस तरह की कोशिश की है:

# Python modules
import sys
import time
import os

# Qgis modules
from qgis.core import *
import qgis.utils
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()
from PyQt4.QtCore import QFileInfo, QSettings
#from PyQt4.QtGui import *

# Prepare processing framework 
sys.path.append('/home/steph/.qgis2/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

लेकिन व्यवहार अजीब है: मेरी स्क्रिप्ट त्रुटि के बिना अंत तक चलती है, लेकिन उन कार्यों पर "कूद" लगती है जो इसे प्रदर्शन करने वाले हैं :-) दूसरे शब्दों में, यह अंत तक चलता है लेकिन बिना कुछ किए।

मैं स्वीकार करता हूं कि मेरी व्याख्या बहुत स्पष्ट नहीं है ... मैं आगे की जांच करूंगा लेकिन अगर किसी के पास इस मॉड्यूल को आयात करने के लिए जादुई समाधान (वर्कअराउंड नहीं) है, तो कृपया!

EDIT 2: मेरी पूरी स्क्रिप्ट को जोड़ना। क्षमा करें यदि यह थोड़ा लंबा है ...।

# -*- coding: cp1252 -*-
########################################################
## Name: Performs various analyses on UAV imagery using Qgis
## Source Name: UAVanalyse.py
## Version: Python 2.7
## Author: Stephane Henriod
## Usage: Performs a set of analyses on UAV imagery
## Date 11.08.2016
## Modified: 
########################################################


# Import required modules

# Python modules
import sys
import time
import os

# Qgis modules
from qgis.core import *
import qgis.utils
from PyQt4.QtCore import QFileInfo, QSettings

# Custom modules
from config_work import *
import display_msg as disp
import clean_time as cl

def make_raster_layer(raster, log_file):
    """Creates a raster layer from the path to a raster, if the path exists and if the raster is valid

    Param_in:
        raster (string) -- The path to the raster to be transformed into a layer
        log_file (string) -- The path to the log file to write in

    Param_out:
        list: 
            [0] = full path to the raster 
            [1] = raster layer

    """

    if os.path.exists(raster):
        fileName = raster
        fileInfo = QFileInfo(fileName)
        baseName = fileInfo.baseName()
        rlayer = QgsRasterLayer(fileName, baseName)
        if rlayer.isValid():
            return [raster, rlayer]
    else:
        return False

def study_raster(rlayer, log_file):
    """Returns properties of a raster, if this one exists and is valid

    Param_in:
        rlayer (bin) -- A raster layer
        log_file (string) -- The path to the log file to write in

    """

    infos = {}

    if rlayer:
        infos['a - Width'] = rlayer.width()
        infos['b - Height'] = rlayer.height()
        infos['c - Extent'] = rlayer.extent().toString()
        infos['d - # bands'] = rlayer.bandCount()
        infos['e - X resolution'] = rlayer.rasterUnitsPerPixelX()
        infos['f - Y resolution'] = rlayer.rasterUnitsPerPixelY()
        return infos
    else:
        return False


def project_raster(raster, to_crs, log_file):
    """Projects a raster into another crs

    Param_in:
        raster (string) -- The path to the raster to be transformed into a layer
        to_crs (string) -- The coordinate reference system to which the layer must be projected
        log_file (string) -- The path to the log file to write in

    """

    img_out_name = os.path.splitext(os.path.basename(raster))[0] + '_proj' + os.path.splitext(os.path.basename(raster))[1]
    img_out = os.path.join(output_folder, img_out_name)
    #processing.runalg("gdalwarp -overwrite -s_srs EPSG:32642 -t_srs " + to_crs + " " + rlayer[0] + " " + img_out)

    msg = img_out    
    disp.display_msg(log_file, msg, 'a')

    return img_out_name

if __name__ == "__main__":
    t_start_script = time.localtime()
    t_start_script_clean = time.strftime("%Y%m%d-%H%M", t_start_script)

    # Checking the folders
    if not os.path.exists(input_folder_path):
        os.makedirs(input_folder_path)
    if not os.path.exists(temp_folder_path):
        os.makedirs(temp_folder_path)
    if not os.path.exists(output_folder_path):
        os.makedirs(output_folder_path)

    # Creating the output and temp folders
    output_folder = os.path.join(output_folder_path, t_start_script_clean + '-UAVanalyse')
    temp_folder = os.path.join(temp_folder_path, t_start_script_clean + '-UAVanalyse')

    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    if not os.path.exists(temp_folder):
        os.makedirs(temp_folder)

    # Creating the log file
    log_file_name = t_start_script_clean + '-UAVanalyse.log'
    log_file = os.path.join(output_folder, log_file_name)

    # Heading of the log file
    msg = "Performs a set of analyses on UAV imagery" + os.linesep
    msg += "Input folder: " + input_folder_path
    msg += "\n RGB image: " + img_rgb_name
    msg += "\n NIR image: " + img_nir_name
    msg += "\n RGBIR image: " + img_rgbir_name
    msg += "\n DSM file: " + img_dsm_name
    disp.display_msg(log_file, msg, 'w')

    #msg = "Script started on " + cl.clean_time(t_start_script)
    #disp.display_msg(log_file, msg, 'a')


    # Initialize Qgis (source: http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/intro.html)
    msg = 'Initialize Qgis'
    disp.display_msg(log_file, msg, 'a')
    # supply path to qgis install location
    QgsApplication.setPrefixPath("/usr", True)

    # create a reference to the QgsApplication, setting the
    # second argument to False disables the GUI
    qgs = QgsApplication([], False)

    # load providers
    qgs.initQgis()


    # Write your code here to load some layers, use processing algorithms, etc.

    # Make raster layers
    rlayer_rgb = make_raster_layer(img_rgb, log_file)
    rlayer_nir = make_raster_layer(img_nir, log_file)
    rlayer_rgbir = make_raster_layer(img_rgbir, log_file)
    rlayer_dsm = make_raster_layer(img_dsm, log_file)

    all_valid_layers = []
    if rlayer_rgb: all_valid_layers.append(rlayer_rgb)
    if rlayer_nir: all_valid_layers.append(rlayer_nir)
    if rlayer_rgbir: all_valid_layers.append(rlayer_rgbir)
    if rlayer_dsm: all_valid_layers.append(rlayer_dsm)




    # (I) Infos about the layers
    msg = os.linesep + frm_separator + os.linesep + '(I) Infos about the layers' + os.linesep + frm_separator + os.linesep
    disp.display_msg(log_file, msg, 'a')

    i = 1
    for layer in all_valid_layers:
        infos = study_raster(layer[1], log_file)
        msg = '\n (' + str(i) + ') ' + layer[0] + os.linesep
        for item in sorted(infos):
            msg += '\n ' + str(item) + ': ' + str(infos[item]) + os.linesep

        i+=1
        disp.display_msg(log_file, msg, 'a')

    msg = 'List of valid layers:' + os.linesep
    for layer in all_valid_layers:
        msg += layer[0]+ os.linesep
    disp.display_msg(log_file, msg, 'a')


    # (II) Projects the layers into the national coordinate system or any desired system
    msg = os.linesep + frm_separator + os.linesep + '(II) Projecting of the layers' + os.linesep + frm_separator + os.linesep
    disp.display_msg(log_file, msg, 'a')

    i = 1
    for layer in all_valid_layers:
        project_raster(layer[0], to_crs, log_file)




    # When script is complete, call exitQgis() to remove the provider and
    # layer registries from memory
    qgs.exitQgis()
    msg = 'Qgis has been closed'
    disp.display_msg(log_file, msg, 'a')

    #raw_input("Press Enter to continue...")

अपने दूसरे लिंक में, क्या आपने @ GermánCarrillo द्वारा प्रदान किया गया कोड इस्तेमाल किया है? उसका कोड वह है जो मैं स्टैंडअलोन स्क्रिप्ट चलाने के लिए भी उपयोग करता हूं (मैं अपने पथों को थोड़ा संपादित करता हूं जैसे मैं विंडोज का उपयोग करता हूं)।
जोसेफ

आप किस कार्य को करने की कोशिश कर रहे हैं? :)। क्या आप कृपया अपने प्रश्न में कोड शामिल कर सकते हैं? यह दूसरों को पहचानने में मदद कर सकता है कि क्या गलत है।
जोसेफ

मैं यूएवी छवियों को संसाधित करने के लिए कुछ कार्यों को स्क्रिप्ट करने की कोशिश कर रहा हूं। पहली चीज जो मुझे करने की ज़रूरत है, वह है reproject, यही कारण है कि मुझे प्रसंस्करण मॉड्यूल की आवश्यकता है। मुझे अपनी पूरी स्क्रिप्ट जोड़ने दें, हालांकि मैं थोड़ा शर्मिंदा हूं: मैं "वास्तविक" डेवलपर नहीं हूं और मुझे यकीन है कि मेरा कोड सबसे साफ या सबसे सीधा नहीं है जिसे आपने कभी देखा है :-)
स्टीफन हेनरिड

शर्म नहीं आती! कुछ भी नहीं मैं सबसे साफ या सीधे-आगे =) पोस्ट कर रहा हूं
जोसेफ

इसलिए मैंने अपनी पूरी स्क्रिप्ट जोड़ी। एक नि: शुल्क लग रहा है :-)
स्टीफन हेनरिड

जवाबों:


6

लिनक्स QGIS 2.18.1

इस कोड के साथ यह मिल गया, स्टैंडअलोन स्क्रिप्ट से प्रसंस्करण चलाएँ:

#!/usr/bin/env python
import qgis
from qgis.core import *
import sys

app = QgsApplication([],True, None)
app.setPrefixPath("/usr", True)
app.initQgis()
sys.path.append('/usr/share/qgis/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

print Processing.getAlgorithm("qgis:creategrid")

यह एकमात्र संयोजन है जो उस वातावरण के लिए काम करता है जिसमें मैं काम कर रहा हूं (पायथर्म C.Ed पर Ubuntu 14.04 मशीन पायथन 2.7 के साथ)। इससे पहले, मैंने gis.stackexchange.com/questions/129513/… , और gis.stackexchange.com/questions/176821/… के संयोजन आज़माए और दुख की बात यह है कि उनमें से कोई भी "प्रसंस्करण .कोरसिंग " आयात नहीं किया। मैं नहीं जानता कि एक मॉड्यूल का आयात करना क्यों भ्रामक है। रिकॉर्ड के लिए: एक शुद्ध पायथन पैकेज है जिसे "प्रसंस्करण" भी कहा जाता है जो QGIS को छाया देता है।
इरीन

3

इसलिए मैं इसे पाने में कामयाब रहा, धन्यवाद @Joseph आपके संकेत के लिए:

# Import required modules

# Python modules
import sys
import time
import datetime
import os
from getpass import getuser

# Qgis modules and environment
from qgis.core import *
import qgis.utils
from PyQt4.QtCore import QFileInfo, QSettings

from PyQt4.QtGui import QApplication
app = QApplication([])

QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()

# Prepare processing framework
sys.path.append('/home/' + getuser() + '/.qgis2/python/plugins')
from processing.core.Processing import Processing

Processing.initialize()

और मैं इसके साथ कौड टेस्ट करता हूं

print Processing.getAlgorithm("qgis:creategrid")

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

अब मैं वास्तव में प्रसंस्करण मॉड्यूल ust की कोशिश करेंगे :-)


कुछ बदल गया है ? मैं (यूसुफ से) इस कोड की कोशिश एक स्टैंडअलोन स्क्रिप्ट में प्रसंस्करण का उपयोग करने और मैं: ImportError: नहीं मॉड्यूल लिनक्स का उपयोग processing.core.Processing नामित 2.18.1 QGIS
Juanma फ़ॉन्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.