PCIDSK(通常为.pix)格式允许将具有多种数据类型的频段保存在同一文件中。我的文件包含“U16”,“U8”和“BIT”频道。
GDAL能够正确解释数据集:
ds = gdal.Open("myfile.pix")
for i in range(1,ds.RasterCount+1):
print ds.GetRasterBand(i).DataType, ds.GetRasterBand(i).GetDescription()
它将“U16”波段解释为gdalconst.GDT_UInt16
(2),将“U8”和“BIT”解释为gdalconst.GDT_Byte
(1)。我可以使用正确的乐队名称以正确的顺序查看原始文件中的所有乐队。
问题是当我尝试将数据提取到numpy数组时。当我尝试通常的ds.GetRasterBand(1).ReadAsArray()
时,pythonw.exe崩溃(甚至在控制台中都没有出错)。
我注意到我能够通过指定要提取的区域来正确提取一些数据,但是当区域包含一个特定像素时,它仍会崩溃,这与文件的不同。给定的像素对于所有“U16”和“U8”层都是有问题的。
对于文件9494(X)x 9609(Y),它仅在以下位置失败:
ds.GetRasterBand(1).ReadAsArray(8704,9472,1,1)
对于文件9193(X)x 9293(Y),它仅在以下位置失败:
ds.GetRasterBand(1).ReadAsArray(5376,9216,1,1)
原始数据中的像素没有什么值得注意的。我注意到不可读的位置将位于原始交错的瓦片256x256瓦片的边缘。
似乎能够使用.ReadAsArray()正确处理“BIT”图层,而不是“U16”和“U8”。
机器有足够的内存,我能够读取和创建更大的其他数据集。
作为旁注,如果有人知道如何创建具有多种数据类型的PCIDSK文件,那么创建问题的工作示例将对我有用。
使用Python 2.7.11,Numpy 1.10.2,gdal bindings 1.11.3。