package org.droidplanner.services.android.impl.core.srtm;
import org.droidplanner.services.android.impl.core.srtm.Srtm.OnProgressListner;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class SrtmData {
private String path;
private File srtmFile;
private BufferedInputStream s;
public SrtmData(String dir) {
path = dir;
}
public int load(double lon, double lat, OnProgressListner listner) throws Exception {
int altitude;
String fname = SrtmData.getName(lon, lat);
setupFilePaths(fname);
downloadSrtmFileIfNeeded(fname, listner);
s = new BufferedInputStream(new FileInputStream(srtmFile));
altitude = readHtgFile(s, lon, lat);
s.close();
return altitude;
}
private void downloadSrtmFileIfNeeded(String fname, OnProgressListner listner) throws Exception {
if (!srtmFile.exists()) {
new SrtmDownloader(listner).downloadSrtmFile(fname, path);
}
}
private void setupFilePaths(String fname) {
srtmFile = new File(path + "/" + fname);
}
private int readHtgFile(BufferedInputStream s, double lon, double lat) throws Exception {
byte[] buffer = new byte[2];
int index = calculateFileIndex(lon, lat);
skipToDataPositionInFile(index);
s.read(buffer);
return ByteBuffer.wrap(buffer).order(ByteOrder.BIG_ENDIAN).getShort();
}
private void skipToDataPositionInFile(int index) throws Exception {
if (s.skip(index) != index) {
throw new Exception("error when skipping");
}
}
private int calculateFileIndex(double lon, double lat) {
int ai = (int) Math.round(1200d * (lat - Math.floor(lat)));
int aj = (int) Math.round(1200d * (lon - Math.floor(lon)));
int index = (aj + (1200 - ai) * 1201) * 2;
return index;
}
static String getName(double Dlon, double Dlat) {
int lon = (int) Math.floor(Dlon);
int lat = (int) Math.floor(Dlat);
String dirlat = "N";
if (lat < 0) {
dirlat = "S";
}
String dirlon = "E";
if (lon < 0) {
dirlon = "W";
}
String st = String.valueOf(Math.abs(lat));
while (st.length() < 2) {
st = "0" + st;
}
String fname = dirlat + st;
st = String.valueOf(Math.abs(lon));
while (st.length() < 3) {
st = "0" + st;
}
fname = fname + dirlon + st + ".hgt";
return fname;
}
}