是这样的,在栅格运算过程中,要对每一块像元处理,因为有的像元不存在值,项目背景是,获取的为海洋区域的温度、盐度、风场等信息,因此陆地部分无值,海洋中被云层遮挡部分无值,所以,要将所有的无值区域不参与计算。
ENVI中打开,看到海洋区域中明显的黑点,显示为-999.
栅格运算中,-999需要剔除掉,才能和其他像元点计算,栅格计算重要用到了一个python脚本(需要用到的可以去我的资源页下载)。
下面介绍掩膜方法增加无值区域的判定,并在最终结果影像中显示无值区域为-999,这一部分是原生gdal python没有的。
# create empty buffer to mark where nodata occurs myNDVs=numpy.zeros(myBufSize) myNDVs.shape=(nYValid,nXValid) my999=numpy.zeros(myBufSize) my999.shape=(nYValid,nXValid)
myNDVs是原始无值区域掩膜,其用处是将所有无值的区域标注出来,用来以后无值区域的判定。
在这里增加了my999数组,初始值为0,大小为栅格图像的大小。
for i,Alpha in enumerate(myAlphaList): # populate lettered arrays with values myval=BandReadAsArray(myFiles[i].GetRasterBand(myBands[i]), xoff=myX, yoff=myY, win_xsize=nXValid, win_ysize=nYValid) # fill in nodata values myNDVs=1*numpy.logical_or(myNDVs==1, myval==myNDV[i]) my999=1*numpy.logical_or(my999==1, myval==-999) # create an array of values for this block exec("%s=myval" %Alpha) myval=None
my999是一个0值数组,遍历影像过程中,将值为-999的数字设置为1,这里用到了numpy 的逻辑或语句,满足:my999=1或者myval=-999的像元即为1,而为1的像元是要记录下来的。
# propogate nodata values # (set nodata cells to zero then add nodata value to these cells) myResult = ((1*(myNDVs==0))*myResult) + (myOutNDV*myNDVs) myResult = ((1*(my999==0))*myResult) + (-999*my999)
myResult是结果影像数组,这是用来将其输出的,my999为1的区域,要加-999*my999,这样就在结果影像中将所有的无值区域设置为-999了。
关键思想:掩膜。
自己体悟去吧。