Per il looping di una cartella in batch di raster di clip mediante poligono utilizzando Python e QGIS?


9

Sto usando Python e QGIS 2.0. Sto cercando di ritagliare i raster in una cartella con una funzione poligonale. È la prima volta che uso (diciamo) "PyQGIS", prima ero abituato ad arcipare. Comunque, non riesco a far funzionare la mia semplice sceneggiatura, qualsiasi suggerimento sarebbe molto apprezzato!

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

Di seguito sono riportati i miglioramenti che ho fatto da ora, non facendo funzionare la sceneggiatura, ma penso che potrei avvicinarmi ...

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)

Penso che potrebbe esserci qualcosa di sbagliato nel comando "gdal", poiché la funzione "stampa" fa il suo lavoro correttamente, ma nessun file viene scritto nell'output, né ricevo alcun errore. A proposito, è stato difficile affezionare una semplice documentazione sulla codifica gdal ...


Bene, per cominciare stai mescolando Python e bash con lo scripting gdal. Puoi farlo usando solo gdal o devi usare pyqgis?
Nathan W,

grazie, vorrei usare Python in quanto questo sarebbe solo un punto di partenza per uno script più grande. È possibile usarlo come ho fatto con arcpy con qualche soluzione?
umbe1987,

La CLIPnella cmdespressione è il problema. Se si inserisce una variabile in una stringa, non viene letta. Invece, si concatenerebbe la stringa con la variabile.
Antonio Falciano,

Lo sto usando fuori adesso, non genera alcun errore e "stampa" correttamente tutti i raster ".tif". Tuttavia, dopo aver fatto alcune cose (come aprire 4 volte per meno di un secondo una finestra), non ottengo alcun output nella mia cartella OUTPUT.
umbe1987,

Controllare i percorsi raster con print(cmd)al posto di os.system(cmd). La tua outRastervariabile non è corretta
Antonio Falciano,

Risposte:


9

Sono d'accordo con Nathan. Devi pitonizzare l'intero script. Quindi sostituisci il tuo forloop con qualcosa di simile al seguente:

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)

Nota 1: suppongo che i tuoi file raster siano GeoTIFF ( *.tif).
Nota 2: -of GTiff non è necessario in cmd, perché è il formato di output predefinito in gdalwarp.


grazie. Tuttavia, dice "os.command (cmd) AttributeError: l'oggetto 'module' non ha attributo 'command'", sebbene il modulo "os" sia stato importato ...
umbe1987

Dovrebbe essere os.system, hai ragione.
Antonio Falciano,

4

Alla fine sono riuscito con questo script molto semplice e pulito, che chiama GDAL da Python senza importarlo (come suggerito, ma usando il metodo "Call ()" invece di "os.system ()". Spero che questo possa aiutare!

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

Versione modificata della soluzione di umbe1987 per utenti Linux:

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.