保存3D蒙版数组

时间:2015-08-04 14:32:57

标签: python arrays save mask gdal

我尝试使用以下代码将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作为替代方案,但未实施,建议尝试使用此方法。

任何帮助都将不胜感激。

感谢。

更新 凯文的建议解决了原始错误。 但是在保存文件后,检查包含所需数据的文件显示所有值均为0.0。

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

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

3 个答案:

答案 0 :(得分:2)

我建议阅读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。 E.g:

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

答案 1 :(得分:1)

[ '  ', '', '  other', '  ' ]

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

答案 2 :(得分:0)

通过将数据掩码更改为:

来管理以解决问题

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

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

感谢您的帮助。