GDAL:GetMaximum 和 GetMinimum returns 没有值
GDAL: GetMaximum and GetMinimum returns no values
我正在尝试获取 tif 光栅文件的最大和最小像素值。
我正在使用 GetMaximum() 和 GetMinimum() 方法,但它们 return 什么都没有,因此我得到的错误是:
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
...
我正在使用它对栅格进行分类。所以实际上对它进行分类的代码更多。此代码段旨在获取相等的间隔。
我错过了什么?
我不知道为什么 RasterBand.GetMaximum()
和 RasterBand.GetMinimum()
return None
。在 GTiff 可以动态访问该值之前,可能需要计算栅格属性 table?
您可以对numpy.ndarray
变量barray
进行类似的操作。
import numpy as np
# ...
max_value = np.amax(barray)
min_value = np.amin(barray)
这里的明显问题是 nodata 值是最小值还是最大值,在这种情况下 return 会让您不高兴。 Landsat 没有数据=0。
您可以通过制作一个屏蔽数组并使用屏蔽数组的 min
和 max
方法来解决这个问题。
import numpy as np
# ...
masked_arr = np.ma.MaskedArray(barray, mask=(barray==0))
max_value = masked_arr.max()
min_value = masked_arr.min()
为了使 gdal 的 .GetMinimum() 和 .GetMaximum() 达到 return 值,您首先必须计算波段的统计数据。否则,它显示为 none。至少,这是我对 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())
我正在尝试获取 tif 光栅文件的最大和最小像素值。
我正在使用 GetMaximum() 和 GetMinimum() 方法,但它们 return 什么都没有,因此我得到的错误是:
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
...
我正在使用它对栅格进行分类。所以实际上对它进行分类的代码更多。此代码段旨在获取相等的间隔。
我错过了什么?
我不知道为什么 RasterBand.GetMaximum()
和 RasterBand.GetMinimum()
return None
。在 GTiff 可以动态访问该值之前,可能需要计算栅格属性 table?
您可以对numpy.ndarray
变量barray
进行类似的操作。
import numpy as np
# ...
max_value = np.amax(barray)
min_value = np.amin(barray)
这里的明显问题是 nodata 值是最小值还是最大值,在这种情况下 return 会让您不高兴。 Landsat 没有数据=0。
您可以通过制作一个屏蔽数组并使用屏蔽数组的 min
和 max
方法来解决这个问题。
import numpy as np
# ...
masked_arr = np.ma.MaskedArray(barray, mask=(barray==0))
max_value = masked_arr.max()
min_value = masked_arr.min()
为了使 gdal 的 .GetMinimum() 和 .GetMaximum() 达到 return 值,您首先必须计算波段的统计数据。否则,它显示为 none。至少,这是我对 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())