使用类“ GeotiffReader”时,“ TIFF文件缺少必需的标签StripOffsets”

时间:2018-09-05 14:46:41

标签: java tiff geotiff worldwind

有一个问题:使用某些* .tiff,当尝试使用NASA WorldWind库类GeotiffReader中的readDataRaster()方法获取DataRaster []时,抛出异常:

  

错误j.l.Throwable-java.io.IOException:TIFF文件丢失   必需的tagStripOffsets

下面是与* .tiff一起使用的代码。 代码:

private GeotiffReader reader;
private ByteBufferRaster raster;
...
reader = new GeotiffReader(file);
listDataRaster.add(reader.readDataRaster());
...
DataRaster[] dataRaster = listDataRaster.get(iter);
raster = (ByteBufferRaster)dataRaster[0];
...
raster.setDoubleAtPosition(y, x, value);

该错误发生在该行:

listDataRaster.add(reader.readDataRaster()); 

该方法尝试返回DataRaster []并给出上述错误。

我的任务是获取* .tiff ByteBufferRaster,然后使用setDoubleAtPosition对网格进行一些计算后进行更改,然后重写* .tiff。如何解决此错误?如果没有,还有其他方法可以完成我的任务吗?

1 个答案:

答案 0 :(得分:0)

谢谢大家,我们要求通过ExtendedGDALDataRaster解决此问题

DataRasterReaderFactory readerFactory = (DataRasterReaderFactory) WorldWind
                .createConfigurationComponent(AVKey.DATA_RASTER_READER_FACTORY_CLASS_NAME);
DataRasterReader dataRasterReader;
DataRaster[] dataRasters = null;
...
dataRasterReader = readerFactory.findReaderFor(file, null);
dataRasters = dataRasterReader.read(file, null);
...
rasterGdal = (ExtendedGDALDataRaster) dataRasters[0];

ElevationModel elevationModelFromGlobe = GLOBE.getElevationModel(); 
Sector boundingSector = rasterGdal.getSector();
int[] heightAndWidth = new int[2];  

// Method for creating an empty sector by analogy with the current one  
recalculationHeightAndWidth (boundingSector, elevationModelFromGlobe, heightAndWidth);


// Method to create default parameters for the sector
AVList params = getParams(boundingSector, heightAndWidth[1], heightAndWidth[0]);
raster = (ByteBufferRaster) ByteBufferRaster.createGeoreferencedRaster(params);

Dataset dataset = rasterGdal.getBestSuitedDataset(heightAndWidth[1], heightAndWidth[0], rasterGdal.getSector());
band = dataset.GetRasterBand(1);

然后因为您可以从* .tiff获取任意点的高度值,并根据您的判断将其更改(将在数据中)

float[] data = new float[1];
band.ReadRaster(x, y, 1, 1, band.getDataType(), data);