/** * This is a wrapper for a 5*5 degree srtm file in ascii/zip-format * * - filter out unused nodes according to the way file * - enhance with SRTM elevation data * - split further in smaller (5*5 degree) tiles * * @author ab */ package btools.mapcreator; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class SrtmData { public int ncols; public int nrows; public double xllcorner; public double yllcorner; public double cellsize; public int nodata_value; public short[] eval_array; private double minlon; private double minlat; public void init() { minlon = xllcorner; minlat = yllcorner; } private boolean missingData = false; public short getElevation( int ilon, int ilat ) { double lon = ilon / 1000000. - 180.; double lat = ilat / 1000000. - 90.; double dcol = (lon - minlon)/cellsize -0.5; double drow = (lat - minlat)/cellsize -0.5; int row = (int)drow; int col = (int)dcol; if ( col < 0 ) col = 0; if ( col >= ncols-1 ) col = ncols - 2; if ( row < 0 ) row = 0; if ( row >= nrows-1 ) row = nrows - 2; double wrow = drow-row; double wcol = dcol-col; missingData = false; double eval = (1.-wrow)*(1.-wcol)*get(row ,col ) + ( wrow)*(1.-wcol)*get(row+1,col ) + (1.-wrow)*( wcol)*get(row ,col+1) + ( wrow)*( wcol)*get(row+1,col+1); return missingData ? Short.MIN_VALUE : (short)(eval); } private short get( int r, int c ) { short e = eval_array[r*ncols + c ]; if ( e == Short.MIN_VALUE ) missingData = true; return e; } public SrtmData( File file ) throws Exception { ZipInputStream zis = new ZipInputStream( new FileInputStream( file ) ); try { for(;;) { ZipEntry ze = zis.getNextEntry(); if ( ze.getName().endsWith( ".asc" ) ) { readFromStream( zis ); /* // test int[] ca = new int[]{ 50477121, 8051915, // 181 50477742, 8047408, // 154 50477189, 8047308, // 159 }; for( int i=0; i