Ich benutze Python und QGIS 2.0. Ich versuche, Raster in einem Ordner nach einem Polygon-Feature zu schneiden. Es ist das erste Mal, dass ich "PyQGIS" benutze (sagen wir mal). Wie auch immer, ich bekomme mein einfaches Skript nicht zum Laufen, jeder Vorschlag wäre sehr dankbar!
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()
Im Folgenden sind die Verbesserungen aufgeführt, die ich seitdem vorgenommen habe, ohne dass das Skript funktioniert, aber ich denke, ich komme vielleicht näher ...
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)
Ich denke, dass der Befehl "gdal" möglicherweise nicht stimmt, da die Funktion "print" ihre Aufgabe ordnungsgemäß erfüllt, aber keine Datei in die Ausgabe geschrieben wird und ich auch keinen Fehler erhalte. Übrigens war es schwierig, eine einfache Dokumentation zur GDAL-Codierung zu finden ...
CLIP
imcmd
Ausdruck ist das Problem. Wenn Sie eine Variable in eine Zeichenfolge einfügen, wird diese nicht gelesen. Stattdessen würden Sie die Zeichenfolge mit der Variablen verketten.print(cmd)
anstelle vonos.system(cmd)
. IhreoutRaster
Variable ist nicht korrekt.Antworten:
Ich stimme Nathan zu. Sie müssen Ihr gesamtes Skript pythonisieren. Ersetzen Sie Ihre
for
Schleife also durch Folgendes:Hinweis 1: Ich gehe davon aus, dass Ihre Rasterdateien GeoTIFF (
*.tif
) sind.Hinweis 2:
-of GTiff
Wird in nicht benötigtcmd
, da dies das Standardausgabeformat in istgdalwarp
.quelle
os.system
, du hast recht.Ich habe es endlich mit diesem sehr einfachen und sauberen Skript geschafft, das GDAL aus Python aufruft, ohne es zu importieren (wie vorgeschlagen, aber mit der Methode "Call ()" anstelle von "os.system ()". Ich hoffe, das könnte helfen!
quelle
Geänderte Version der umbe1987- Lösung für Linux-Benutzer:
quelle