Đối với vòng lặp thư mục để raster clip hàng loạt bằng đa giác bằng python và QGIS?


9

Tôi đang sử dụng python và QGIS 2.0. Tôi đang cố gắng cắt các trình quét trong một thư mục bằng một tính năng đa giác. Đây là lần đầu tiên tôi sử dụng (giả sử) "PyQGIS", trước đây tôi đã quen với việc sử dụng. Dù sao, tôi không làm cho kịch bản đơn giản của mình hoạt động, bất kỳ đề xuất nào cũng sẽ được đánh giá cao!

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

Dưới đây là những cải tiến tôi đã thực hiện kể từ bây giờ, mặc dù kịch bản không hoạt động, nhưng tôi nghĩ rằng tôi có thể tiến gần hơn ...

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)

Tôi nghĩ rằng có thể có lỗi gì đó trong lệnh "gdal", vì chức năng "in" thực hiện đúng chức năng của nó, nhưng không có tệp nào được ghi vào đầu ra, tôi không nhận được bất kỳ lỗi nào. Nhân tiện, thật khó để thích một tài liệu dễ dàng về mã hóa gdal ...


Để bắt đầu, bạn đang trộn Python và bash với kịch bản lệnh gdal. Bạn có thể làm điều này chỉ bằng cách sử dụng gdal hoặc bạn cần sử dụng pyqgis?
Nathan W

cảm ơn bạn, tôi muốn sử dụng Python vì đây sẽ chỉ là điểm khởi đầu cho một kịch bản lớn hơn. Có thể sử dụng nó như tôi đã làm với arcpy với một số cách giải quyết khác không?
umbe1987

Các CLIPtrong cmdbiểu thức là vấn đề. Nếu bạn đặt một biến trong một chuỗi, nó không được đọc. Thay vào đó, bạn sẽ nối chuỗi với biến.
Antonio Falciano

Tôi đang sử dụng nó bên ngoài bây giờ, nó không xuất ra bất kỳ lỗi nào và nó "in" tất cả các trình quét ".tif" đúng cách. Tuy nhiên, sau khi thực hiện một số nội dung (như mở 4 lần cho ít hơn một cửa sổ thứ hai), tôi không nhận được bất kỳ đầu ra nào trong thư mục OUTPUT của mình.
umbe1987

Kiểm tra các đường dẫn raster với print(cmd)vị trí của os.system(cmd). outRasterBiến của bạn không đúng.
Antonio Falciano

Câu trả lời:


9

Tôi đồng ý với Nathan. Bạn cần pythonize toàn bộ kịch bản của bạn. Vì vậy, thay thế forvòng lặp của bạn bằng một cái gì đó như sau:

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)

Lưu ý 1: Tôi cho rằng các tệp raster của bạn là GeoTIFF ( *.tif).
Lưu ý 2: -of GTiff không cần thiết cmdvì nó là định dạng đầu ra mặc định gdalwarp.


cảm ơn bạn. Tuy nhiên, nó nói "os.command (cmd) AttributionError: 'module' object không có thuộc tính 'lệnh'", mặc dù mô-đun "os" đã được nhập ...
umbe1987

Nó nên là os.system, bạn đúng.
Antonio Falciano

4

Cuối cùng tôi đã quản lý với tập lệnh rất đơn giản và rõ ràng này, nó gọi GDAL từ Python mà không cần nhập nó (như được đề xuất, nhưng sử dụng phương thức "Call ()" thay vì "os.system ()". Tôi hy vọng điều này có thể giúp ích!

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

Phiên bản sửa đổi của giải pháp umbe1987 cho người dùng 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.