OSGeo4wシェルスクリプトの実行時のqgis​​.coreのインポートエラー


17

この投稿とともに、QGISの外部のOSGeo4w Shellでスクリプトを実行しようとしました。しかし、次のエラーが表示されます。

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 (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を正しく設定しましたか?qgisアイコンが指すqgis.batに設定されているのと同じENV変数でスクリプトを実行することをお勧めします。
ルイージピレリ

@LuigiPirelliに感謝します。
ジョセフ

@LuigiPirelliのご提案に感謝しますが、問題は解決しません(環境変数を誤って追加しない限り)
ジョセフ

1
私にとって、Windows PATHは次のように「set」で設定する必要があります。set path =%OSGEO4W_ROOT%\ apps \ qgis \ bin;%OSGEO4W_ROOT%\ apps \ grass \ grass-6.4.3 \ lib;%PATH%
Stefan

回答:


17

最後に、PyQGISスタンドアロンスクリプトで処理アルゴリズムを実行する適切な方法を見つけました。

この回答は、スタンドアロンのPyQGISスクリプト記述する際のimport qgis.coreの問題とQgis-devメーリングリストの議論に基づいたError:Algorithm not foundに対する回答に基づいています。

OSGeo4WシェルでQGISライブラリを有効にするスタンドアロンのPyQGISスクリプト作成するときは、「qgis.coreのインポートに関する問題」に記載されているワークフローに従うことをお勧めします。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

各クリップを実行するために新しいグリッドを実際に必要としないため、グリッドの作成をforループから除外していることに注意してください。

これでうまくいくはずです!


綺麗な!私の意見では、より読みやすくコンパクトなこの回答を受け入れます。どうもありがとうございました!
ジョセフ

このスクリプトは、Processingフォルダーに含まれている/qgis.2フォルダーと同様に、デスクトップにフォルダーを作成することに注意してください。これは起こりますか?
ジョセフ

また、シェープファイルの読み取り元と同じフォルダーを作成し、空の「qgis」データベースファイルを追加します。変更しているスクリプトがいくつかのフォルダからシェープファイルを取得するため、これは非常に迷惑です。つまり、これらの新しいファイル/フォルダもポップアップします。私はまだあなたの答えよりもこの答えが好きです。
ジョセフ

そう、@ Joseph、これらのフォルダーの作成については知らない。処理フレームワークは、私が理解できない何らかの理由でそれらを作成する。私はあなたに同意します。これは適切な答えであり、追加のステップを回避し、実際にフレームワークを利用します。報奨金をありがとう!
ゲルマンカリージョ

2
これは非常に役立ちます。QGISの大きな弱点は、初心者が簡単なスクリプトを作成できることです。歯を引っ張るようなものです。
ダミアン

7

この回答は、スタンドアロンPyQGISスクリプト記述する際のqgis​​.coreのインポートに関する問題と、Pythonで「処理」にアクセスするにはどうすればよいかに対する回答に基づいています

OSGeo4WシェルでQGISライブラリを有効にするスタンドアロンのPyQGISスクリプト作成するときは、「qgis.coreのインポートに関する問題」に記載されているワークフローに従うことをお勧めします。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()

これでうまくいくはずです!

ご覧のとおり、Forループごとに一時ファイルを作成するのではなく、単一のグリッドShapefileを保存するようにTest / Gridsフォルダーを作成しましたが、これは必要ないと思われます。


@gcarrilloに感謝します。これをテストし、報告します。
ジョセフ

再びあなたの助けに感謝します!モジュールを正常にインポートできます!しかし、スクリプトを実行すると、トレースバックエラーが表示されます。これを含めるように質問を編集しました。
ジョセフ

Test/Grids/スクリプトを実行する前にフォルダーを作成するのを忘れました。
ゲルマンカリージョ

申し訳ありませんが、言及するのを忘れました。/Grids/フォルダーを作成し、grid.shpファイルが作成されました。それは完全に機能します!他の何かが問題です。
ジョセフ

スクリプトを変更/調整しましたか?GNU / Linuxで問題なくテストしました。あなたが得るエラーは、クリップアルゴリズムはパスへのアクセスができないためであるpath_dir + "Grids\grid.shp"だろう、C:\Users\your_username\Desktop\Test\Grids\grid.shp
ヘルマン・カリージョ

4

@gcarrilloが提供するスクリプトに小さな変更を加えてOSGEO4W64パスを含め(最初にスタンドアロンインストーラーを使用したため、OSGEO4W64インストーラーを介してQGISを再インストールする必要がありました)、ダブルスラッシュを含める必要がありました。これが最終的なスクリプトであり、皆さんの助けに感謝します。

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.