保存 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 值的原因是您可能需要通过取消引用 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。例如:
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
我认为问题可能是将掩码应用于原始数据数组产生了一个掩码数组,其中包含所有原始数据值和真假值的掩码。保存并在文件中读回时忽略保存数组的掩码部分,然后绘制所有原始值。如上所述,通过将掩码乘以数据来解决此问题,从而仅保存掩码允许的值并解决问题。
感谢您的帮助。
我正在尝试使用以下代码将 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 值的原因是您可能需要通过取消引用 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。例如:
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
我认为问题可能是将掩码应用于原始数据数组产生了一个掩码数组,其中包含所有原始数据值和真假值的掩码。保存并在文件中读回时忽略保存数组的掩码部分,然后绘制所有原始值。如上所述,通过将掩码乘以数据来解决此问题,从而仅保存掩码允许的值并解决问题。
感谢您的帮助。