अजगर और QGIS का उपयोग कर बहुभुज द्वारा क्लिप क्लिप को बैच करने के लिए लूपिंग फ़ोल्डर के लिए?


9

मैं अजगर और 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)

मुझे लगता है कि "गदल" कमांड में कुछ गड़बड़ हो सकती है, क्योंकि "प्रिंट" फ़ंक्शन अपना काम उचित तरीके से करता है, लेकिन आउटपुट में कोई फ़ाइल नहीं लिखी जाती है, न ही मुझे कोई त्रुटि मिलती है। वैसे, यह मुश्किल है कि गदल कोडिंग पर एक आसान दस्तावेजीकरण किया जाए ...


अच्छी तरह से एक शुरुआत के लिए आप पायथन मिश्रण कर रहे हैं और गदल स्क्रिप्टिंग के साथ बैश कर रहे हैं। आप यह सिर्फ गदल का उपयोग कर सकते हैं या क्या आपको पाइकगिस का उपयोग करने की आवश्यकता है?
नाथन डब्ल्यू

धन्यवाद, मैं अजगर का उपयोग करना चाहूंगा क्योंकि यह एक बड़ी स्क्रिप्ट के लिए सिर्फ एक शुरुआती बिंदु होगा। क्या इसका उपयोग संभव है जैसा कि मैंने कुछ वर्कअराउंड के साथ आर्कपी के साथ किया था?
umbe1987

CLIPमें cmdअभिव्यक्ति समस्या है। यदि आप एक स्ट्रिंग में एक चर डालते हैं, तो यह पढ़ा नहीं जाता है। इसके बजाय, आप चर के साथ स्ट्रिंग को संक्षिप्त करेंगे।
एंटोनियो फाल्कियानो

मैं इसे अभी बाहर उपयोग कर रहा हूं, यह किसी भी त्रुटि का उत्पादन नहीं करता है और यह सभी ".tif" चूहों को उचित रूप से प्रिंट करता है। हालाँकि, कुछ सामान करने के बाद (जैसे 4 बार कम खुलने के बाद दूसरी खिड़की), मुझे अपने OUTPUT फ़ोल्डर में कोई आउटपुट नहीं मिलता है।
18म्बे

के 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) एट्रीब्यूट: 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता 'कमांड' नहीं है," हालांकि "os" मॉड्यूल को
इनपोर्ट

यह होना चाहिए os.system, तुम सही हो।
एंटोनियो फाल्कियानो

4

मैं अंत में इस बहुत ही सरल और साफ लिपि के साथ कामयाब रहा, जो कि पायल से GDAL को बिना आयात किए (जैसा कि सुझाव दिया गया है, लेकिन "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 के समाधान का संशोधित संस्करण :

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.