PythonとQGISを使用して、フォルダーをループしてポリゴンごとにラスターをバッチクリップするには?


9

私はpythonとQGIS 2.0を使用しています。1つのポリゴンフィーチャによってフォルダー内のラスターをクリップしようとしています。私が「PyQGIS」を使用するのはこれが初めてです。以前はArcpyに慣れていました。とにかく、簡単なスクリプトが機能しないので、どんな提案でもいただければ幸いです。

import qgis.core, qgis,utils
QgsApplication.setPrefixPath("C:/OSGeo4W64/apps/qgis", True)
QgsApplication.initQgis()

CLIP= "C:/Users/unim/Documents/Umberto/Universita/PhD/Guglielmin/Permafrost/Alta_Valtellina/Landsat_ita/study_area_foscagno.shp"
INPUT_FOLDER="C:/Users/unimi/Documents/Umberto/Universita/PhD/Guglielmin/Permafrost/Alta_Valtellina/Landsat_ita/LE71930282000259EDC00"
OUTPUT= "C:/Users/unim/Documents/Umberto/Universita/PhD/Guglielmin/Permafrost/Alta_Valtellina/Landsat_ita/foscagno_pyqgis/"


for RASTER in INPUT_FOLDER.tif
do
    echo "Processing $RASTER"
    gdalwarp -q -cutline CLIP -crop_to_cutline -of GTiff RASTER OUTPUT+ "clip_"+ RASTER
done

QgsApplication.exitQgis()

以下は、今までに行った改善ですが、スクリプトを機能させていませんが、近づいていると思います...

import qgis.core, qgis.utils, os, fnmatch
from osgeo import gdal

CLIP= "C:/Users/unimi/Documents/Umberto/Universita/PhD/Guglielmin/Permafrost/Alta_Valtellina/Landsat_ita/study_area_foscagno.shp"
INPUT_FOLDER= "C:/Users/unimi/Documents/Umberto/Universita/PhD/Guglielmin/Permafrost/Alta_Valtellina/Landsat_ita/LE71930282000259EDC00/DNs2Reflectance_LE71930282000259EDC00"
OUTPUT= "C:/Users/unimi/Documents/Umberto/Universita/PhD/Guglielmin/Permafrost/Alta_Valtellina/Landsat_ita/Cloud_mask_AltaValtellina/clip_2_foscagno"

def findRasters (path, filter):
    for root, dirs, files in os.walk(path):
        for file in fnmatch.filter(files, filter):
            yield os.path.join (root, file)

for raster in findRasters (INPUT_FOLDER, '*.tif'):
    print (raster)
    outRaster = OUTPUT + '/clip_' + raster
    cmd = 'gdalwarp -dstnodata 0 -q -cutline CLIP -crop_to_cutline %s %s' % (raster, outRaster)
    os.system (cmd)

「gdal」コマンドに問題があるのではないかと思います。「印刷」機能は適切に機能しますが、出力にファイルが書き込まれず、エラーも表示されません。ちなみに、gdalコーディングに関する簡単なドキュメントを見つけるのは困難です...


まず始めに、Pythonとbashをgdalスクリプトで混合しています。これはgdalを使用するだけで実行できますか、それともpyqgisを使用する必要がありますか?
Nathan W

ありがとうございます。Pythonを使用したいのですが、これはより大きなスクリプトの開始点にすぎません。いくつかの回避策を使用してarcpyで行ったようにそれを使用することは可能ですか?
umbe1987 2013年

CLIPcmd表現することは問題です。変数を文字列に入れても、読み込まれません。代わりに、変数と文字列を連結します。
アントニオ・ファルチャーノ2013年

現在、外部で使用していますが、エラーは出力されず、すべての「.tif」ラスタが適切に「印刷」されます。しかし、いくつかのことを行った後(ウィンドウを1秒未満で4回開くなど)、OUTPUTフォルダーに出力がありません。
umbe1987 2013年

print(cmd)代わりにでラスターパスを確認しますos.system(cmd)。あなたのoutRaster変数が正しくありません。
Antonio Falciano 2013年

回答:


9

私はネイサンに同意します。スクリプト全体をpython化する必要があります。したがって、forループを次のようなものに置き換えます。

import os, fnmatch

def findRasters (path, filter):
    for root, dirs, files in os.walk(path):
        for file in fnmatch.filter(files, filter):
            yield file

for raster in findRasters(INPUT_FOLDER, '*.tif'):
    inRaster = INPUT_FOLDER + '/' + raster
    outRaster = OUTPUT_FOLDER + '/clip_' + raster
    cmd = 'gdalwarp -q -cutline %s -crop_to_cutline %s %s' % (CLIP, inRaster, outRaster)
    os.system(cmd)

注1:ラスターファイルがGeoTIFF(*.tif)であると想定しています。
注2: はのデフォルトの出力形式であるため-of GTiffcmdでは必要ありませんgdalwarp


ありがとうございました。ただし、「os.command(cmd)AttributeError: 'module' object has no attribute 'command'」とありますが、「os」モジュールがインポートされています...
umbe1987

それはそうですos.system、あなたは正しいです。
Antonio Falciano 2013年

4

最後に、非常にシンプルでクリーンなスクリプトを使用して、GDALをインポートせずにPythonから呼び出します(推奨されていますが、 "os.system()"ではなく "Call()"メソッドを使用しています。これが役立つことを願っています!

import os, fnmatch
from subprocess import call
call(["ls", "-l"])

inFolder= 'C:/Users/unimi/Documents/Umberto/Universita/PhD/Guglielmin/Permafrost/Alta_Valtellina/Landsat_ita/LE71930282000259EDC00/DNs2Reflectance_LE71930282000259EDC00/'
outFolder= 'C:/Users/unimi/Documents/Umberto/Universita/PhD/Guglielmin/Permafrost/Alta_Valtellina/Landsat_ita/Cloud_mask_AltaValtellina/clip_2_foscagno/'

os.chdir (inFolder)

def findRasters (path, filter):
    for root, dirs, files in os.walk(path, filter):
        for file in fnmatch.filter(files, filter):
            yield os.path.join (root, file)

for raster in findRasters (inFolder, '*.tif'):
    (infilepath, infilename)= os.path.split (raster)
    print infilename
    outRaster= outFolder+ 'clip_'+ infilename
    print outRaster
    warp= 'gdalwarp -dstnodata 0 -q -cutline %s -crop_to_cutline -of GTiff %s %s' % ('study_area_foscagno.shp', raster, outRaster)
    call (warp)

4

Linuxユーザー向けのumbe1987のソリューションの修正バージョン:

import os, fnmatch
from subprocess import call
call(["ls", "-l"])

inFolder= '/run/media/user/SOFT/LANDSAT/Bulk Order 595257/L8 OLI_TIRS/LC81840262015165LGN00/'
outFolder= '/run/media/user/SOFT/LANDSAT/Bulk Order 595257/summer_clipped/'
shp = '/run/media/user/SOFT/LANDSAT/Bulk Order 595257/vector/mask.shp'
os.chdir (inFolder)

def findRasters (path, filter):
    for root, dirs, files in os.walk(path, filter):
        for file in fnmatch.filter(files, filter):
            yield os.path.join (root, file)

for raster in findRasters (inFolder, '*.TIF'):
    (infilepath, infilename)= os.path.split (raster)
    print infilename
    outRaster= outFolder+ 'clip_'+ infilename
    print outRaster
    warp= 'gdalwarp -cutline \'%s\' -crop_to_cutline -dstalpha \'%s\' \'%s\'' % (shp, raster, outRaster)
    os.system(warp)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.