package btools.mapcreator; import java.io.*; import btools.util.*; // // Encode/decode a raster // public class RasterCoder { public void encodeRaster(SrtmRaster raster, OutputStream os) throws IOException { DataOutputStream dos = new DataOutputStream(os); long t0 = System.currentTimeMillis(); dos.writeInt(raster.ncols); dos.writeInt(raster.nrows); dos.writeBoolean(raster.halfcol); dos.writeDouble(raster.xllcorner); dos.writeDouble(raster.yllcorner); dos.writeDouble(raster.cellsize); dos.writeShort(raster.noDataValue); _encodeRaster(raster, os); long t1 = System.currentTimeMillis(); System.out.println("finished encoding in " + (t1 - t0) + " ms"); } public SrtmRaster decodeRaster(InputStream is) throws IOException { DataInputStream dis = new DataInputStream(is); long t0 = System.currentTimeMillis(); SrtmRaster raster = new SrtmRaster(); raster.ncols = dis.readInt(); raster.nrows = dis.readInt(); raster.halfcol = dis.readBoolean(); raster.xllcorner = dis.readDouble(); raster.yllcorner = dis.readDouble(); raster.cellsize = dis.readDouble(); raster.noDataValue = dis.readShort(); raster.eval_array = new short[raster.ncols * raster.nrows]; _decodeRaster(raster, is); raster.usingWeights = true; long t1 = System.currentTimeMillis(); System.out.println("finished decoding in " + (t1 - t0) + " ms"); return raster; } private void _encodeRaster(SrtmRaster raster, OutputStream os) throws IOException { MixCoderDataOutputStream mco = new MixCoderDataOutputStream(os); int nrows = raster.nrows; int ncols = raster.ncols; short[] pixels = raster.eval_array; int colstep = raster.halfcol ? 2 : 1; for (int row = 0; row < nrows; row++) { short lastval = Short.MIN_VALUE; // nodata for (int col = 0; col < ncols; col += colstep ) { short val = pixels[row * ncols + col]; if ( val == -32766 ) { val = lastval; // replace remaining (border) skips } else { lastval = val; } // remap nodata int code = val == Short.MIN_VALUE ? -1 : ( val < 0 ? val-1 : val ); mco.writeMixed( code ); } } mco.flush(); } private void _decodeRaster(SrtmRaster raster, InputStream is) throws IOException { MixCoderDataInputStream mci = new MixCoderDataInputStream(is); int nrows = raster.nrows; int ncols = raster.ncols; short[] pixels = raster.eval_array; int colstep = raster.halfcol ? 2 : 1; for (int row = 0; row < nrows; row++) { for (int col = 0; col < ncols; col += colstep ) { int code = mci.readMixed(); // remap nodata int v30 = code == -1 ? Short.MIN_VALUE : ( code < 0 ? code + 1 : code ); if ( v30 > -32766 ) { v30 *= 2; } pixels[row * ncols + col] = (short) ( v30 ); } if ( raster.halfcol ) { for (int col = 1; col < ncols-1; col += colstep ) { int l = (int)pixels[row * ncols + col - 1]; int r = (int)pixels[row * ncols + col + 1]; short v30 = Short.MIN_VALUE; // nodata if ( l > -32766 && r > -32766 ) { v30 = (short)((l+r)/2); } pixels[row * ncols + col] = v30; } } } } }