GeoTiff图像使用gdal读取为numpy数组中的全零

时间:2018-04-06 09:27:09

标签: python gis gdal geotiff

我正在尝试从landsat8 geotiff文件读取像素值和坐标,但在将文件作为数组读取后,它只显示我的geotiff文件的零。我使用以下代码来读取文件:

from osgeo import gdal
gtif = gdal.Open( "FileName.TIF" )
band = gtif.GetRasterBand(1)
print(band.ReadAsArray())

“FileName.TIF”是Landsat的乐队形象之一。

我还想遍历整个图像并获取坐标,因此请建议是否有任何简单的方法来遍历图像。 这是我正在使用的图像链接::

https://drive.google.com/open?id=1SqJ2dQLzqsQFUM61vPWe2u2z_R6Zeqa0 

1 个答案:

答案 0 :(得分:1)

您阅读图片的方式似乎没问题。但是,您只能通过打印来验证图像是否全为零。它只打印角落,因此您只会看到零,因为您的图像在所有角落都没有值。

您可以使用numpy验证是否存在大于0的某个值。将您的代码更改为以下内容。请注意,现在最后它将打印39935,这是光栅的最大值(并且不是零)

from osgeo import gdal
import numpy as np
gtif = gdal.Open( "test.tif" )
band = gtif.GetRasterBand(1)
bandArray = band.ReadAsArray()
print(bandArray)
print(np.max(bandArray))

为了获取特定像素的坐标,您可以使用与获取栅格右下角坐标相同的方法。

ulx, xres, xskew, uly, yskew, yres  = gtif.GetGeoTransform()
lrx = ulx + (gtif.RasterXSize * xres)
lry = uly + (gtif.RasterYSize * yres)

在上面的代码ulx中,uly是左上角的坐标。这可以直接从栅格中提取。 xresyres是每个像素的大小。鉴于此,右下角坐标lrxlry可以根据前面提到的值计算。

现在,为了找到图像中任何像素的坐标,您只需将gtif.RasterXSizegtif.RasterYSize替换为您需要坐标的像素条目。

ulx, xres, xskew, uly, yskew, yres  = gtif.GetGeoTransform()
xCoord = ulx + (pixelX * xres)
yCoord = uly + (pixelY * yres)

因此,为了获得它,可以通过以下方式获取每个像素坐标

ulx, xres, xskew, uly, yskew, yres  = gtif.GetGeoTransform()
for x in range(0, gtif.RasterXSize):
  for y in range(0, gtif.RasterYSize):
    xCoord = ulx + (x * xres)
    yCoord = uly + (y * yres)
    # now do something with the coordinate