GDAL:GetMaximum和GetMinimum不返回值

时间:2017-02-23 16:51:25

标签: python gis gdal

我正在尝试获取tif光栅文件的最大和最小像素值。

我正在使用GetMaximum()和GetMinimum()方法,但它们什么也没有返回,因此我得到的错误是: TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'

in文件是一个用于测试目的的小型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
...

我用这个来对光栅进行分类。所以有更多的代码实际上对它进行了分类。此片段旨在获取相等的间隔。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

我不确切地知道为什么RasterBand.GetMaximum()RasterBand.GetMinimum()会返回None。也许在GTiff可以动态访问该值之前需要计算栅格属性表吗?

您可以对numpy.ndarray变量barray执行类似的操作。

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

这里显而易见的问题是,如果nodata值是最小值或最大值,在这种情况下,这将返回到您的不满。 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()

答案 1 :(得分:0)

为了使gdal的.GetMinimum()和.GetMaximum()返回值,您首先必须计算频段上的统计信息。否则,它将显示为无。至少,这就是我对Sentinel1雷达图像和干涉图的经验。
一些示例代码。

raster = gdal.Open('YourRasterFile.tiff') # open raster file
band = raster.GetRasterBand(1) # get data into varialbe 'band' so we can actually look at it. 

band.GetMetadata()
if band.GetMinimum is None or band.GetMaximum() is None:
    print("\nGDAL thinks this file has no values: ", file)
    print("[ MAX ] =", band.GetMaximum())
    print("[ MIN ] =", band.GetMinimum())

if band.GetMinimum() is None or band.GetMaximum() is None:
    band.ComputeStatistics(0)

band.GetMetadata()
if band.GetMinimum is None or band.GetMaximum() is None:
    print("\nBollucks to this: ", file)
    print("[ MAX ] =", band.GetMaximum())
    print("[ MIN ] =", band.GetMinimum())
else: 
    print("\nHey, it worked.")
    print("[ MAX ] =", band.GetMaximum())
    print("[ MIN ] =", band.GetMinimum())