package se.kodapan.osm.slippymap; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import se.kodapan.osm.util.slippymap.SlippyMap; import se.kodapan.osm.util.slippymap.TMS; import se.kodapan.osm.util.slippymap.Tile; import java.io.InputStream; import java.util.List; /** * @author kalle * @since 8/25/13 8:02 PM */ public class PrerenderEkonomiskaKartan { private static Logger log = LoggerFactory.getLogger(PrerenderEkonomiskaKartan.class); /** * mvn exec:java -Dexec.mainClass="se.kodapan.osm.slippymap.PrerenderEkonomiskaKartan" * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { HttpClient httpClient = new DefaultHttpClient(); double southLatitude = 10.634765625d; double westLongitude = 55.42901345240739d; double northLatitude = 24.9609375d; double eastLongitude = 69.50376519563683d; byte[] buf = new byte[49152]; SlippyMap slippyMap = new TMS("http://osm.kodapan.se:8080/tms/1.0.0/ek_EPSG3857/%{z}/%{x}/%{y}.png"); int totalTiles = 0; for (int z = 12; z < 18; z++) { long totalBytesReadZ = 0; long timestampZ = System.currentTimeMillis(); List<Tile> tiles = slippyMap.listTiles(southLatitude, westLongitude, northLatitude, eastLongitude, z); // Collections.shuffle(tiles); long statusBytesRead = 0; int tilesProccessedZ = 0; for (Tile tile : tiles) { tilesProccessedZ++; totalTiles++; String url = slippyMap.toURL(tile); HttpGet get = new HttpGet(url); HttpResponse response = httpClient.execute(get); if (response.getStatusLine().getStatusCode() == 200) { long bytesRead = 0; try { InputStream httpContent = response.getEntity().getContent(); while (true) { int read = httpContent.read(buf, 0, buf.length); if (read > 0) { bytesRead += read; statusBytesRead += read; totalBytesReadZ += read; } else { break; } } } finally { response.getEntity().getContent().close(); } if (statusBytesRead > 1024 * 1024) { double tilesLeft = tiles.size() - tilesProccessedZ; double millisecondsPerTile = (System.currentTimeMillis() - timestampZ) / tilesProccessedZ; double millisecondsToCompletion = millisecondsPerTile * tilesLeft; int estimatedMinutesToCompletion = (int) (millisecondsToCompletion / 1000d / 60d); double bytesPerTile = totalBytesReadZ / tilesProccessedZ; int estimatedTotalMegabytes = (int)(bytesPerTile * (double)tiles.size()) / 1024/1024; log.info("Processed #" + totalTiles + "/ " + tiles.size() + " " + url + "\t" + bytesRead + " bytes"); log.info("Estimated " + estimatedMinutesToCompletion + " minutes left to completion."); log.info((totalBytesReadZ / 1024 / 1024) + " total megabytes worth of tiles successfully requested, estimated total of " + estimatedTotalMegabytes + " megabytes."); statusBytesRead = 0; } } else { log.warn(tile.toString() + "\t" + response.getStatusLine().toString()); } } System.currentTimeMillis(); } System.currentTimeMillis(); } }