1 package tim.prune.function.srtm;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.util.zip.ZipEntry;
8 import java.util.zip.ZipInputStream;
10 public abstract class SrtmSource {
11 public abstract String getName();
12 public abstract boolean isReadyToUse();
13 public abstract boolean downloadTile(SrtmTile inTile)
14 throws SrtmSourceException;
15 public abstract int getRowSize(SrtmTile inTile);
16 protected abstract String getSourceExtension();
18 protected int[] slurpTileHeigths(ZipInputStream inStream, int tileSize)
21 int[] heights = new int[tileSize];
22 // Read entire file contents into one byte array
23 for (int i = 0; i < heights.length; i++)
25 heights[i] = inStream.read() * 256 + inStream.read();
26 if (heights[i] >= 32768) {heights[i] -= 65536;}
33 public int[] getTileHeights(SrtmTile inTile)
34 throws SrtmSourceException
36 File cacheFileName = getCacheFileName(inTile);
37 if (cacheFileName == null)
39 throw new SrtmSourceException("Tile "+inTile.getTileName()+" not in cache");
43 ZipInputStream inStream = new ZipInputStream(new FileInputStream(cacheFileName));
44 ZipEntry entry = inStream.getNextEntry();
45 int rowSize = getRowSize(inTile);
46 int tileSize = rowSize * rowSize;
47 if (entry.getSize() != 2 * tileSize)
49 throw new SrtmSourceException("Tile file "+cacheFileName+" does not have the expected size");
51 return slurpTileHeigths(inStream, tileSize);
55 throw new SrtmSourceException("Failure opening "+cacheFileName+" for reading:"+e.getMessage());
60 protected File getCacheDir()
62 return SrtmDiskCache.getCacheDir(getName());
65 protected File getCacheFileName(SrtmTile inTile)
67 String fileName = inTile.getTileName() + getSourceExtension();
68 return new File(getCacheDir(), fileName);
71 public boolean isCached(SrtmTile inTile)
73 File cachedFileName = getCacheFileName(inTile);
74 return cachedFileName != null &&
75 getCacheFileName(inTile).exists();