অজগর এবং কিউজিআইএস ব্যবহার করে বহুভুজ দ্বারা ক্লিপ রাস্টারদের ব্যাচ ফোল্ডারে লুপিংয়ের জন্য?


9

আমি পাইথন এবং কিউজিআইএস ২.০ ব্যবহার করছি। আমি একটি বহুভুক্ত বৈশিষ্ট্য দ্বারা ফোল্ডারে রাস্টারদের ক্লিপ দেওয়ার চেষ্টা করছি। এটি আমার জন্য প্রথমবার (যাক বলে নেওয়া যাক) "পাইকিউজিআইএস" ব্যবহার করার আগে, আমি তো আরকেপি করার আগে ব্যবহৃত হয়েছিলাম। যাইহোক, আমি আমার সাধারণ স্ক্রিপ্টটি কাজ করতে পাই না, কোনও পরামর্শই খুব প্রশংসা হবে!

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" কমান্ডে কিছু ভুল হতে পারে, যেমন "মুদ্রণ" ফাংশনটি তার কাজটি প্রপ্রেস করে, কিন্তু আউটপুটে কোনও ফাইল লেখা হয় না, তবুও আমি কোনও ত্রুটি পাই না। যাইহোক, জিডিএল কোডিংয়ের জন্য একটি সহজ ডকুমেন্টেশন পছন্দ করা শক্ত ছিল ...


শুরু করার জন্য আপনি জিডাল স্ক্রিপ্টিংয়ের সাথে পাইথন এবং ব্যাশ মিশ্রিত করছেন। আপনি কেবল gdal ব্যবহার করে এটি করতে পারেন বা আপনার পাইকগিস ব্যবহার করা দরকার?
নাথান ডব্লিউ

আপনাকে ধন্যবাদ, আমি পাইথনটি ব্যবহার করতে চাই কারণ এটি একটি বৃহত্তর স্ক্রিপ্টের জন্য কেবল একটি সূচনা পয়েন্ট হবে। আমি যেমন কিছুটা কাজের সাথে আরকি দিয়েছিলাম তেমন কি এটি ব্যবহার করা সম্ভব?
umbe1987

CLIPমধ্যে cmdঅভিব্যক্তি সমস্যা। আপনি যদি কোনও স্ট্রিংয়ে ভেরিয়েবল রাখেন তবে এটি পড়ে না। পরিবর্তে, আপনি ভেরিয়েবলের সাথে স্ট্রিংটি সংযুক্ত করতে পারেন।
আন্তোনিও ফ্যালকিয়ানো

আমি এখন এটি বাইরে ব্যবহার করছি, এটি কোনও ত্রুটি আউটপুট দেয় না এবং এটি সমস্ত ".টিফ" রাস্টারদের প্রিন্ট করে। যাইহোক, কিছু স্টাফ করার পরে (যেমন একটি উইন্ডোটির জন্য 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: আমি ধরে নিচ্ছি যে আপনার রাস্টার ফাইলগুলি জিওটিআইএফএফ ( *.tif)।
নোট 2: এর -of GTiff মধ্যে প্রয়োজন হয় না cmd, কারণ এটিতে ডিফল্ট আউটপুট ফর্ম্যাটটি থাকে gdalwarp


ধন্যবাদ. তবে এটি "os.command (cmd) AttributeError: 'মডিউল' অবজেক্টটির কোনও 'কমান্ড' নেই", যদিও "ওএস" মডিউলটি ইনপোর্ট করা হয়েছে ...
umbe1987

এটা হওয়া উচিত os.system, আপনি ঠিক বলেছেন।
আন্তোনিও ফ্যালকিয়ানো

4

অবশেষে আমি এই খুব সহজ এবং পরিষ্কার স্ক্রিপ্ট দিয়ে পরিচালনা করেছি, যা পাইথন থেকে জিডিএলকে আমদানি না করে কল করে (প্রস্তাবিত হিসাবে, তবে "ওএস.সিস্টেম ()" এর পরিবর্তে "কল ()" পদ্ধতি ব্যবহার করে I আমি আশা করি এটি সাহায্য করতে পারে!

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 এর সমাধানের পরিবর্তিত সংস্করণ :

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.