在Matlab中,我使用块处理一个大的(geo) tiff文件(按10 In的顺序),该文件只包含一个32位浮点数据的频带。
我现在的问题是,块(或者更具体的tifflib )突然无法编写一个平铺。这与输入文件、硬盘/文件位置或其他参数(如处理、Matlab版本,甚至OS )无关。
通常情况下,它总是在相同的二甲苯附近( linux为3372,Windows 10为#3176 )。
但是,当使用更小版本的大型文件(大约为4Gb而不是10 4Gb)时,阻塞会贯穿整个过程。
这是我得到的错误消息(Debian 64位,Matlab2014 b):
Warning: The following error was caught while executing 'images.internal.TileHandle'
class destructor:
Unable to write tile #3684.
> In TileCache>TileCache.setTile at 71
In TiffAdapter>TiffAdapter.getTileHandle at 560
In TiffAdapter>TiffAdapter.writeRegion at 354
In blockproc>putBlock at 879
In blockproc>serialLoop at 459
In blockproc at 340
In removeEGM at 13
Warning: The following error was caught while executing 'images.internal.TileHandle'
class destructor:
Unable to write tile #3685.
> In TileCache>TileCache.setTile at 71
In TiffAdapter>TiffAdapter.getTileHandle at 560
In TiffAdapter>TiffAdapter.writeRegion at 354
In blockproc>putBlock at 879
In blockproc>serialLoop at 459
In blockproc at 340
In removeEGM at 13
Warning: The following error was caught while executing 'images.internal.TileHandle'
class destructor:
Unable to write tile #3686.
> In TileCache>TileCache.setTile at 71
In TiffAdapter>TiffAdapter.getTileHandle at 560
In TiffAdapter>TiffAdapter.writeRegion at 354
In blockproc>putBlock at 879
In blockproc>serialLoop at 459
In blockproc at 340
In removeEGM at 13
Warning: The following error was caught while executing 'images.internal.TileHandle'
class destructor:
Unable to write tile #3687.
> In TileCache>TileCache.setTile at 71
In TiffAdapter>TiffAdapter.getTileHandle at 560
In TiffAdapter>TiffAdapter.writeRegion at 354
In blockproc>putBlock at 879
In blockproc>serialLoop at 459
In blockproc at 340
In removeEGM at 13
Error using tifflib
Unable to write tile #3372.
Error in Tiff/writeEncodedTile (line 1602)
tifflib('writeEncodedTile',obj.FileID,tileNumber-1,varargin{:});
Error in images.internal.TiffAdapter/writeBlock (line 420)
obj.TiffObj.writeEncodedTile(blockId, block);
Error in images.internal.TiffAdapter/writeRegion (line 377)
obj.writeBlock(blockId, data(ry - start(1) + 1, ...
Error in blockproc>putBlock (line 879)
dest.writeRegion(start_loc,...
Error in blockproc/serialLoop (line 459)
putBlock(options.Destination,row,col,output_block,output_size);
Error in blockproc (line 340)
serialLoop();
Error in removeEGM (line 13)
blockproc(in_dem, [3000, 3000], my_fun, 'Destination', out_dem);发布于 2017-05-12 15:13:56
感谢@haraldK的评论,我找到了解决方案:
Matlab可以无问题地读取BigTiffs (imread()),并编写它们,但是块只能读取BigTiffs,而不能写它们。
作为一种解决办法,我编写了自己的imageAdapter,基于这个:https://blogs.mathworks.com/steve/2013/08/07/tiff-bigtiff-and-blockproc/
基本上,我只更改了与tiff标签相关的行,以适应我的数据(32位浮点数,只有一个通道,没有压缩等等)。然后简单地用gdal复制原始文件中的地理引用。
obj.TiffObject.setTag('ImageLength', obj.ImageSize(1));
obj.TiffObject.setTag('ImageWidth', obj.ImageSize(2));
obj.TiffObject.setTag('TileLength', obj.TileLength);
obj.TiffObject.setTag('TileWidth', obj.TileWidth);
obj.TiffObject.setTag('Photometric', Tiff.Photometric.MinIsBlack);
obj.TiffObject.setTag('BitsPerSample', 32);
obj.TiffObject.setTag('SampleFormat', Tiff.SampleFormat.IEEEFP);
obj.TiffObject.setTag('SamplesPerPixel', 1);
obj.TiffObject.setTag('ResolutionUnit', Tiff.ResolutionUnit.Inch);
obj.TiffObject.setTag('Orientation', 1);
obj.TiffObject.setTag('Compression', Tiff.ResolutionUnit.None);
obj.TiffObject.setTag('PlanarConfiguration', Tiff.PlanarConfiguration.Chunky); https://stackoverflow.com/questions/43915035
复制相似问题