ข้อผิดพลาดในการนำเข้าสำหรับ qgis.core เมื่อรันเชลล์สคริปต์ OSGeo4w


17

ฉันได้ลองใช้พร้อมกับโพสต์นี้เพื่อเรียกใช้สคริปต์ในOSGeo4w Shellนอก QGIS แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:

ImportError: ไม่มีโมดูลชื่อ qgis.core

ฉันได้อ่านโพสต์ต่อไปนี้แล้วและพยายามนำเข้าโมดูลต่างๆ แต่ก็ไม่มีประโยชน์:

นี่เป็นสคริปต์ง่าย ๆ ที่สร้างกริดและคลิปไฟล์รูปหลายเหลี่ยมเข้าไว้

หมายเหตุ:สคริปต์นี้ได้รับการทดสอบและทำงานได้สำเร็จเมื่อทำงานใน QGIS

##Test=name

import os
import glob
import sys

sys.path.append("C:\Program Files\QGIS Brighton\lib;%OSGEO4W_ROOT:\=/%/apps/qgis;%OSGEO4W_ROOT%\apps\qgis\bin;%OSGEO4W_ROOT%\apps\grass\grass-6.4.3\lib;%PATH%")

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

QgsApplication.setPrefixPath("C:\Program Files\QGIS Brighton\apps\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

def run():
#   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):
            outputs_1=processing.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
            outputs_2=processing.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

ทำตามคำตอบและสคริปต์ที่โพสต์โดย @gcarrillo ในที่สุดฉันก็สามารถนำเข้าqgis.core.โมดูลได้สำเร็จ สคริปต์ที่จัดทำโดย @gcarrillo ทำงาน แต่ฉันได้รับข้อผิดพลาด Traceback:

Traceback (most recent call last):
  File "Test.py", line 55, in <module>
    run()
  File "Test.py", line 53, in run
    algClip.processAlgorithm(progress)
  File "C:\Users\username\.qgis2\python\plugins\processing\algs\qgis\ftools\Clip.py", line 59, in processAlgorithm
    layerA.pendingFields(),
AttributeError: 'NoneType' object has no attribute 'pendingFields'

1
คุณตั้งค่า PYTHONPATH อย่างถูกต้องหรือไม่ ฉันแนะนำให้รันสคริปต์ด้วยตัวแปร ENV เดียวกันกับที่ตั้งใน qgis.bat ซึ่งชี้โดยไอคอน qgis
Luigi Pirelli

ขอบคุณ @LuigiPirelli ฉันจะให้ไปและรายงานกลับ
Joseph

ขอบคุณสำหรับคำแนะนำของคุณ @LuigiPirelli แต่ยังคงมีปัญหาที่ยังคงเป็น (ยกเว้นกรณีที่ผมเพิ่มตัวแปรสิ่งแวดล้อมอย่างไม่ถูกต้อง!)
โจเซฟ

1
สำหรับฉัน PATH windows ควรตั้งค่าด้วย "set" ดังนี้: set path =% OSGEO4W_ROOT% \ apps \ qgis \ bin;% OSGEO4W_ROOT% \ apps \ grass \ grass-6.4.3 \ lib;% PATH%
Stefan

คำตอบ:


17

ในที่สุดก็พบวิธีที่เหมาะสมในการรันอัลกอริทึมการประมวลผลในสคริปต์ PyQGIS แบบสแตนด์อโลน

คำตอบนี้จะขึ้นอยู่กับคำตอบของปัญหาเกี่ยวกับการนำเข้า qgis.core เมื่อเขียนสคริปต์แบบสแตนด์อะโลน PyQGISและข้อผิดพลาด: อัลกอริทึมไม่พบซึ่งเป็นในทางกลับกันขึ้นอยู่กับQGIS-dev อภิปรายทางรายการ

ฉันแนะนำให้คุณติดตามขั้นตอนการทำงานที่ระบุไว้ในปัญหากับการนำเข้า qgis.core เมื่อเขียนสคริปต์ PyQGIS แบบสแตนด์อะโลนเพื่อเปิดใช้งานไลบรารี QGIS ของคุณใน OSGeo4W Shell ของคุณ เมื่อคุณทำให้ห้องสมุด QGIS ของคุณทำงานอย่างถูกต้องเราสามารถดำเนินการในส่วนที่ 2 ของคำถามของคุณ: เรียกใช้อัลกอริทึมการประมวลผลในสคริปต์ PyQGIS แบบสแตนด์อโลน

ฉันแก้ไขสคริปต์ต้นฉบับของคุณแล้วทดสอบบน Windows 7 และ GNU / Linux ฉันใช้การประมวลผลเวอร์ชั่น 2.2.0-2 และแนะนำให้คุณใช้เวอร์ชันนี้ซึ่งเป็นเวอร์ชั่นปัจจุบันในขณะที่เขียนคำตอบ

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("C:\\Program Files\\QGIS Brighton\\apps\\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

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

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)

run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS

โปรดทราบว่าฉันได้นำการสร้างกริดออกจากการวนซ้ำเนื่องจากคุณไม่จำเป็นต้องใช้กริดใหม่เพื่อดำเนินการกับแต่ละคลิป

สิ่งนี้ควรทำเคล็ดลับ!


สวย! จะยอมรับคำตอบนี้เพราะมันอ่านได้ง่ายและกะทัดรัดมากขึ้นอย่างน้อยในความคิดของฉัน ขอบคุณมากเพื่อนอีกครั้ง!
โจเซฟ

เพิ่งสังเกตเห็นว่าสคริปต์นี้สร้างProcessingโฟลเดอร์บนเดสก์ท็อปคล้ายกับที่อยู่ใน/qgis.2โฟลเดอร์ สิ่งนี้ควรเกิดขึ้นหรือไม่
โจเซฟ

นอกจากนี้ยังสร้างโฟลเดอร์เดียวกันกับที่อ่านไฟล์รูปร่างและเพิ่มไฟล์ฐานข้อมูล 'qgis' ที่ว่างเปล่า ซึ่งค่อนข้างน่ารำคาญเนื่องจากสคริปต์ที่ฉันกำลังแก้ไขจะใช้รูปแบบไฟล์จากหลาย ๆ โฟลเดอร์ซึ่งหมายความว่าไฟล์ / โฟลเดอร์ใหม่เหล่านี้ก็จะโผล่ขึ้นมาเช่นกัน ฉันยังคงต้องการคำตอบนี้กับคนอื่นของคุณ
โจเซฟ

ถูกต้อง @Joseph ไม่ทราบเกี่ยวกับการสร้างโฟลเดอร์เหล่านั้นกรอบการประมวลผลสร้างขึ้นด้วยเหตุผลใดก็ตามที่ฉันไม่เข้าใจ ฉันเห็นด้วยกับคุณนี่คือคำตอบที่ถูกต้องมันหลีกเลี่ยงขั้นตอนเพิ่มเติมและใช้ประโยชน์จากกรอบการทำงานจริง ขอบคุณสำหรับความโปรดปราน!
Germán Carrillo

2
สิ่งนี้มีประโยชน์มาก จุดอ่อนที่สำคัญของ QGIS คือการอนุญาตให้ผู้เริ่มต้นเขียนสคริปต์ง่าย ๆ มันเหมือนกับการถอนฟัน
Damien

7

คำตอบนี้ขึ้นอยู่กับคำตอบของปัญหาเกี่ยวกับการนำเข้า qgis.core เมื่อเขียนสคริปต์ PyQGIS แบบสแตนด์อะโลนและฉันจะเข้าถึงการประมวลผลด้วย Python ได้อย่างไร .

ฉันแนะนำให้คุณติดตามขั้นตอนการทำงานที่ระบุไว้ในปัญหากับการนำเข้า qgis.core เมื่อเขียนสคริปต์ PyQGIS แบบสแตนด์อะโลนเพื่อเปิดใช้งานไลบรารี QGIS ของคุณใน OSGeo4W Shell ของคุณ เมื่อคุณทำให้ห้องสมุด QGIS ของคุณทำงานอย่างถูกต้องเราสามารถดำเนินการในส่วนที่ 2 ของคำถามของคุณ: เรียกใช้อัลกอริทึมการประมวลผลในสคริปต์ PyQGIS แบบสแตนด์อโลน

เช่นเดียวกับในฉันจะเข้าถึงการประมวลผลด้วย Python ได้อย่างไร ฉันจะให้วิธีแก้ปัญหาแก่คุณจนกว่าฉันจะสามารถเรียกใช้อัลกอริทึมโดยใช้ชื่อ (เช่นprocessing.runalg('provider:algorithm_name')) ฉันใช้การประมวลผลเวอร์ชั่น 2.2.0-2 และแนะนำให้คุณใช้เวอร์ชันนี้

เราสามารถใช้คอนโซล QGIS Python เพื่อค้นหาว่าสคริปต์อัลกอริทึมนั้นอยู่ที่ใดในการประมวลผลโฟลเดอร์ปลั๊กอิน ตัวอย่างเช่นหากต้องการทราบตำแหน่งที่จะนำเข้าqgis:creategridให้เขียนในคอนโซล QGIS Python:

from processing.core.Processing import Processing
Processing.getAlgorithm('qgis:creategrid')

คุณควรได้รับ:

<processing.algs.qgis.mmqgisx.MMQGISXAlgorithms.mmqgisx_grid_algorithm instance at 0xae7382c>

ซึ่งเพียงพอสำหรับเราที่จะสังเกตเห็นทั้งโมดูลพา ธ ( processing.algs.qgis.mmqgisx.MMQGISXAlgorithms) และคลาสอัลกอริทึม ( mmqgisx_grid_algorithm) คุณจะใช้ข้อมูลนี้ในสคริปต์ด้านล่าง

ฉันได้แก้ไขสคริปต์ของคุณแล้วทดสอบบน Windows 7 คุณอาจต้องปรับเปลี่ยนเส้นทางเพื่อใช้งานสคริปต์ในสภาพแวดล้อมของคุณเอง

import os
import glob
import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

app = QApplication([])
QgsApplication.setPrefixPath("C:\\Program Files\\QGIS Brighton\\apps\\qgis", True)
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

# Tell Python where you will get processing from
sys.path.append(home + "\.qgis2\python\plugins")

# Reference the algorithms you want to run
from processing.algs.qgis.mmqgisx.MMQGISXAlgorithms import *
from processing.algs.qgis.ftools.Clip import *
algGrid = mmqgisx_grid_algorithm()
algClip = Clip()

from processing.core.SilentProgress import SilentProgress
progress = SilentProgress()

def run():
    # Create a grid 
    grid = path_dir + "Grids\grid.shp"
    algGrid.setParameterValue('HSPACING', 1000)
    algGrid.setParameterValue('VSPACING', 1000)
    algGrid.setParameterValue('WIDTH', 24108)
    algGrid.setParameterValue('HEIGHT', 18351.157175)
    algGrid.setParameterValue('CENTERX', 258293.802316)
    algGrid.setParameterValue('CENTERY', 665638.226408)
    algGrid.setParameterValue('GRIDTYPE', 1)
    algGrid.setParameterValue('CRS', 'EPSG:7405')
    algGrid.setOutputValue('SAVENAME', grid)
    algGrid.processAlgorithm(progress)

    # Set directory, search for all polygon .shp files 
    os.chdir(path_dir + "Shapefiles\\")    
    for fname in glob.glob("*.shp"):
        # Run the Clip algorithm, then output results into Results folder
        algClip.setParameterValue('INPUT', grid)
        algClip.setParameterValue('OVERLAY', fname)
        algClip.setOutputValue('OUTPUT', path_res  + "/"+ fname)
        algClip.processAlgorithm(progress)

run()
QgsApplication.exitQgis()

สิ่งนี้ควรทำเคล็ดลับ!

อย่างที่คุณเห็นฉันได้สร้างโฟลเดอร์ Test / Grids เพื่อให้คุณเก็บ Shapefile กริดเดียวแทนที่จะสร้างไฟล์ชั่วคราวในทุก ๆ ลูปซึ่งดูเหมือนว่าไม่จำเป็น


ขอบคุณมาก @ gcarrillo ฉันจะทดสอบและรายงานกลับ
โจเซฟ

ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ! ฉันสามารถนำเข้าโมดูลได้สำเร็จ! แต่เมื่อฉันเรียกใช้สคริปต์ของคุณฉันได้รับข้อผิดพลาด Traceback ฉันได้แก้ไขคำถามเพื่อรวมสิ่งนี้
โจเซฟ

คุณลืมสร้างโฟลเดอร์Test/Grids/ก่อนเรียกใช้สคริปต์
Germán Carrillo

ขออภัยฉันลืมที่จะพูดถึงว่า ฉันสร้าง/Grids/โฟลเดอร์และสร้างไฟล์ grid.shp มันทำงานได้อย่างสมบูรณ์แบบ! อย่างอื่นเป็นปัญหา
โจเซฟ

คุณทำการเปลี่ยนแปลง / ปรับปรุงสคริปต์หรือไม่? ฉันเพิ่งทดสอบบน GNU / Linux โดยไม่มีปัญหา ข้อผิดพลาดที่คุณได้รับเนื่องจากอัลกอริธึม Clip ไม่สามารถเข้าถึงพา ธpath_dir + "Grids\grid.shp"ซึ่งจะเป็นC:\Users\your_username\Desktop\Test\Grids\grid.shp
Germán Carrillo

4

ฉันต้องทำการเปลี่ยนแปลงเล็กน้อยกับสคริปต์ที่ @gcarrillo รวมถึงเส้นทาง OSGEO4W64 (ฉันต้องติดตั้ง QGIS อีกครั้งผ่านทางตัวติดตั้ง OSGEO4W64 เมื่อฉันใช้ตัวติดตั้งแบบสแตนด์อโลนในตอนแรก) และรวมเครื่องหมายสแลชสองครั้ง นี่คือสคริปต์สุดท้ายและขอบคุณทุกคนมากสำหรับความช่วยเหลือ:

import os, sys, glob

# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QgsApplication([]) # instantiation of QgsApplication
QgsApplication.setPrefixPath("C:\\OSGeo4W64\\apps\\qgis", True) # The True value is important
QgsApplication.initQgis()

from os.path import expanduser
home = expanduser("~")

#   Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"

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

def run():
    outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405',  None)
    #   Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
    os.chdir(path_dir + "Shapefiles\\")
    for fname in glob.glob("*.shp"):        
        outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res  + "/"+ fname)
run()

QgsApplication.exitQgis()
#   Remove the above line when running in QGIS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.