Nhập khẩu xử lý QGIS trong tập lệnh python độc lập?


10

Tôi muốn viết một vài tập lệnh độc lập sử dụng hộp công cụ xử lý của Qgis.

Tôi đã đọc một vài chủ đề ( ở đâyở đây , ví dụ) nhưng chưa thể tìm ra giải pháp hiệu quả.

Sử dụng Qgis 2.16.1 trên Ubuntu Xenial 16.04 LTS

Phần nhập khẩu của tập lệnh của tôi trông như thế này:

# Python modules
import sys
import time
import os

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

Có ai biết tôi còn thiếu gì để có thể nhập mô-đun xử lý không?

Với một quy trình nhập đơn giản , tôi nhận được điều này:

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 (sau bình luận của Joseph)

Tôi đã thử như thế này:

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

nhưng hành vi thật kỳ lạ: kịch bản của tôi chạy cho đến hết mà không có lỗi nhưng dường như "nhảy" qua các nhiệm vụ mà nó phải thực hiện :-) Nói cách khác, nó chạy cho đến hết nhưng không làm gì cả.

Tôi thừa nhận rằng lời giải thích của tôi không rõ ràng lắm ... Tôi sẽ điều tra thêm nhưng nếu có ai có giải pháp kỳ diệu (không phải cách giải quyết) để nhập mô-đun này, thì làm ơn!

EDIT 2: thêm toàn bộ kịch bản của tôi. Xin lỗi nếu nó hơi dài ....

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

Trong liên kết thứ hai của bạn, bạn có sử dụng mã được cung cấp bởi @ GermánCarrillo không? Mã của anh ấy là những gì tôi cũng sử dụng để chạy các tập lệnh độc lập (tôi chỉnh sửa đường dẫn của mình một chút khi tôi sử dụng Windows).
Joseph

Nhiệm vụ bạn đang cố gắng thực hiện là gì? :). Bạn có thể bao gồm mã trong câu hỏi của bạn xin vui lòng? Điều này có thể giúp người khác xác định những gì sai.
Joseph

Tôi đang cố gắng để kịch bản một vài chức năng để xử lý hình ảnh UAV. Điều đầu tiên tôi cần làm là từ chối, đó là lý do tại sao tôi cần mô-đun xử lý. Hãy để tôi thêm tập lệnh đầy đủ của mình, mặc dù tôi hơi xấu hổ: Tôi không phải là nhà phát triển "thực sự" và tôi chắc chắn rằng mã của tôi không phải là sạch nhất hoặc đơn giản nhất bạn từng thấy :-)
Stéphane Henriod

Đừng xấu hổ! Không có gì tôi đăng là sạch nhất hoặc đơn giản nhất =)
Joseph

Vì vậy, tôi đã thêm toàn bộ kịch bản của tôi. Hãy xem :-)
Stéphane Henriod

Câu trả lời:


6

Linux QGIS 2.18.1

Với mã này đã có nó, chạy Xử lý từ tập lệnh độc lập:

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

Đây là sự kết hợp duy nhất hoạt động cho môi trường tôi đang làm việc (Pycharm C.Ed trên máy Ubuntu 14.04 với Python 2.7). Trước đây, tôi đã thử các kết hợp của gis.stackexchange.com/questions/129513/ , và gis.stackexchange.com/questions/176821/ , và thật đáng buồn, không ai trong số họ đã nhập " process.core.Processing ". Tôi không biết tại sao nhập một mô-đun là khó hiểu. Đối với bản ghi: có một gói Python thuần túy còn được gọi là "xử lý" làm mờ cái gói QGIS.
Irene

3

Vì vậy, tôi đã quản lý để làm cho nó hoạt động, cảm ơn @Joseph cho gợi ý của bạn:

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

Và tôi đã thử nó với

print Processing.getAlgorithm("qgis:creategrid")

Vấn đề của tôi, tôi đoán, xuất phát từ việc tôi đã nhập các mô-đun vào đầu tập lệnh của mình và sau đó thử tạo các Qgi obkects từ bên trong một hàm. Tôi đoán nó cũng có thể làm như vậy nhưng có lẽ có một lỗ hổng trong kỹ năng Python của tôi.

Bây giờ tôi sẽ cố gắng thực sự sử dụng mô-đun xử lý :-)


Có gì đó đã thay đổi ? Tôi thử mã này (từ Joseph) để sử dụng xử lý thành tập lệnh độc lập và tôi nhận được: ImportError: Không có mô-đun nào có tên process.core.Processing bằng linux QGIS 2.18.1
Juanma Font
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.