गल्थबिल्डवर्ट के बराबर पायथन


12

वहाँ GDAL पायथन बाइंडिंग का उपयोग कर gdalbuildvrt उपयोगिता के समान कार्य करने का एक तरीका है? अब तक मुझे एक एकल डेटासेट की vrt बनाने और xml को मैन्युअल रूप से संपादित करने के अलावा ऐसा करने का कोई तरीका नहीं मिला है। मैं कई चूहों (अनिवार्य रूप से एक मोज़ेक प्रदर्शन) से एक vrt बनाना चाहूंगा। क्या शुद्ध पायथन का उपयोग करना संभव है? मेरा अन्य विकल्प उपप्रकार का उपयोग करने के लिए बस gdalbuildvrt को कॉल करना है।

जवाबों:


10

ईमानदारी से यह उपयोग करके ऐसा करना आसान है gdalbuildvrt एक में subprocessया os.system

क्या आप इसे पाइथन के माध्यम से करना चाहते हैं तो यह किया जा सकता है। GDAL पायथन के भीतर मानक डेटासेट निर्माण विधियों का उपयोग करके हम आसानी से आधार डेटासेट VRT बना सकते हैं ।

from osgeo import gdal

drv = gdal.GetDriverByName("VRT")
vrt = drv.Create("test.vrt", x_size, y_size, 0)

ध्यान दें कि हम शुरुआत में बिना बैंड वाले डेटासेट बना रहे हैं। वीआरटी पर प्रलेखन से कि वीआरटी डेटासेट कुछ डेटासेट प्रकारों में से एक है जो AddBandतर्कों को स्वीकार कर सकते हैं।

vrt.AddBand(gdal.GDT_Float32)
band = vrt.GetRasterBand(1)

अब प्रत्येक बैंड के लिए हमें मेटाडेटा आइटम मैन्युअल रूप से सेट करने होंगे:

simple_source = '<SourceFilename relativeToVRT="1">%s</SourceFilename>' % source_path + \
    '<SourceBand>%i</SourceBand>' % source_band + \
    '<SourceProperties RasterXSize="%i" RasterYSize="%i" DataType="Real" BlockXSize="%i" BlockYSize="%i"/>' % (x_size, y_size, x_block, y_block) + \
    '<SrcRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>' % (x_offset, y_offset, x_source_size, y_source_size) + \
    '<DstRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>' % (dest_x_offset, dest_y_offset, x_dest_size, y_dest_size)
band.SetMetadataItem("SimpleSource", simple_source)
band.SetMetadataItem("NoDataValue", -9999)

SetMetadatItemदो तर्क लेता है, पहला मेटाडेटा आइटम का स्ट्रिंग, दूसरा आइटम स्वयं। इसका मतलब यह है कि आप मेटाडेटा आइटम को कम नहीं कर सकते हैं, इसलिए डेटा स्रोतों के लिए आपको पूरी सामग्री को एक स्ट्रिंग के रूप में सेट करना होगा।

ध्यान दें कि हम इस विधि का उपयोग जटिल स्रोत ( ComplexSource) बनाने के लिए कर सकते हैं जिसमें मानों के लुक-अप-टेबल होते हैं, KernelFilteredSourceमनमाने आकार और आकार के कर्नेल फिल्टर स्रोत ( और मास्क बैंड MaskBand) ( )।


साभार @om_henners - मैंने उपप्रकार का उपयोग कर गल्डबिल्डवर्ट को कॉल किया। मैं कमांड लाइन के बजाय पायथन के साथ अधिक अनुभवी हूं इसलिए मैं उम्मीद कर रहा था कि मैं सीधे पायथन में ऐसा कर सकता हूं, लेकिन इसके एक्सएमएल स्ट्रिंग्स बनाने के साथ खिलवाड़ करने की परेशानी के लायक नहीं है जैसा कि आपने वर्णित किया है। यह जानना निश्चित रूप से अच्छा है कि मैं ऐसा कर सकता हूं, अगर भविष्य में इसकी आवश्यकता हो।
ब्रायन

बस एक अजगर समान होने के लिए उपयोग-मामला मिला: असमर्थित सुविधाओं को जोड़ना। उदाहरण के लिए vrt फ़ाइल स्वरूप एक overviewsतत्व का समर्थन करता है, लेकिन gdalbuildvrt इसका उपयोग नहीं करता है। एक स्टब प्रदान करने के लिए धन्यवाद कि यह अजगर में कैसे जोड़ा जा सकता है।
मैट विल्की

@om_henners क्या किसी भी तरह से dr..reateCopy ('path / to / file.vrt', input_ds) में python में input_ds फ़ाइल के लिए निरपेक्ष पथ है? रिश्तेदारटीवीवीआरटी = "1" विकल्प है, लेकिन वीआरटी बनाते समय इसे कैसे बदलें या सेट करें?
दिमित्री लिट्विनोव

8

चूंकि GDAL 2.1 सीएलआई उपकरण पुस्तकालय कार्यों के रूप में उपलब्ध है, और वास्तव में यही सीएलआई उपकरण अब आंतरिक रूप से कहते हैं।

उदाहरण के लिए:

gdalbuildvrt -r cubic -addalpha my.vrt one.tif two.tif

के बराबर है:

from osgeo import gdal

vrt_options = gdal.BuildVRTOptions(resampleAlg='cubic', addAlpha=True)
gdal.BuildVRT('my.vrt', ['one.tif', 'two.tif'], options=vrt_options)

उपलब्ध CLI विकल्पों सीधे के मापदंडों को मैप BuildVRTOptions , प्लस वहाँ प्रगति कॉलबैक जैसे कुछ अतिरिक्त उपलब्ध है।


यह केवल कुछ CLI टूल के लिए प्रतीत होता है। उदाहरण के लिए, मैं काम करने के लिए gdaladdo प्राप्त करने की कोशिश कर रहा हूं, लेकिन यह दिखाई नहीं देता है। गदलवारप के साथ भी। क्या आप जानते हैं कि क्या वे भी इनका समर्थन करने की योजना बना रहे हैं? बहुत मददगार होगा।
fpolig01

देखते हैं - @ fpolig01 उनमें से ज्यादातर देखते हैं RegenerateOverviews()और Warp()में API संदर्भ । तर्क आम तौर पर सीएलआई आदेशों से मेल खाते हैं।
rcoup

@rccoup उत्तर के लिए धन्यवाद। क्या RegenerateOverviews () गदलदडो के समान है? क्या आपके पास काम करने का एक उदाहरण है? मैं कुछ ऐसा ही करने की कोशिश कर रहा हूँ, जैसे कि गालदादो-आर का औसत "D: \ image.tif"
fpolig01

@ fpolig01 इस पोस्ट से पता चलता हैBuildOverviews() (जो वास्तव में मैं क्या पाया जब मैं खोज रहा था RegenerateOverviews) - शायद कि एक कोशिश दे?
rcoup

8

@ आर्कबप का उत्तर केवल मेरे लिए काम करता है, यदि इसे निम्न प्रकार से संशोधित किया जाए:

from osgeo import gdal 

vrt_options = gdal.BuildVRTOptions(resampleAlg='cubic', addAlpha=True)
my_vrt = gdal.BuildVRT('my.vrt', ['one.tif', 'two.tif'], options=vrt_options)
my_vrt = None

अन्यथा, फ़ाइल डिस्क पर नहीं लिखी गई है।


JensL धन्यवाद! क्या आप my_vrt का अंतर्ज्ञान समझा सकते हैं = डिस्क पर लिखने के लिए कोई नहीं? बस वास्तव में अजीब लगता है
mmann1123

3
@ mmann1123 : अन्यथा यह काम नहीं करता था और मेरे मन में था कि GDAL API ट्यूटोरियल ने कहा: "ध्यान दें कि CreateCopy () विधि एक लेखन योग्य डेटासेट लौटाती है, और यह संपूर्ण लेखन को पूरा करने के लिए ठीक से बंद होना चाहिए और डेटासेट को डिस्क में फ्लश करना होगा पायथन मामले में यह स्वचालित रूप से तब होता है जब "dst_ds" दायरे से बाहर हो जाता है। " Sthce closingpython के लिए कोई भी चीज नहीं है , आपको अपने vrtदायरे से बाहर लाना होगा , इसे असाइन करके None
जेन्सएल

दरअसल, उन्होंने इस समस्या को ठीक किया (देखें osgeo-org.1560.x6.nabble.com/… )
umbe1987
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.