2017-02-23 5 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에서 유사한 작업을 수행 할 수 있습니다. NODATA 값이 불만에 반환되는 경우에 최소 또는 최대 어느 경우

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"으로 모든 나노 값을 0으로 설정해야했습니다. 그리고 당신이 말했듯이 나는 0 값을 가려야했습니다. 그 후에 계산이 작동하고 나는 이제 멋지게 분류 된 이미지를가집니다. 문제는 Gdal 또는 Gtiff 드라이버와 관련이있는 것 같지만 무엇을 모릅니다. – Majkiboy

+0

@Majkiboy NoDataValue가'np.nan' 인 경우 NoData 픽셀을 0으로 설정하는 대신 np.isnan을 사용하여 마스크를 만드는 것이 더 안전 할 수 있습니다. 0 값이 이미 래스터에서 유효하면 거짓으로 무시 될 수 있습니다. –