保存 3D 蒙版阵列

Saving 3D masked array

我正在尝试使用以下代码将 3D masked_array 数据保存到文件中:

print "Writing results to a file..."
format = "GTiff"
driver = gdal.GetDriverByName(format)

fileName = 'path_to_folder/FLENAME.tif'
NumberOfBands = 46

new_dataset = driver.Create( fileName, 2400, 2400, NumberOfBands,gdal.GDT_Float32)
new_dataset = None

for band in range( NumberOfBands ):
    new_dataset.GetRasterBand(band + 1).WriteArray(DATA[band,:,:])

有了这个我得到了错误: 'NoneType' object has no attribute 'GetRasterBand'

我在没有 GetRasterband 的情况下尝试了它并获得了 'NoneType' object is not attainable

最初尝试 np.save 作为替代方法,但未实施,建议改用此方法。

如有任何帮助,我们将不胜感激。

谢谢。

更新: 由于 Kevin 的建议,原始错误已解决。 然而在保存文件后,检查它包含所需的数据显示所有值都是 0.0.

-根据 Mike T 的建议解决了这个问题。但是它似乎只保存了原始的未屏蔽数组,而不是所需的 masked_array.

有问题的数据是表面反射率的屏蔽 (masked_array) MODIS 文件。不需要的像素是被屏蔽的值。

new_dataset = None

尝试删除这一行。否则,在此之后访问 new_dataset 属性的所有尝试都将失败。

我推荐阅读Gotchas in the GDAL and OGR Python Bindings。一般来说,你可以通过启用异常来更好地调试,在顶部:

gdal.UseExceptions()

至于您看到所有 0.0 值的原因是您可能需要通过取消引用 bandnew_dataset 来编写数据集。这可以在底部完成:

new_dataset = band = None  # save, close

要写入屏蔽数组,您需要设置一个 NoDataValue。例如,如果您希望 -9999.0 表示没有数据,则:

NODATA = -9999
for bdx in range(new_dataset.RasterCount):
    band = new_dataset.GetRasterBand(bdx + 1)
    band.SetNoDataValue(NODATA)
    band.WriteArray(DATA[bdx].filled(NODATA))
new_dataset = band = None  # save, close

您也可以考虑使用更 Pythonic 的东西,参见 rasterio。例如:

import rasterio
with rasterio.open(fileName, 'w', 'GTiff', 2400, 2400, NumberOfBands, dtype='f',
                   masked=True, nodata=NODATA) as r:
    r.write(DATA.astype('f'))

通过将数据掩码更改为:

设法解决了问题

mask = np.where( quality == 0, 1, 0 )

然后在保存时将掩码与原始数据相乘,如下所示:

for band in range( NumberOfBands ):
    out_band=new_dataset.GetRasterBand(band + 1)
    out_band.WriteArray( databand[band,:,:] * mask[band] )

new_dataset = band = None

我认为问题可能是将掩码应用于原始数据数组产生了一个掩码数组,其中包含所有原始数据值和真假值的掩码。保存并在文件中读回时忽略保存数组的掩码部分,然后绘制所有原始值。如上所述,通过将掩码乘以数据来解决此问题,从而仅保存掩码允许的值并解决问题。

感谢您的帮助。