X-Git-Url: https://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2Fsrtm%2FDownloadSrtmFunction.java;fp=src%2Ftim%2Fprune%2Ffunction%2Fsrtm%2FDownloadSrtmFunction.java;h=0350ce38ddc7af88508523fa9b2f9f7ef14d41be;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/function/srtm/DownloadSrtmFunction.java b/src/tim/prune/function/srtm/DownloadSrtmFunction.java new file mode 100644 index 0000000..0350ce3 --- /dev/null +++ b/src/tim/prune/function/srtm/DownloadSrtmFunction.java @@ -0,0 +1,222 @@ +package tim.prune.function.srtm; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; + +import javax.swing.JOptionPane; + +import tim.prune.App; +import tim.prune.GenericFunction; +import tim.prune.GpsPrune; +import tim.prune.I18nManager; +import tim.prune.config.Config; +import tim.prune.data.DoubleRange; +import tim.prune.gui.ProgressDialog; + +/** + * Class to provide a download function for the Space Shuttle's SRTM data files. + * HGT files are downloaded into memory via HTTP and stored in the map cache. + */ +public class DownloadSrtmFunction extends GenericFunction implements Runnable +{ + /** Progress dialog */ + private ProgressDialog _progress = null; + /** Flag to check whether this function is currently running or not */ + private boolean _running = false; + + + /** + * Constructor + * @param inApp App object + */ + public DownloadSrtmFunction(App inApp) { + super(inApp); + } + + /** @return name key */ + public String getNameKey() { + return "function.downloadsrtm"; + } + + /** + * Begin the download + */ + public void begin() + { + _running = true; + if (_progress == null) { + _progress = new ProgressDialog(_parentFrame, getNameKey()); + } + _progress.show(); + // start new thread for time-consuming part + new Thread(this).start(); + } + + /** + * Run method using separate thread + */ + public void run() + { + // Compile list of tiles to get + ArrayList tileList = new ArrayList(); + + // First, loop to see which tiles are needed + DoubleRange lonRange = _app.getTrackInfo().getTrack().getLonRange(); + DoubleRange latRange = _app.getTrackInfo().getTrack().getLatRange(); + final int minLon = (int) Math.floor(lonRange.getMinimum()); + final int maxLon = (int) Math.floor(lonRange.getMaximum()); + final int minLat = (int) Math.floor(latRange.getMinimum()); + final int maxLat = (int) Math.floor(latRange.getMaximum()); + + for (int lon=minLon; lon<= maxLon; lon++) + { + for (int lat=minLat; lat <= maxLat; lat++) + { + SrtmTile tile = new SrtmTile(lat, lon); + boolean alreadyGot = false; + for (int t = 0; t < tileList.size(); t++) + { + if (tileList.get(t).equals(tile)) { + alreadyGot = true; + } + } + if (!alreadyGot) {tileList.add(tile);} + } + } + + downloadTiles(tileList); + // Finished + _running = false; + } + + + /** + * Download the tiles of SRTM data + * @param inTileList list of tiles to get + */ + private void downloadTiles(ArrayList inTileList) + { + // Update progress bar + if (_progress != null) + { + _progress.setMaximum(inTileList.size()); + _progress.setValue(0); + } + + String errorMessage = null; + + // Check the cache is ok + final String diskCachePath = Config.getConfigString(Config.KEY_DISK_CACHE); + if (diskCachePath != null) + { + File srtmDir = new File(diskCachePath, "srtm"); + if (!srtmDir.exists() && !srtmDir.mkdir()) { + // can't create the srtm directory + errorMessage = I18nManager.getText("error.downloadsrtm.nocache"); + } + } + else { + // no cache set up + errorMessage = I18nManager.getText("error.downloadsrtm.nocache"); + } + + // Get urls for each tile + URL[] urls = TileFinder.getUrls(inTileList); + int numDownloaded = 0; + for (int t=0; t 1) + { + JOptionPane.showMessageDialog(_parentFrame, I18nManager.getTextWithNumber("confirm.downloadsrtm", numDownloaded), + I18nManager.getText(getNameKey()), JOptionPane.INFORMATION_MESSAGE); + } + else if (inTileList.size() > 0) { + _app.showErrorMessage(getNameKey(), "confirm.downloadsrtm.none"); + } + } + + /** + * See whether the SRTM file is already available locally + * @param inUrl URL for online resource + * @return file object to write to, or null if already there + */ + private static File getFileToWrite(URL inUrl) + { + String diskCachePath = Config.getConfigString(Config.KEY_DISK_CACHE); + if (diskCachePath != null) + { + File srtmDir = new File(diskCachePath, "srtm"); + if (srtmDir.exists() && srtmDir.isDirectory() && srtmDir.canRead()) + { + File srtmFile = new File(srtmDir, new File(inUrl.getFile()).getName()); + if (!srtmFile.exists() || !srtmFile.canRead() || srtmFile.length() <= 400) { + return srtmFile; + } + } + } + return null; + } + + /** + * @return true if a thread is currently running + */ + public boolean isRunning() + { + return _running; + } +}