#! /usr/bin/env runjs function long2tile(lon, zoom) { return (Math.floor((lon + 180) / 360 * Math.pow(2, zoom))); } function lat2tile(lat, zoom) { return (Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, zoom))); } main = () => { if ($ARGS.length < 3) { println("Usage: mapdownload.js pattern true|false zoom [png|jpg]"); println(" | | | |"); println(" +-------+----------+----+----------- URL Pattern"); println(" | | |"); println(" +----------+----+----------- Reverse Y (Gaode -> TMS should set true)"); println(" | |"); println(" +----+----------- Zoom (0~20), 2_120,30~121,31"); println(" |"); println(" +----------- Image type"); return; } var pattern = $ARGS[0]; var reverseY = "true".equals($ARGS[1]); var z = $ARGS[2]; var suffix = ($ARGS.length > 3) ? $ARGS[3] : 'png'; if (z.indexOf('_') < 0) { var x_min = 0; var y_min = 0; var x_max = Math.pow(2, z) - 1; var y_max = Math.pow(2, z) - 1; } else { var _z = z; z = parseInt(_z.substring(0, _z.indexOf('_'))); var lngLats = _z.substring(_z.indexOf('_') + 1).split('~'); var lngLat1 = lngLats[0].split(','); var lngLat2 = lngLats[1].split(','); var x1 = long2tile(parseFloat(lngLat1[0]), z); var x2 = long2tile(parseFloat(lngLat2[0]), z); var y1 = lat2tile(parseFloat(lngLat1[1]), z); var y2 = lat2tile(parseFloat(lngLat2[1]), z); x_min = Math.min(x1, x2); x_max = Math.max(x1, x2); y_min = Math.min(y1, y2); y_max = Math.max(y1, y2); } println('X, min: ' + x_min + ', max: ' + x_max); println('Y, min: ' + y_min + ', max: ' + y_max); var count = 0; var total = (x_max - x_min + 1) * (y_max - y_min + 1); for (var x = x_min; x <= x_max; x++) { for (var y = y_min; y <= y_max; y++) { count++; var url = pattern; url = url.replace(/\{x\}/g, "" + x); url = url.replace(/\{y\}/g, "" + y); url = url.replace(/\{z\}/g, "" + z); var fiPath = $$.file("" + z, "" + x); fiPath.mkdirs(); var fi = $$.file(fiPath, (reverseY ? (Math.pow(2, z) - 1 - y) : y) + "." + suffix); if (!fi.exists()) { println("Downloading: " + url + " ==> " + fi + " (" + count + "/" + total + ")"); var bs = $$.httpRequest().url(url).get().getBytes(); $$.rFile(fi).write(bs); } } } }; main();