Estoy usando python y QGIS 2.0. Estoy tratando de recortar rásteres en una carpeta por una función de polígono. Es la primera vez que uso (digamos) "PyQGIS", estaba acostumbrado a hacer arcpy antes. De todos modos, no logro que mi script simple funcione, ¡cualquier sugerencia sería muy apreciada!
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()
A continuación se muestran las mejoras que he realizado desde ahora, aunque no logro que el script funcione, pero creo que podría estar acercándome ...
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)
Creo que puede haber algo mal en el comando "gdal", ya que la función "imprimir" hace su trabajo correctamente, pero no se escribe ningún archivo en la salida, ni recibo ningún error. Por cierto, ha sido difícil encontrar una documentación fácil sobre la codificación de gdal ...
CLIP
en lacmd
expresión es el problema. Si coloca una variable en una cadena, no se lee. En su lugar, concatenaría la cadena con la variable.print(cmd)
en lugar deos.system(cmd)
. TuoutRaster
variable no es correcta.Respuestas:
Estoy de acuerdo con Nathan. Necesita pythonize todo su script. Así que sustituya su
for
ciclo con algo como lo siguiente:Nota 1: supongo que sus archivos ráster son GeoTIFF (
*.tif
).Nota 2:
-of GTiff
no es necesario encmd
, porque es el formato de salida predeterminado engdalwarp
.fuente
os.system
, tienes razón.Finalmente me las arreglé con este script muy simple y limpio, que llama a GDAL desde Python sin importarlo (como se sugiere, pero usando el método "Call ()" en lugar de "os.system ()". ¡Espero que esto pueda ayudar!
fuente
Versión modificada de la solución de umbe1987 para usuarios de Linux:
fuente