X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2Fsrtm%2FSrtmViewfinderSource.java;fp=src%2Ftim%2Fprune%2Ffunction%2Fsrtm%2FSrtmViewfinderSource.java;h=9a4066aa73e24d86b3d7690be5dcf90b6cc985fc;hb=2c77855cfb5ff50825996091360098634d1d75ed;hp=0000000000000000000000000000000000000000;hpb=9c79031b2f544a30fdb4377f365d7d0a348eb008;p=GpsPrune.git diff --git a/src/tim/prune/function/srtm/SrtmViewfinderSource.java b/src/tim/prune/function/srtm/SrtmViewfinderSource.java new file mode 100644 index 0000000..9a4066a --- /dev/null +++ b/src/tim/prune/function/srtm/SrtmViewfinderSource.java @@ -0,0 +1,172 @@ +package tim.prune.function.srtm; + +import java.io.File; +import java.io.FileReader; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.IOException; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.HttpURLConnection; +import java.util.HashMap; + +import tim.prune.GpsPrune; +import tim.prune.I18nManager; + +public class SrtmViewfinderSource extends SrtmSource { + /** URL prefix for all tiles */ + private static final String URL_PREFIX = "http://viewfinderpanoramas.org/"; + private HashMap _tile_lookup = null; + + public SrtmViewfinderSource() + { + } + + public String getNameKey() + { + return "function.downloadsrtm." + getName(); + } + + public String getName() + { + return "SRTM_Viewfinder"; + } + + protected String getSourceExtension() + { + return ".zip"; + } + + /** + * Read the dat file and get the contents + * @return byte array containing file contents + */ + private void populateLookup() + throws SrtmSourceException + { + BufferedReader in = null; + try + { + // in = SrtmViewfinderSource.class.getResourceAsStream("viewfinder/tiles.db"); + _tile_lookup = new HashMap(); + in = new BufferedReader(new InputStreamReader(SrtmViewfinderSource.class.getResourceAsStream("/tim/prune/function/srtm/viewfinder/tiles.dat"))); + String line; + while ((line = in.readLine()) != null) + { + String[] parts = line.split(" "); + SrtmTile tile = new SrtmTile(Integer.parseInt(parts[0]), Integer.parseInt(parts[1])); + _tile_lookup.put(tile, parts[2]); + } + } + catch (Exception e) { + throw new SrtmSourceException("Exception trying to read tiles.db: " + e); + } + finally + { + try { + in.close(); + } + catch (Exception e) {} // ignore + } + } + + /** + * Get the Url for the given tile + * @param inTile Tile to get + * @return URL + */ + private URL buildUrl(SrtmTile inTile) + throws SrtmSourceException + { + if (_tile_lookup == null) + { + populateLookup(); + } + System.out.println(_tile_lookup.get(inTile)); + String path = _tile_lookup.get(inTile); + if (path == null) + { + int key = inTile.hashCode(); + System.out.println("inTile hashcode " + key); + for (HashMap.Entry e : _tile_lookup.entrySet()) + { + if (e.getKey().getLatitude() == 51) + { + System.out.println(e.getKey().getTileName() + " - " + e.getKey().hashCode() + " -> " + e.getValue()); + } + } + throw new SrtmSourceException("tile not in database "+inTile.getTileName()); + } + try + { + return new URL(URL_PREFIX + path + getSourceExtension()); + } + catch (MalformedURLException e) + { + e.printStackTrace(); + throw new SrtmSourceException(e.getMessage()); + } + } + + public boolean isReadyToUse() + { + return true; + } + + public boolean downloadTile(SrtmTile inTile) + throws SrtmSourceException + { + int redirects = 5; + URL tileUrl = buildUrl(inTile); + File outputFile = getCacheFileName(inTile); + System.out.println("Download: Need to download: " + tileUrl); + + try + { + HttpURLConnection conn = (HttpURLConnection) tileUrl.openConnection(); + + // Define streams + FileOutputStream outStream = null; + InputStream inStream = null; + + conn.setRequestProperty("User-Agent", "GpsPrune v" + GpsPrune.VERSION_NUMBER); + + int status = conn.getResponseCode(); + if (status == 200) + { + inStream = conn.getInputStream(); + } + else if (status == 404) + { + throw new SrtmSourceException("Tile not found: "+conn.getURL()); + } + else + { + throw new SrtmSourceException("Invalid response from server: " +status+conn.getContent()); + } + + outStream = new FileOutputStream(outputFile); + + int c; + while ((c = inStream.read()) != -1) + { + outStream.write(c); + } + // Make sure streams are closed + try {inStream.close();} catch (Exception e) {} + try {outStream.close();} catch (Exception e) {} + return true; + } + catch (IOException e) + { + throw new SrtmSourceException("Error while downloading tile "+inTile.getTileName()+": "+e.getMessage()); + } + } + + public int getRowSize(SrtmTile inTile) + { + return 1201; + } +}