Python ve QGIS kullanarak klip rasterlerini çokgene toplu olarak dönüştürmek için?


9

Python ve QGIS 2.0 kullanıyorum. Bir çokgen özelliği ile bir klasörde rasters klip çalışıyorum. "PyQGIS" i (ilk diyelim) kullanarak benim için ilk kez, daha önce kemirmeye alışkındım. Neyse, benim basit senaryomun çalışmasını alamıyorum, herhangi bir öneri çok takdir edilecektir!

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şağıda, senaryoyu işe yaramamaktan beri yaptığım gelişmeler var, ancak sanırım yaklaşıyorum ...

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)

Ben "gdal" komut yanlış bir şey olabilir düşünüyorum, "baskı" fonksiyonu düzgün işini yapıyor, ama hiçbir dosya çıktı yazılır, ne de herhangi bir hata alırsınız. Bu arada, gdal kodlama hakkında kolay bir dokümantasyona düşmek zordu ...


Bir başlangıç ​​için Python ve bash'ı gdal komut dosyasıyla karıştırıyorsunuz. Bunu sadece gdal kullanarak yapabilir veya pyqgis kullanmanız mı gerekiyor?
Nathan W

teşekkür ederim, Python'u kullanmak istiyorum, çünkü bu daha büyük bir senaryo için sadece bir başlangıç ​​noktası olacak. Bazı geçici çözümlerle arcpy ile yaptığım gibi kullanmak mümkün mü?
umbe1987

CLIPOlarak cmdifade sorundur. Dizeye bir değişken koyarsanız, değişken okunmaz. Bunun yerine, dizeyi değişkenle birleştirirsiniz.
Antonio Falciano

Ben şimdi dışarıda kullanıyorum, herhangi bir hata çıkmaz ve tüm ".tif" rasters düzgün "yazdırır". Ancak, bazı şeyler yaptıktan sonra (bir pencereden bir saniyeden daha az bir süre için 4 kez açma gibi), OUTPUT klasörümde herhangi bir çıktı almıyorum.
umbe1987

Raster yollarını print(cmd)yerinde kontrol edin os.system(cmd). Kişisel outRasterdeğişken doğru değil.
Antonio Falciano

Yanıtlar:


9

Nathan ile aynı fikirdeyim. Senaryonun tamamını pitonize etmeniz gerekiyor. Dolayısıyla, fordöngünüzü aşağıdaki gibi bir şeyle değiştirin :

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)

Not 1: Raster dosyalarınızın GeoTIFF ( *.tif) olduğunu varsayalım .
Not 2: -of GTiff içinde gerekli değildir cmd, çünkü içindeki varsayılan çıktı formatıdır gdalwarp.


teşekkür ederim. Ancak, "os.command (cmd) AttributeError: 'module' nesnesinin 'command'" özniteliği yok, ancak "os" modülü inported olmasına rağmen ...
umbe1987

Öyle olmalı os.system, haklısın.
Antonio Falciano

4

Nihayet (çok önerildiği gibi, ancak "os.system ()" yerine "Call ()" yöntemi kullanarak PALAL GDAL çağıran bu çok basit ve temiz komut dosyası ile başardı. Umarım bu yardımcı olabilir!

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 kullanıcıları için umbe1987 `nin çözümünün değiştirilmiş versiyonu :

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.