การนำเข้าการประมวลผล QGIS ในสคริปต์หลามแบบสแตนด์อโลน


10

ฉันต้องการเขียนสคริปต์แบบสแตนด์อโลนสองสามตัวที่ใช้กล่องเครื่องมือประมวลผลของ Qgis

ฉันได้อ่านไม่กี่กระทู้ ( ที่นี่และที่นี่เช่น) แต่ยังหาวิธีแก้ปัญหาที่ใช้งานไม่ได้

ใช้ Qgis 2.16.1 บน Ubuntu Xenial 16.04 LTS

ส่วนการนำเข้าของสคริปต์ของฉันมีลักษณะดังนี้:

# 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

แก้ไข (หลังจากความคิดเห็นของโจเซฟ)

ฉันได้ลองแบบนี้:

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

แต่พฤติกรรมนั้นแปลก: สคริปต์ของฉันทำงานจนถึงจุดสิ้นสุดโดยไม่มีข้อผิดพลาด แต่ดูเหมือนว่า "กระโดด" เหนืองานที่ควรทำ :-) กล่าวอีกนัยหนึ่งมันทำงานจนกว่าจะสิ้นสุด แต่ไม่ได้ทำอะไรเลย

ฉันยอมรับว่าคำอธิบายของฉันไม่ชัดเจนมาก ... ฉันจะตรวจสอบเพิ่มเติม แต่ถ้าใครมีวิธีแก้ปัญหาที่มีมนต์ขลัง (ไม่ใช่วิธีแก้ปัญหา) เพื่อนำเข้าโมดูลนี้จากนั้นโปรด!

แก้ไข 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หรือไม่ รหัสของเขาคือสิ่งที่ฉันใช้เพื่อเรียกใช้สคริปต์แบบสแตนด์อโลน (ฉันแก้ไขเส้นทางของฉันเล็กน้อยเมื่อฉันใช้ Windows)
โจเซฟ

งานที่คุณพยายามจะทำคืออะไร? :) กรุณาใส่รหัสในคำถามของคุณหน่อยได้ไหม? สิ่งนี้จะช่วยให้ผู้อื่นระบุสิ่งที่ผิด
โจเซฟ

ฉันพยายามเขียนสคริปต์ฟังก์ชั่นบางอย่างเพื่อประมวลผลภาพ UAV สิ่งแรกที่ฉันต้องทำคือการปฏิเสธซึ่งเป็นเหตุผลที่ฉันต้องการโมดูลการประมวลผล ให้ฉันเพิ่มสคริปต์เต็มของฉันแม้ว่าฉันจะรู้สึกละอายใจนิดหน่อย: ฉันไม่ใช่นักพัฒนา "ของจริง" และฉันแน่ใจว่ารหัสของฉันไม่ได้สะอาดที่สุดหรือตรงไปตรงมาที่สุดที่คุณเคยเห็น :-)
Stéphane Henriod

อย่าละอาย! ไม่มีอะไรที่ฉันโพสต์เป็นที่สะอาดที่สุดหรือตรงไปตรงมา =)
โจเซฟ

ดังนั้นฉันจึงเพิ่มสคริปต์ทั้งหมดของฉัน รู้สึกฟรีเพื่อดู :-)
Stéphane Henriod

คำตอบ:


6

Linux 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")

นี่เป็นชุดค่าผสมเดียวที่ทำงานกับสภาพแวดล้อมที่ฉันกำลังทำงานอยู่ (Pycharm C.Ed บนเครื่อง Ubuntu 14.04 ที่มี Python 2.7) ก่อนหน้านี้ฉันลองชุดค่าผสมของgis.stackexchange.com/questions/129513/และgis.stackexchange.com/questions/176821/และน่าเสียดายที่ไม่มีการนำเข้า "processing.core.Processing" มาก่อน ฉันไม่รู้ว่าทำไมการนำเข้าโมดูลนั้นทำให้เกิดความสับสน สำหรับเร็กคอร์ด: มีแพ็คเกจ Python แท้ที่เรียกว่า "การประมวลผล" ที่เงาของ QGIS
Irene

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")

ปัญหาของฉันฉันเดามาจากข้อเท็จจริงที่ว่าฉันนำเข้าโมดูลที่จุดเริ่มต้นของสคริปต์ของฉันแล้วลองสร้าง Qgi obkects จากภายในฟังก์ชัน ฉันเดาว่ามันจะเป็นไปได้ที่จะทำเช่นนั้น แต่อาจมีข้อบกพร่องในทักษะ Python ของฉัน

ตอนนี้ฉันจะพยายามทำให้โมดูลการประมวลผลจริง :-)


มีอะไรเปลี่ยนแปลงบ้าง? ฉันลองรหัสนี้ (จากโจเซฟ) เพื่อใช้การประมวลผลเป็นสคริปต์แบบสแตนด์อโลนและฉันได้รับ: ImportError: ไม่มีโมดูลที่ชื่อการประมวลผลการประมวลผลแกนประมวลผลโดยใช้ linux QGIS 2.18.1
Juanma แบบอักษร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.