130 lines
3.2 KiB
Java
130 lines
3.2 KiB
Java
package btools.mapcreator;
|
|
|
|
/**
|
|
* 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
|
|
*/
|
|
|
|
import java.io.BufferedInputStream;
|
|
import java.io.BufferedReader;
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.InputStream;
|
|
import java.io.InputStreamReader;
|
|
import java.util.StringTokenizer;
|
|
import java.util.zip.ZipEntry;
|
|
import java.util.zip.ZipInputStream;
|
|
|
|
public class SrtmData
|
|
{
|
|
private SrtmRaster raster;
|
|
|
|
public SrtmData( File file ) throws Exception
|
|
{
|
|
raster = new SrtmRaster();
|
|
|
|
ZipInputStream zis = new ZipInputStream( new BufferedInputStream( new FileInputStream( file ) ) );
|
|
try
|
|
{
|
|
for ( ;; )
|
|
{
|
|
ZipEntry ze = zis.getNextEntry();
|
|
if ( ze.getName().endsWith( ".asc" ) )
|
|
{
|
|
readFromStream( zis );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
zis.close();
|
|
}
|
|
}
|
|
|
|
public SrtmRaster getRaster()
|
|
{
|
|
return raster;
|
|
}
|
|
|
|
private String secondToken( String s )
|
|
{
|
|
StringTokenizer tk = new StringTokenizer( s, " " );
|
|
tk.nextToken();
|
|
return tk.nextToken();
|
|
}
|
|
|
|
public void readFromStream( InputStream is ) throws Exception
|
|
{
|
|
BufferedReader br = new BufferedReader( new InputStreamReader( is ) );
|
|
int linenr = 0;
|
|
for ( ;; )
|
|
{
|
|
linenr++;
|
|
if ( linenr <= 6 )
|
|
{
|
|
String line = br.readLine();
|
|
if ( linenr == 1 )
|
|
raster.ncols = Integer.parseInt( secondToken( line ) );
|
|
else if ( linenr == 2 )
|
|
raster.nrows = Integer.parseInt( secondToken( line ) );
|
|
else if ( linenr == 3 )
|
|
raster.xllcorner = Double.parseDouble( secondToken( line ) );
|
|
else if ( linenr == 4 )
|
|
raster.yllcorner = Double.parseDouble( secondToken( line ) );
|
|
else if ( linenr == 5 )
|
|
raster.cellsize = Double.parseDouble( secondToken( line ) );
|
|
else if ( linenr == 6 )
|
|
{
|
|
// nodata ignored here ( < -250 assumed nodata... )
|
|
// raster.noDataValue = Short.parseShort( secondToken( line ) );
|
|
raster.eval_array = new short[raster.ncols * raster.nrows];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int row = 0;
|
|
int col = 0;
|
|
int n = 0;
|
|
boolean negative = false;
|
|
for ( ;; )
|
|
{
|
|
int c = br.read();
|
|
if ( c < 0 )
|
|
break;
|
|
if ( c == ' ' )
|
|
{
|
|
if ( negative )
|
|
n = -n;
|
|
short val = n < -250 ? Short.MIN_VALUE : (short) (n);
|
|
|
|
raster.eval_array[row * raster.ncols + col] = val;
|
|
if ( ++col == raster.ncols )
|
|
{
|
|
col = 0;
|
|
++row;
|
|
}
|
|
n = 0;
|
|
negative = false;
|
|
}
|
|
else if ( c >= '0' && c <= '9' )
|
|
{
|
|
n = 10 * n + ( c - '0' );
|
|
}
|
|
else if ( c == '-' )
|
|
{
|
|
negative = true;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
br.close();
|
|
}
|
|
}
|