/** * test */ public static void main(String[] argv) { try { GeoTiff geotiff = new GeoTiff("/home/yuanho/tmp/ilatlon_float.tif"); //GeoTiff geotiff = new GeoTiff("/home/yuanho/tmp/maxtemp.tif"); //GeoTiff geotiff = new GeoTiff("/home/yuanho/tmp/test.tif"); //GeoTiff geotiff = new GeoTiff("C:/data/geotiff/c41078a1.tif"); //GeoTiff geotiff = new GeoTiff("C:/data/geotiff/L7ETMbands147.tif"); //GeoTiff geotiff = new GeoTiff("data/blueTest.tiff"); /*GeoTiff geotiff = new GeoTiff("data/testWrite.tiff"); geotiff.addTag( new IFDEntry(Tag.SampleFormat, FieldType.SHORT, 3)); geotiff.write(); geotiff.close(); geotiff = new GeoTiff("data/testWrite.tiff"); */ geotiff.read(); geotiff.showInfo(System.out); geotiff.testReadData(); geotiff.close(); } catch (Exception e) { e.printStackTrace(); } }
void testReadData() throws IOException { IFDEntry tileOffsetTag = findTag(Tag.TileOffsets); if (tileOffsetTag != null) { int tileOffset = tileOffsetTag.value[0]; IFDEntry tileSizeTag = findTag(Tag.TileByteCounts); int tileSize = tileSizeTag.value[0]; System.out.println("tileOffset =" + tileOffset + " tileSize=" + tileSize); testReadData(tileOffset, tileSize); } else { IFDEntry stripOffsetTag = findTag(Tag.StripOffsets); if (stripOffsetTag != null) { int stripOffset = stripOffsetTag.value[0]; IFDEntry stripSizeTag = findTag(Tag.StripByteCounts); int stripSize = stripSizeTag.value[0]; System.out.println("stripOffset =" + stripOffset + " stripSize=" + stripSize); testReadData(stripOffset, stripSize); } } }
/** * Read the geotiff file, using the filename passed in the constructor. * * @throws IOException on read error */ public void read() throws IOException { file = new RandomAccessFile(filename, "r"); channel = file.getChannel(); if (debugRead) System.out.println("Opened file to read:'" + filename + "', size=" + channel.size()); readonly = true; int nextOffset = readHeader(channel); while (nextOffset > 0) { nextOffset = readIFD(channel, nextOffset); parseGeoInfo(); } //parseGeoInfo(); }
void writeMetadata(int imageNumber) throws IOException { if (file == null) init(); // geokeys all get added at once writeGeoKeys(); // tags gotta be in order Collections.sort(tags); if (imageNumber == 1) { writeHeader(channel); } else { //now this is not the first image we need to fill the Offset of nextIFD channel.position(lastIFD); ByteBuffer buffer = ByteBuffer.allocate(4); if (debugRead) System.out.println("position before writing nextIFD= " + channel.position() + " IFD is " + firstIFD); buffer.putInt(firstIFD); buffer.flip(); channel.write(buffer); } writeIFD(channel, firstIFD); }
nextStart = geotiff.writeData((byte[]) result.getStorage(), imageNumber); } else { ArrayFloat result = replaceMissingValues(grid, data); nextStart = geotiff.writeData((float[]) result.getStorage(), imageNumber); int width = data.getShape()[1]; // X int size = elemSize * height * width; // size in bytes geotiff.addTag(new IFDEntry(Tag.ImageWidth, FieldType.SHORT).setValue(width)); geotiff.addTag(new IFDEntry(Tag.ImageLength, FieldType.SHORT).setValue(height)); geotiff.addTag(new IFDEntry(Tag.NewSubfileType, FieldType.SHORT).setValue(ff)); geotiff.addTag(new IFDEntry(Tag.PageNumber, FieldType.SHORT).setValue(page, 2)); geotiff.addTag(new IFDEntry(Tag.RowsPerStrip, FieldType.SHORT).setValue(1)); //height)); geotiff.addTag(new IFDEntry(Tag.StripByteCounts, FieldType.LONG, width).setValue(sbytecount)); geotiff.addTag(new IFDEntry(Tag.StripOffsets, FieldType.LONG, width).setValue(soffset)); geotiff.addTag(new IFDEntry(Tag.Orientation, FieldType.SHORT).setValue(1)); geotiff.addTag(new IFDEntry(Tag.Compression, FieldType.SHORT).setValue(1)); // no compression geotiff.addTag(new IFDEntry(Tag.Software, FieldType.ASCII).setValue("nc2geotiff")); geotiff.addTag(new IFDEntry(Tag.PhotometricInterpretation, FieldType.SHORT).setValue(1)); // black is zero : not used? geotiff.addTag(new IFDEntry(Tag.PlanarConfiguration, FieldType.SHORT).setValue(1)); geotiff.addTag(new IFDEntry(Tag.BitsPerSample, FieldType.SHORT).setValue(8)); // 8 bits per sample geotiff.addTag(new IFDEntry(Tag.SamplesPerPixel, FieldType.SHORT).setValue(1)); geotiff.addTag(new IFDEntry(Tag.XResolution, FieldType.RATIONAL).setValue(1, 1)); geotiff.addTag(new IFDEntry(Tag.YResolution, FieldType.RATIONAL).setValue(1, 1));
@Test public void testRead() throws IOException { try (GeoTiff geotiff = new GeoTiff(filename)) { geotiff.read(); StringWriter sw = new StringWriter(); geotiff.showInfo(new PrintWriter(sw)); logger.debug(sw.toString()); IFDEntry tileOffsetTag = geotiff.findTag(Tag.TileOffsets); if (tileOffsetTag != null) { int tileOffset = tileOffsetTag.value[0]; IFDEntry tileSizeTag = geotiff.findTag(Tag.TileByteCounts); int tileSize = tileSizeTag.value[0]; logger.debug("tileOffset={} tileSize={}", tileOffset, tileSize); } else { IFDEntry stripOffsetTag = geotiff.findTag(Tag.StripOffsets); if (stripOffsetTag != null) { int stripOffset = stripOffsetTag.value[0]; IFDEntry stripSizeTag = geotiff.findTag(Tag.StripByteCounts); if (stripSizeTag == null) throw new IllegalStateException(); int stripSize = stripSizeTag.value[0]; logger.debug("stripOffset={} stripSize={}", stripOffset, stripSize); } } } }
@Test public void testWrite() throws IOException { String fileOut = tempFolder.newFile().getAbsolutePath(); try (GeoTiffWriter2 writer = new GeoTiffWriter2(fileOut)) { writer.writeGrid(filename, field, 0, 0, true, llbb); } // read it back in try (GeoTiff geotiff = new GeoTiff(fileOut)) { geotiff.read(); System.out.println("geotiff read in = " + geotiff.showInfo()); //geotiff.testReadData(); } } }
geotiff.addTag(new IFDEntry(Tag.ImageWidth, FieldType.SHORT).setValue(width)); geotiff.addTag(new IFDEntry(Tag.ImageLength, FieldType.SHORT).setValue(height)); geotiff.addTag(new IFDEntry(Tag.NewSubfileType, FieldType.SHORT).setValue(ff)); geotiff.addTag(new IFDEntry(Tag.PageNumber, FieldType.SHORT).setValue(page, 2)); geotiff.addTag(new IFDEntry(Tag.RowsPerStrip, FieldType.SHORT).setValue(1)); //height)); geotiff.addTag(new IFDEntry(Tag.StripByteCounts, FieldType.LONG, width).setValue(sbytecount)); geotiff.addTag(new IFDEntry(Tag.StripOffsets, FieldType.LONG, width).setValue(soffset)); geotiff.addTag(new IFDEntry(Tag.Orientation, FieldType.SHORT).setValue(1)); geotiff.addTag(new IFDEntry(Tag.Compression, FieldType.SHORT).setValue(1)); // no compression geotiff.addTag(new IFDEntry(Tag.Software, FieldType.ASCII).setValue("nc2geotiff")); geotiff.addTag(new IFDEntry(Tag.PhotometricInterpretation, FieldType.SHORT).setValue(1)); // black is zero : not used? geotiff.addTag(new IFDEntry(Tag.PlanarConfiguration, FieldType.SHORT).setValue(1)); geotiff.addTag(new IFDEntry(Tag.BitsPerSample, FieldType.SHORT).setValue(8)); // 8 bits per sample geotiff.addTag(new IFDEntry(Tag.SamplesPerPixel, FieldType.SHORT).setValue(1)); geotiff.addTag(new IFDEntry(Tag.XResolution, FieldType.RATIONAL).setValue(1, 1)); geotiff.addTag(new IFDEntry(Tag.YResolution, FieldType.RATIONAL).setValue(1, 1)); geotiff.addTag(new IFDEntry(Tag.ResolutionUnit, FieldType.SHORT).setValue(1)); geotiff.addTag(new IFDEntry(Tag.BitsPerSample, FieldType.SHORT).setValue(32)); // 32 bits per sample geotiff.addTag(new IFDEntry(Tag.SampleFormat, FieldType.SHORT).setValue(3)); // Sample Format geotiff.addTag(new IFDEntry(Tag.SamplesPerPixel, FieldType.SHORT).setValue(1)); float min = (float) (dataMinMax.min); float max = (float) (dataMinMax.max);
geotiff.initTags();
void setTransform(double xStart, double yStart, double xInc, double yInc) { // tie the raster 0, 0 to xStart, yStart addTag(new IFDEntry(Tag.ModelTiepointTag, FieldType.DOUBLE).setValue( new double[]{0.0, 0.0, 0.0, xStart, yStart, 0.0})); // define the "affine transformation" : requires grid to be regular (!) addTag(new IFDEntry(Tag.ModelPixelScaleTag, FieldType.DOUBLE).setValue( new double[]{xInc, yInc, 0.0})); }
int writeData(byte[] data, int imageNumber) throws IOException { if (file == null) init(); if (imageNumber == 1) channel.position(headerSize); else channel.position(nextOverflowData); ByteBuffer buffer = ByteBuffer.wrap(data); channel.write(buffer); if (imageNumber == 1) firstIFD = headerSize + data.length; else firstIFD = data.length + nextOverflowData; return nextOverflowData; }
/** * Constructor * * @param fileOut name of output file. */ public GeotiffWriter(String fileOut) { geotiff = new GeoTiff(fileOut); }
/** * Write the geotiff Tag information to a String. */ public String showInfo() { StringWriter sw = new StringWriter(5000); showInfo(new PrintWriter(sw)); return sw.toString(); }
private void parseGeoInfo() { IFDEntry keyDir = findTag(Tag.GeoKeyDirectoryTag); IFDEntry dparms = findTag(Tag.GeoDoubleParamsTag); IFDEntry aparams = findTag(Tag.GeoAsciiParamsTag); IFDEntry data = findTag(Tag.get(location)); if (data == null) { System.out.println("********ERROR parseGeoInfo: cant find Tag code = " + location);
geotiff.initTags(); if (greyScale) { ArrayByte result = replaceMissingValuesAndScale(array, data, dataMinMax); nextStart = geotiff.writeData((byte[]) result.getStorage(), pageNumber); } else { ArrayFloat result = replaceMissingValues(array, data, dataMinMax); nextStart = geotiff.writeData((float[]) result.getStorage(), pageNumber);
public void close() throws IOException { geotiff.close(); }
void writeMetadata(int imageNumber) throws IOException { if (file == null) init(); // geokeys all get added at once writeGeoKeys(); // tags gotta be in order Collections.sort(tags); if (imageNumber == 1) { writeHeader(channel); } else { //now this is not the first image we need to fill the Offset of nextIFD channel.position(lastIFD); ByteBuffer buffer = ByteBuffer.allocate(4); if (debugRead) System.out.println("position before writing nextIFD= " + channel.position() + " IFD is " + firstIFD); buffer.putInt(firstIFD); buffer.flip(); channel.write(buffer); } writeIFD(channel, firstIFD); }
nextStart = geotiff.writeData((byte[]) result.getStorage(), imageNumber); } else { ArrayFloat result = replaceMissingValues(grid, data); nextStart = geotiff.writeData((float[]) result.getStorage(), imageNumber); int height = data.getShape()[0]; // Y int width = data.getShape()[1]; // X geotiff.addTag(new IFDEntry(Tag.ImageWidth, FieldType.SHORT).setValue(width)); geotiff.addTag(new IFDEntry(Tag.ImageLength, FieldType.SHORT).setValue(height)); geotiff.addTag(new IFDEntry(Tag.NewSubfileType, FieldType.SHORT).setValue(ff)); geotiff.addTag(new IFDEntry(Tag.PageNumber, FieldType.SHORT).setValue(page, 2)); geotiff.addTag(new IFDEntry(Tag.RowsPerStrip, FieldType.SHORT).setValue(1)); //height)); geotiff.addTag(new IFDEntry(Tag.StripByteCounts, FieldType.LONG, width).setValue(sbytecount)); geotiff.addTag(new IFDEntry(Tag.StripOffsets, FieldType.LONG, width).setValue(soffset)); geotiff.addTag(new IFDEntry(Tag.Orientation, FieldType.SHORT).setValue(1)); geotiff.addTag(new IFDEntry(Tag.Compression, FieldType.SHORT).setValue(1)); // no compression geotiff.addTag(new IFDEntry(Tag.Software, FieldType.ASCII).setValue("nc2geotiff")); geotiff.addTag(new IFDEntry(Tag.PhotometricInterpretation, FieldType.SHORT).setValue(1)); // black is zero : not used? geotiff.addTag(new IFDEntry(Tag.PlanarConfiguration, FieldType.SHORT).setValue(1)); geotiff.addTag(new IFDEntry(Tag.BitsPerSample, FieldType.SHORT).setValue(8)); // 8 bits per sample geotiff.addTag(new IFDEntry(Tag.SamplesPerPixel, FieldType.SHORT).setValue(1)); geotiff.addTag(new IFDEntry(Tag.XResolution, FieldType.RATIONAL).setValue(1, 1)); geotiff.addTag(new IFDEntry(Tag.YResolution, FieldType.RATIONAL).setValue(1, 1));