파이썬과 QGIS를 사용하여 다각형으로 클립 래스터를 배치하는 루핑 폴더?


9

파이썬과 QGIS 2.0을 사용하고 있습니다. 하나의 다각형 기능으로 폴더의 래스터를 자르려고합니다. "PyQGIS"를 사용하는 것은 처음입니다. 어쨌든, 나는 간단한 스크립트가 작동하지 않으면 어떤 제안이라도 대단히 감사하겠습니다!

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"명령에 "print"기능이 제대로 작동하지만 파일이 출력에 기록되지 않거나 오류가 발생하지 않기 때문에 "gdal"명령에 문제가 있다고 생각합니다. 그건 그렇고, gdal 코딩에 대한 쉬운 문서를 좋아하는 것은 어렵습니다 ...


글쎄, 처음에는 파이썬과 bash를 gdal 스크립팅과 혼합하고 있습니다. gdal을 사용 하여이 작업을 수행 할 수 있습니까, 아니면 pyqgi를 사용해야합니까?
Nathan W

고맙습니다. 파이썬을 사용하고 싶습니다. 큰 스크립트의 시작점이 될 것입니다. 몇 가지 해결 방법으로 arcpy로했던 것처럼 사용할 수 있습니까?
umbe1987

CLIPcmd표현은 문제입니다. 문자열에 변수를 넣으면 읽지 않습니다. 대신 문자열을 변수와 연결합니다.
Antonio Falciano

지금 밖에서 사용하고 있는데 오류가 발생하지 않으며 모든 ".tif"래스터를 올바르게 "인쇄"합니다. 그러나 몇 가지 작업을 수행 한 후 (예 : 창을 1 초 미만으로 열 때와 같이) OUTPUT 폴더에 출력이 없습니다.
umbe1987

print(cmd)대신 래스터 경로를 확인하십시오 os.system(cmd). 귀하의 outRaster변수가 올바르지 않습니다.
Antonio Falciano

답변:


9

나단에 동의합니다. 전체 스크립트를 파이썬 화해야합니다. 따라서 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 GTiff필요하지 않습니다 .cmdgdalwarp


감사합니다. 그러나 "os"모듈이 이식되었지만 "os.command (cmd) AttributeError : 'module'object has attribute 'command'"라고 표시됩니다.
umbe1987

맞아야합니다 os.system.
Antonio Falciano

4

필자는 파이썬에서 가져 오지 않고 GDAL을 호출하는 매우 간단하고 깨끗한 스크립트를 사용하여 관리했습니다 (제안 된대로 "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.