我正在尝试从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
答案 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
是左上角的坐标。这可以直接从栅格中提取。 xres
和yres
是每个像素的大小。鉴于此,右下角坐标lrx
和lry
可以根据前面提到的值计算。
现在,为了找到图像中任何像素的坐标,您只需将gtif.RasterXSize
和gtif.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