我尝试使用以下代码将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文件。不需要的像素是被屏蔽的值。
答案 0 :(得分:2)
我建议阅读Gotchas in the GDAL and OGR Python Bindings。通常,您可以通过在顶部启用异常来更好地调试:
gdal.UseExceptions()
至于为什么你看到所有0.0值都是你可能需要编写数据集,解除引用band
和new_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
我认为问题可能是将掩码应用于原始数据阵列会产生一个掩码数组,其中包含所有原始数据值和一个真假值的掩码。保存并在文件中读回时,忽略已保存数组的掩码部分,然后绘制所有原始值。通过将掩码乘以数据来解决这个问题,从而只保存掩码允许的值并解决问题。
感谢您的帮助。