Używam Pythona i QGIS 2.0. Próbuję przyciąć rastry do folderu według jednej funkcji wielokąta. To pierwszy raz, gdy używam (powiedzmy) „PyQGIS”, wcześniej byłem przyzwyczajony do gry. Tak czy inaczej, mój prosty skrypt nie działa, każda sugestia byłaby bardzo mile widziana!
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()
Poniżej znajdują się ulepszenia, które wprowadziłem od tej pory, ale nie uruchamiają skryptu, ale myślę, że mogę być coraz bliżej ...
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)
Myślę, że może być coś złego w poleceniu „gdal”, ponieważ funkcja „print” wykonuje swoje zadanie prawidłowo, ale żaden plik nie jest zapisywany na wyjściu, ani nie otrzymuję żadnego błędu. Nawiasem mówiąc, trudno było znaleźć łatwą dokumentację na temat kodowania gdal ...
CLIP
Wcmd
ekspresji jest problem. Jeśli wstawisz zmienną do łańcucha, nie zostanie ona odczytana. Zamiast tego połączysz łańcuch ze zmienną.print(cmd)
zamiastos.system(cmd)
. TwojaoutRaster
zmienna jest nieprawidłowa.Odpowiedzi:
Zgadzam się z Nathanem. Musisz spytonować cały skrypt. Więc zamień swoją
for
pętlę na coś takiego:Uwaga 1: Przypuszczam, że twoje pliki rastrowe to GeoTIFF (
*.tif
).Uwaga 2:
-of GTiff
nie jest wymagana wcmd
, ponieważ jest to domyślny format wyjściowy wgdalwarp
.źródło
os.system
, masz rację.W końcu poradziłem sobie z tym bardzo prostym i czystym skryptem, który wywołuje GDAL z Pythona bez importowania go (zgodnie z sugestią, ale przy użyciu metody „Call ()” zamiast „os.system ()”. Mam nadzieję, że to może pomóc!
źródło
Zmodyfikowana wersja rozwiązania umbe1987 dla użytkowników systemu Linux:
źródło