2017-02-23 85 views
1

我想要獲取tif光柵文件的最大和最小像素值。GDAL:GetMaximum和GetMinimum不返回任何值

我使用GetMaximum()和GetMinimum()方法,但他們返回任何結果,因此我得到的錯誤是: TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'

該文件是用於測試的小型TIF光柵。我確實在幾天前的其他柵格上也遇到了同樣的錯誤。

這是我一直在努力:

from osgeo import gdal 

driver = gdal.GetDriverByName('GTiff') 
in_file = gdal.Open("L8_field.tif") 
band1 = in_file.GetRasterBand(1) 
barray = band1.ReadAsArray() 

# Getting the interval value and setting the classes 
max_value = band1.GetMaximum() 
min_value = band1.GetMinimum() 

tot_classes = 5 
class_1 = class_x + min_value 
class_x = (max_value - min_value)/tot_classes 
class_2 = (class_x * 2) + min_value 
class_3 = (class_x * 3) + min_value 
class_4 = (class_x * 4) + min_value 
class_5 = max_value 
... 

我使用這光柵分類。所以有更多的代碼實際上對它進行分類。這段代碼旨在抓住相等的時間間隔。

我缺少什麼?

回答

0

我不知道爲什麼RasterBand.GetMaximum()RasterBand.GetMinimum()返回None。也許在GTiff可以實時訪問該值之前需要計算一個柵格屬性表?

您可以對numpy.ndarray變量barray執行類似的操作。

import numpy as np 
# ... 
max_value = np.amax(barray) 
min_value = np.amin(barray) 

這裏顯而易見的問題是,如果無數據值是最小值或最大值,在這種情況下,會返回到您的不滿。 Landsat有nodata = 0。

您可以通過製作一個蒙版數組並使用蒙版數組的minmax方法來解決這個問題。

import numpy as np 
# ... 
masked_arr = np.ma.MaskedArray(barray, mask=(barray==0)) 
max_value = masked_arr.max() 
min_value = masked_arr.min() 
+0

numpy解決了它!非常感謝你。我必須首先用「barray [np.isnan(barray)] = 0」將所有nan值設置爲0。正如你所說,我不得不掩蓋0值。之後,計算工作,我現在有一個很好的分類圖像。這個問題似乎與Gdal或Gtiff驅動程序有關,但我不知道是什麼。 – Majkiboy

+0

@Majkiboy如果NoDataValue是'np.nan',那麼使用'np.isnan'來製作蒙板,而不是將NoData像素設置爲0,可能會更安全。如果數值0在光柵內已經有效,那麼這些像素可能會被錯誤地忽略。 –