Rev 3408 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
* Copyright (C) 2009 Christian Gawron
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* Author: Christian Gawron
* Create date: 03-Jul-2009
*/
package uk.me.parabola.mkgmap.reader.dem.optional;
import java.awt.*;
import java.awt.image.Raster;
import java.awt.image.renderable.ParameterBlock;
import java.io.IOException;
import java.io.Writer;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import javax.media.jai.RenderedOp;
import uk.me.parabola.imgfmt.ExitException;
import uk.me.parabola.mkgmap.reader.dem.DEM;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codec.TIFFDecodeParam;
public abstract class GeoTiffDEM
extends DEM
{
Raster raster
;
String fileName
;
int minLat, minLon, maxLat, maxLon
;
PlanarImage image
;
void initData
()
{
try {
SeekableStream s =
new FileSeekableStream
(fileName
);
ParameterBlock pb =
new ParameterBlock();
pb.
add(s
);
TIFFDecodeParam param =
new TIFFDecodeParam
();
pb.
add(param
);
RenderedOp op = JAI.
create("tiff", pb
);
image = op.
createInstance();
System.
out.
printf("Image: %d %d %d %d\n", image.
getWidth(), image.
getHeight(),
image.
getNumXTiles(), image.
getNumYTiles());
}
catch (Exception e
) {
throw new ExitException
("Failed to open/process " + fileName, e
);
}
}
protected static class CGIAR
extends GeoTiffDEM
{
public CGIAR
(String dataPath,
double minLat,
double minLon,
double maxLat,
double maxLon
)
{
this.
lat =
((int) (minLat/
5))*5;
this.
lon =
((int) (minLon/
5))*5;
if (maxLat
> lat+
5 || maxLon
> lon+
5)
throw new ExitException
("Area too large (must not span more than one CGIAR GeoTIFF)");
int tileX =
(180 + lon
) /
5 +
1;
int tileY =
(60 - lat
) /
5;
this.
fileName =
String.
format("%s/srtm_%02d_%02d.tif", dataPath, tileX, tileY
);
System.
out.
printf("CGIAR GeoTIFF: %s\n", fileName
);
N =
6000;
M =
6000;
res =
5.0/M
;
initData
();
}
public void serializeCopyRight
(Writer out
) throws IOException
{
out.
write(" <copyright>\n");
out.
write(" Contour lines generated from improved SRTM data by CIAT-CSI (see http://srtm.csi.cgiar.org)\n");
out.
write(" </copyright>\n");
}
protected void read
(int minLon,
int minLat,
int maxLon,
int maxLat
)
{
this.
minLon = minLon
;
this.
minLat = minLat
;
this.
maxLon = maxLon
;
this.
maxLat = maxLat
;
raster = image.
getData(new Rectangle(minLon,
6000-maxLat-
1, maxLon-minLon+
1, maxLat-minLat+
1));
System.
out.
printf("read: %d %d %d %d\n", minLon,
6000-maxLat-
1, maxLon-minLon+
1, maxLat-minLat+
1);
}
public double ele
(int x,
int y
)
{
int elevation = raster.
getPixel(x,
6000-y-
1,
(int[])null)[0];
return elevation+delta
;
}
}
protected static class ASTER
extends GeoTiffDEM
{
public ASTER
(String dataPath,
double minLat,
double minLon,
double maxLat,
double maxLon
)
{
this.
lat =
(int) minLat
;
this.
lon =
(int) minLon
;
if (maxLat
> lat+
1 || maxLon
> lon+
1)
throw new ExitException
("Area too large (must not span more than one ASTER GeoTIFF)");
String northSouth = lat
< 0 ? "S" :
"N";
String eastWest = lon
> 0 ? "E" :
"W";
fileName =
String.
format("%s/ASTGTM_%s%02d%s%03d_dem.tif", dataPath,
northSouth, lat
< 0 ? -lat : lat,
eastWest, lon
< 0 ? -lon : lon
);
System.
out.
printf("ASTER GeoTIFF: %s\n", fileName
);
N =
3600;
M =
3600;
res =
1.0/M
;
initData
();
}
public void serializeCopyRight
(Writer out
) throws IOException
{
out.
write(" <copyright>\n");
out.
write(" Contour lines generated from DGM data by ASTER (see https://wist.echo.nasa.gov/~wist/api/imswelcome)\n");
out.
write(" </copyright>\n");
}
protected void read
(int minLon,
int minLat,
int maxLon,
int maxLat
)
{
this.
minLon = minLon
;
this.
minLat = minLat
;
this.
maxLon = maxLon
;
this.
maxLat = maxLat
;
raster = image.
getData(new Rectangle(minLon,
3601-maxLat-
1, maxLon-minLon+
1, maxLat-minLat+
1));
System.
out.
printf("read: %d %d %d %d\n", minLon,
3601-maxLat-
1, maxLon-minLon+
1, maxLat-minLat+
1);
}
public double ele
(int x,
int y
)
{
int elevation = raster.
getPixel(x,
3601-y-
1,
(int[])null)[0];
return elevation+delta
;
}
}
}