Для циклічної папки для пакетного растрування кліпів по багатокутнику за допомогою python та QGIS?


9

Я використовую python та QGIS 2.0. Я намагаюся вирізати растри в папці однією функцією багатокутника. Це вперше для мене, що використовує (скажімо) "PyQGIS", я раніше звик до архпінгу. У будь-якому випадку, я не можу працювати зі своїм простим сценарієм, будь-яка пропозиція буде дуже вдячна!

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

Нижче наведено вдосконалення, які я зробив з цього моменту, але не примушуючи сценарій працювати, але, думаю, я можу наблизитися ...

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)

Я думаю, що може бути щось не так у команді "gdal", оскільки функція "print" виконує свою роботу старанно, але жоден файл не записується на вихід, і я не отримую жодної помилки. До речі, важко полюбити легку документацію про кодування gdal ...


Ну для початку ви змішуєте Python і bash з gdal сценаріями. Ви можете це зробити просто за допомогою gdal або вам потрібно використовувати pyqgis?
Nathan W

дякую, я хотів би використати Python, оскільки це було б лише відправною точкою для більшого сценарію. Чи можна використовувати його так, як я робив з arcpy з деяким вирішенням проблеми?
umbe1987

CLIPУ cmdвираженні є проблемою. Якщо ви помістите змінну в рядок, вона не читається. Натомість ви б з'єднали рядок зі змінною.
Антоніо Фальчіано

Я використовую його зовні вже зараз, він не видає жодних помилок, і він "друкує" всі растрові ".tif" швидко. Однак після того, як виконаю деякі речі (наприклад, відкриваючи 4 рази менше, ніж на секунду вікна), я не отримую жодного результату в папці OUTPUT.
umbe1987

Перевірте растрові шляхи print(cmd)замість os.system(cmd). Ваша outRasterзмінна невірна.
Антоніо Фальчіано

Відповіді:


9

Я згоден з Натаном. Вам потрібно пітонізувати весь ваш сценарій. Тож замініть свою forпетлю чимось на зразок наступного:

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)

Примітка 1: Я припускаю, що ваші растрові файли - це GeoTIFF ( *.tif).
Примітка 2: -of GTiff не потрібна в cmd, оскільки це вихідний формат за замовчуванням у gdalwarp.


Дякую тобі. Однак він говорить: "os.command (cmd) AttributeError:" модуль "об'єкт не має атрибута" команда "", хоча модуль "os" був імпортований ...
umbe1987

Це має бути os.system, ти маєш рацію.
Антоніо Фальчіано

4

Нарешті я зумів із цим дуже простим і чистим сценарієм, який викликає GDAL з Python, не імпортуючи його (як пропонується, але використовуючи метод "Call ()" замість "os.system ()". Сподіваюся, це може допомогти!

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

Модифікована версія рішення umbe1987 `для користувачів 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.