GDAL中的栅格数据类型
计算机中存储的栅格数据的像元都有数据类型,如整型,浮点型。不同的数据类型定义在gdalconst模块里。
首先看一下具体的用法以及返回的结果。
from osgeo import gdalconstdir(gdalconst)
在全部的结果中以GDT开头的就是数值的数据类型。想要查看栅格数据中某一波段的数据类型,只需要查看波段的DataType属性即可。
from osgeo import gdalrds = gdal.Open("C:/Users/WangTianli/Desktop/GDAL/Landsat/Washington/geotiff_file.tif")band=rds.GetRasterBand(1)band.DataType
1
其返回结果为整型。但是1代表什么含义呢?下表列出gdalconst与整型的对应值。
未知或未指定类型
gdalconst.GDT_Unknown
08位无符号整型
gdalconst.GDT_Byte
116位无符号整型
gdalconst.GDT_UInt16
216位整型
gdalconst.GDT_Int16
332位无符号整型
gdalconst.GDT_UInt32
432位整型值
gdalconst.GDT_Int32
532位浮点型
gdalconst.GDT_Float32
664位浮点型
gdalconst.GDT_Float64
716位复数整型
gdalconst.GDT_CInt16
832位复数整型
gdalconst.GDT_CInt32
932位复数浮点型
gdalconst.GDT_CFloat32
1064位复数浮点型
gdalconst.GDT_CFloat64
11
2.访问数据集的数据
为了对遥感影像进行处理,需要进一步访问遥感影像中的数据, 即影像中像元的灰度值。
GDAL提供了下面两个函数来访问影像的数值。
ReadRaster()
读取图像数据(以二进制的形式)ReadAsArray()
读取图像数据(以数组的形式)
这是两个非常重要的函数,它们可以直接读取图像的数据, 从而对栅格数据进行分析。可以看到两个函数的帮助中有许多的参数。解释一下:
xoff,yoff
:指定想要读取的部分原点位置在整张图像中相对于全图原点的位置(以像元为单位)。xsize,ysize
:指定要读取部分图像的矩形的长和宽(以像元为单位)。buf_xsize,buf_ysize
:可以在读取出一部分图像后进行缩放。那么就用这两个参数来定义缩放后图像最终的宽和高,gdal将帮你缩放到这个大小。buf_type
:可以对读出的数据的类型进行转换(比如原图数据类型是short,你要把它们缩小成byte)。band_list
:适应多波段的情况。可以指定要读取的波段。
dataset = gdal.Open("C:/Users/WangTianli/Desktop/GDAL/Landsat/gdata/lu75c.tif")help(dataset.ReadRaster)
Help on method ReadRaster in module osgeo.gdal:
ReadRaster(xoff=0, yoff=0, xsize=None, ysize=None, buf_xsize=None, buf_ysize=None, buf_type=None, band_list=None, buf_pixel_space=None, buf_line_space=None, buf_band_space=None, resample_alg=0, callback=None, callback_data=None) method of osgeo.gdal.Dataset instance
上面的 help() 函数查看gdal方法
help(dataset.ReadAsArray)
Help on method ReadAsArray in module osgeo.gdal:
ReadAsArray(xoff=0, yoff=0, xsize=None, ysize=None, buf_obj=None, buf_xsize=None, buf_ysize=None, buf_type=None, resample_alg=0, callback=None, callback_data=None, interleave='band') method of osgeo.gdal.Dataset instance
Reading a chunk of a GDAL band into a numpy array. The optional (buf_xsize,buf_ysize,buf_type)
parameters should generally not be specified if buf_obj is specified. The array is returned
dataset.RasterCount
1
from numpy import *dataset.ReadAsArray(2500,2500,3,3)
array([[12, 12, 12],
[12, 12, 12],
[12, 12, 12]], dtype=int16)
dataset.ReadRaster(2500,2500,3,3)
b'\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00'
我们就把图像左上角位于(2500, 2500),宽高都为3个像元的数据读取出来了。这两个函数返回的结果不一样,其中ReadAsArray()
读出的是numpy的数组,类型为int16;而ReadData()
读出的是二进制型。
3.访问波段中的数据
使用了 ReadAsArray()
,返回的是numpy模块定义的Array。
rds.RasterCount
3
band = rds.GetRasterBand(1)band.ReadAsArray(100,100,5,5,10,10)
array([[236, 236, 237, 237, 237, 237, 237, 237, 227, 227],
[236, 236, 237, 237, 237, 237, 237, 237, 227, 227],
[235, 235, 232, 232, 233, 233, 234, 234, 225, 225],
[235, 235, 232, 232, 233, 233, 234, 234, 225, 225],
[242, 242, 235, 235, 232, 232, 233, 233, 224, 224],
[242, 242, 235, 235, 232, 232, 233, 233, 224, 224],
[254, 254, 244, 244, 238, 238, 237, 237, 229, 229],
[254, 254, 244, 244, 238, 238, 237, 237, 229, 229],
[246, 246, 246, 246, 248, 248, 250, 250, 235, 235],
[246, 246, 246, 246, 248, 248, 250, 250, 235, 235]], dtype=uint8)
前两个100是取值窗口的左上角在实际数据中所处像元的(x, y)位置。 中间两个是取值窗口覆盖的区域大小, 再后面是取值窗口取出数组进行缩放后数组的大小。最后两个参是对取值窗口取出数据进行缩放后的数组的大小。需要注意的是这里的最后两个参数是可选的,如果不指定则和中间两个参数保持一致。
假如取值窗口大小是20 × 20,取出后数组就可以人工设置大小。让它成为10 × 10的数组,或者是40 × 40的数组。如果设置成20 × 40的数组则取出的数组对于真实图像来说有了变形。
这里需要注意的是缩的情况(缩的时候是取几个周围点的平均值) 如果是调色板数据就可能引发问题。
栅格数据范围的处理
band.XSize
1500
band.YSize
500
band.ReadAsArray(1496,896,5,5)
None
可以看到,出错了。获取数据的时候不能越界, 调用的时候要判断越界没。