Tek başına python komut dosyasında QGIS Processing içe aktarılıyor mu?


10

Qgis'in işleme araç kutusunu kullanan birkaç bağımsız komut dosyası yazmak istiyorum.

Birkaç konu okudum ( burada ve burada , örneğin) ama henüz çalışan bir çözüm bulamadım.

Ubuntu Xenial 16.04 LTS'de Qgis 2.16.1 Kullanımı

Betiğimin içe aktarma bölümü şöyle:

# Python modules
import sys
import time
import os

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

İşlem modülünü içe aktarabilmek için neyin eksik olduğunu bilen var mı?

Basit bir içe aktarma işlemiyle şunu elde ederim:

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 (Joseph'in yorumundan sonra)

Ben böyle denedim:

# 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 *

ama davranış garip: benim komut dosyası hatasız sonuna kadar çalışır ama yerine getirmesi gereken görevler üzerinde "atlamak" gibi görünüyor :-) Başka bir deyişle, sonuna kadar ama hiçbir şey yapmadan çalışır.

Açıklamamın çok net olmadığını itiraf ediyorum ... Daha fazla araştırma yapacağım ama eğer bu modülü içe aktarmak için sihirli bir çözümü (geçici bir çözüm değil) varsa, lütfen!

EDIT 2: tüm betiğimi ekliyor. Biraz uzunsa özür dilerim ....

# -*- 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...")

İkinci bağlantınızda @ GermánCarrillo tarafından sağlanan kodu kullandınız mı? Onun kodu da bağımsız komut dosyaları çalıştırmak için kullandığım şeydir (Windows kullandığımda yollarımı hafifçe düzenlerim).
Joseph

Gerçekleştirmeye çalıştığınız görev nedir? :). Kodu sorunuza ekler misiniz lütfen? Bu, başkalarının neyin yanlış olduğunu belirlemesine yardımcı olabilir.
Joseph

İHA görüntülerini işlemek için birkaç işlev komut dosyası çalıştırmaya çalışıyorum. Yapmam gereken ilk şey yeniden projelendirmek, bu yüzden işlem modülüne ihtiyacım var. Biraz utanmama rağmen tam betiğimi eklememe izin verin: "Gerçek" bir geliştirici değilim ve kodumun şimdiye kadar gördüğünüz en temiz ya da en düz ileri olmadığına eminim :-)
Stéphane Henriod

Utanma! Gönderdiğim hiçbir şey en temiz veya en sade değil =)
Joseph

Bu yüzden tüm senaryomu ekledim. Bir göz
atmaktan

Yanıtlar:


6

Linux QGIS 2.18.1

Bu kodla birlikte, bağımsız komut dosyasından İşleme'yi çalıştırın:

#!/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")

Bu, çalıştığım ortam için çalışan tek kombinasyon (Python 2.7 ile bir Ubuntu 14.04 makinesinde Pycharm C.Ed). Daha önce gis.stackexchange.com/questions/129513/… ve gis.stackexchange.com/questions/176821/… kombinasyonlarını denedim ve ne yazık ki hiçbiri " işleme.core.Processing " ithal etmedi . Neden modül ithal etmenin kafa karıştırıcı olduğunu bilmiyorum. Kayıt için: "işleme" adı verilen ve QGIS'i gölgeleyen saf bir Python paketi var.
Irene

3

Bu yüzden çalışmayı başardım, ipuçlarınız için @Joseph teşekkürler:

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

Ve ben bunu test ediyorum

print Processing.getAlgorithm("qgis:creategrid")

Benim sorunum, sanırım, senaryomun başında modülleri içe aktardığım ve daha sonra bir fonksiyonun içinden Qgi obkectlerini oluşturmaya çalıştığımdan geliyor. Sanırım bunu da yapmak mümkün olurdu ama muhtemelen Python becerilerimde bir kusur var.

Şimdi aslında işleme modülünü ust etmeye çalışacağım :-)


Bir şeyler değişti ? Ben bağımsız bir komut dosyası içine işleme kullanmak için bu kodu (Joseph) denemek ve elde: ImportError: linux QGIS 2.18.1
Juanma Font
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.