अजगर में जीडीएएल के साथ एक भूलेख पढ़ना, संशोधित करना और लिखना


11

मैं पायथन GDAL बाइंडिंग और सुपीरियर का उपयोग करके रिमोट सेंसिंग इमेज प्रोसेसिंग के रस्सियों को सीखने की कोशिश कर रहा हूं। पहले प्रयास के रूप में, मैं एक लैंडसैट 8 जियोटीफ़ फ़ाइल पढ़ रहा हूं, एक सरल हेरफेर करें और परिणाम को एक नई फ़ाइल में लिखें। नीचे दिया गया कोड ठीक काम करता प्रतीत होता है, सिवाय इसके कि मूल रेखापुंज को आउटपुट फ़ाइल में डंप किया जाता है, बजाय हेरफेर किए हुए रेखापुंज के।

किसी भी टिप्पणी या सुझाव का स्वागत है, लेकिन विशेष रूप से इस बात पर ध्यान दें कि परिणाम में हेरफेर करने वाले रैस्टर क्यों नहीं दिखाते हैं।

import os
import gdal

gdal.AllRegister()

file = "c:\~\LC81980242015071LGN00.tiff"
(fileRoot, fileExt) = os.path.splitext(file)
outFileName = fileRoot + "_mod" + fileExt

ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()

[cols, rows] = arr.shape
arr_min = arr.Min()
arr_max = arr.Max()
arr_mean = int(arr.mean())

arr_out = numpy.where((arr < arr_mean), 10000, arr)

driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outband = outdata.GetRasterBand(1)
outband.WriteArray(arr_out)
outdata = None

print arr_min
> 0
print arr_max
> 65535
print arr_mean
> 4856

मैं विंडोज 7 32 बिट मशीन पर पायथन 2.7.1 का उपयोग करता हूं।


मुझे यह एक डेम (उबंटू, अजगर 2.7.1) पर काम करने के लिए मिला और इसने अपेक्षित परिणाम उत्पन्न किया, जिसका मतलब 10000 के नीचे सेट किए गए औसत मूल्य से कम है और एक नए टिफ को लिखा गया है। आप नई छवि पर जियोट्रांसफ़ॉर्म की प्रतिलिपि नहीं बना रहे हैं, इसलिए यह अप्रमाणित है, इसलिए आपको इसे देखने की कोशिश करते समय कारक की आवश्यकता हो सकती है (ऐसा करने के लिए एक-लाइनर है लेकिन मुझे इसे खोदने की आवश्यकता होगी)। यदि आप अपने प्रश्न को आउटपुट से gdainfo -stats original.tiffऔर gdal-config --versionभी मदद कर सकते हैं।
स्टीवन केए

नमस्ते, इस में देखने के लिए धन्यवाद! मुझे पता है कि मैंने जियोट्रांसफॉर्म की उपेक्षा की, बाद में उस पर चबाने के लिए सोचा। मैं पूरे आउटपुट की छवि को देखता हूं (हालांकि इरफानव्यू का उपयोग करके), ताकि यह नहीं हो सके कि मुझे लगता है। जब आप सीट पर वापस आएंगे तो मैं आपके द्वारा अनुरोधित जानकारी उत्पन्न करूँगा।
हंस Roelofsen

नमस्ते, मैं आपके द्वारा पूछी गई जानकारी प्रदान करने के लिए संघर्ष कर रहा हूँ। मैं Python GDAL बाइंडिंग का उपयोग कर रहा हूं और मैं अनिश्चित हूं कि आप जिस आदेश को निर्दिष्ट करते हैं वह पायथन कमांड के अनुरूप है। किसी भी स्थिति में, मैं GDAL-1.11.2-cp27-none-win32 का उपयोग कर रहा हूं, जैसा कि यहां से प्राप्त किया गया है । मैं मूल .tiff पर कुछ आँकड़े के साथ अपनी पोस्ट अपडेट करूँगा।
हंस Roelofsen 20

arr_min क्या होगा?
फ्लुइडमिशन ऑक्ट

arr_min = 0. मैंने यह दिखाने के लिए पोस्ट अपडेट की है। धन्यवाद!
हंस रुएलोसेन

जवाबों:


13

आपकी स्क्रिप्ट ds.FlushCache विधि याद आ रही है, जो संशोधनों के अंत में आपके पास मेमोरी में डिस्क को सहेजती है। अपने उदाहरण के सही संस्करण के नीचे देखें। ध्यान दें कि मैंने इनपुट के रूप में प्रक्षेपण और जियोट्रांसफॉर्म सेट करने के लिए दो लाइनें भी जोड़ीं

import os
import gdal

file = "path+filename"
ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
[cols, rows] = arr.shape
arr_min = arr.min()
arr_max = arr.max()
arr_mean = int(arr.mean())
arr_out = numpy.where((arr < arr_mean), 10000, arr)
driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outdata.SetGeoTransform(ds.GetGeoTransform())##sets same geotransform as input
outdata.SetProjection(ds.GetProjection())##sets same projection as input
outdata.GetRasterBand(1).WriteArray(arr_out)
outdata.GetRasterBand(1).SetNoDataValue(10000)##if you want these values transparent
outdata.FlushCache() ##saves to disk!!
outdata = None
band=None
ds=None

आउटफिट का अनुमान नहीं है। मैं एक एचडीएफ 5 फ़ाइल पढ़ रहा हूं और उस बैंड से प्रोजेक्शन का चयन करता हूं जिसे मैं निर्यात करना चाहता हूं GetProjection()सही ईपीएसजी वितरित करता है, लेकिन यह लागू नहीं होता है। GDAL ताना गायब? धन्यवाद!
माइकल

मुझे outdata.GetRasterBand(1).WriteArray(arr_out)एक मल्टीस्पेक्ट्रल छवि लिखने के लिए क्या बदलना चाहिए जिसमें एक से अधिक बैंड हैं?
साई किरण 19

Driver.Create में "1" बैंड की संख्या को इंगित करता है। फिर आप प्रत्येक बैंड पर Outataata.GetRasterBand (band_number) के साथ लिख सकते हैं। यह 1 पर शुरू होता है, शून्य पर नहीं।
एंड्रिया मस्सेटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.