├── .gitignore ├── README.md ├── install.bat ├── package.json ├── src ├── check.js ├── index.js └── railway.js ├── start.bat └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MapDownload 2 | 3 | > 天地图地图资源下载器 支持地图类型 球面墨卡托投影(img_w:影像底图 cia_w:影像标注 vec_w:街道底图 cva_w街道标注) 4 | 5 | 6 | #### *需要node环境* 7 | node下载地址:https://nodejs.org/zh-cn/ 8 | ### gihub下载地址: (别忘了点星星) 9 | 10 | ``` 11 | https://github.com/weshmily/MapDownload 12 | ``` 13 | 14 | 15 | ### 安装依赖包 16 | ``` 17 | npm install 18 | 19 | or 20 | 21 | 双击install.bat文件 22 | ``` 23 | 24 | 25 | 26 | ### 使用说明 27 | 28 | #### 更改地图下载配置 29 | 30 | 1.配置文件的路径 31 | 32 | ![在这里插入图片描述](https://github-1251311788.cos.ap-beijing.myqcloud.com/MapDownload/address.jpg) 33 | 34 | 2.修改配置 35 | 36 | ![在这里插入图片描述](https://github-1251311788.cos.ap-beijing.myqcloud.com/MapDownload/configimg.jpg) 37 | 38 | 39 | #### 开始下载 40 | 41 | ``` 42 | npm start 43 | 44 | or 45 | 46 | 双击start.bat文件 47 | 48 | ``` 49 | 50 | ### 说明 51 | 52 | >1.关于并发数:并发数取决于您电脑配置和网络因素,可以适当调整 53 | 54 | 55 | >2.本版本会自动成伪IP,骗取地图服务器(即便如此也不要在固定IP网上下载地图以免被拉入黑名单) 56 | 57 | >3.网上大多数地图下载器都是收费的,这个项目就是打破这个惯例,把收费变成免费 58 | (目前只有无界面版,后续慢慢支持) -------------------------------------------------------------------------------- /install.bat: -------------------------------------------------------------------------------- 1 | npm install -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mapdownload", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "bagpipe": "^0.3.5", 8 | "request": "^2.88.0" 9 | }, 10 | "scripts": { 11 | "start": "node ./src/index" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/check.js: -------------------------------------------------------------------------------- 1 | var Bagpipe = require('bagpipe') 2 | var fs = require('fs'); 3 | var path = require('path'); 4 | var request = require("request"); 5 | var speed = 200;//并发数 6 | var mapstyle = 'img_w';//地图类型 7 | var token = 'a4ee5c551598a1889adfabff55a5fc27';//天地图key 8 | var zpath = './tiles' // 瓦片目录 9 | //解析需要遍历的文件夹,我这以E盘根目录为例 10 | var filePath = './tiles' 11 | 12 | var user_agent_list_2 = [ 13 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60", 14 | "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", 15 | "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10", 16 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2", 17 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36", 18 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11", 19 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16", 20 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36", 21 | "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko", 22 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11", 23 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER", 24 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)", 25 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)", 26 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)", 27 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)", 28 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0", 29 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)", 30 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36", 31 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36", 32 | ] 33 | 34 | //调用文件遍历方法 35 | fileDisplay(filePath); 36 | var sum = 0; 37 | var bag = new Bagpipe(speed, { timeout: 1000 }) 38 | /** 39 | * 文件遍历方法 40 | * @param filePath 需要遍历的文件路径 41 | */ 42 | function fileDisplay(filePath) { 43 | //根据文件路径读取文件,返回文件列表 44 | fs.readdir(filePath, function (err, files) { 45 | if (err) { 46 | console.warn(err) 47 | } else { 48 | //遍历读取到的文件列表 49 | files.forEach(function (filename) { 50 | //获取当前文件的绝对路径 51 | var filedir = path.join(filePath, filename); 52 | //根据文件路径获取文件信息,返回一个fs.Stats对象 53 | fs.stat(filedir, function (eror, stats) { 54 | if (eror) { 55 | console.warn('获取文件stats失败'); 56 | } else { 57 | var isFile = stats.isFile();//是文件 58 | var isDir = stats.isDirectory();//是文件夹 59 | if (isFile) { 60 | if (stats.size == 0) { 61 | console.log(filedir, stats.size); 62 | let fileArr = filedir.split("\\"); 63 | let fileArrthree = fileArr[3].split('.')[0]; 64 | bag.push(download, fileArr[2], fileArrthree, fileArr[1]) 65 | console.log(`检查出第${++sum}图片`) 66 | } 67 | } 68 | if (isDir) { 69 | fileDisplay(filedir);//递归,如果是文件夹,就继续遍历该文件夹下面的文件 70 | } 71 | } 72 | }) 73 | }); 74 | } 75 | }); 76 | } 77 | /** 78 | * 下载图片方法 79 | * @param {Number} x 80 | * @param {Number} y 81 | * @param {Number} z 82 | */ 83 | function download(x, y, z) { 84 | var ts = Math.floor(Math.random() * 8)//随机生成0-7台服务器 85 | let imgurl = `http://t${ts}.tianditu.gov.cn/DataServer?T=${mapstyle}&x=${x}&y=${y}&l=${z}&tk=${token}`; 86 | var ip = Math.floor(Math.random() * 256)//随机生成IP迷惑服务器 87 | + "." + Math.floor(Math.random() * 256) 88 | + "." + Math.floor(Math.random() * 256) 89 | + "." + Math.floor(Math.random() * 256) 90 | var v = Math.floor(Math.random() * 9) 91 | var options = { 92 | method: 'GET', 93 | url: imgurl, 94 | headers: { 95 | 'User-Agent': user_agent_list_2[v], 96 | 'X-Forwarded-For': ip, 97 | "Connection": 'keep-alive' 98 | 99 | }, 100 | timeout: 5000, 101 | forever: true 102 | }; 103 | 104 | request(options, (err, res, body) => { 105 | if (err) { 106 | bag.push(download, x, y, z) 107 | console.log("request错误", err) 108 | } 109 | }).pipe(fs.createWriteStream(`${zpath}/${z}/${x}/${y}.png`).on('finish', () => { 110 | console.log(`错误图片下载剩余:${--sum}`) 111 | }).on('error', (err) => { 112 | console.log('发生异常:', err); 113 | })); 114 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | var Bagpipe = require('bagpipe') 2 | var fs = require("fs"); 3 | var request = require("request"); 4 | 5 | var bou = [113.68652, 30.00000, 122.29980, 36.08462]; //下载范围 6 | var Minlevel = 1; //最小层级 7 | var Maxlevel = 2; //最大层级 8 | var token = '0b79a07d2808103ab84aa56485c331a8'; //天地图key(如果失效去天地图官网申请) 9 | var zpath = './tiles' // 瓦片目录 10 | var speed = 10; //并发数 11 | var mapstyle = 'vec_w'; //地图类型(img_w:影像底图 cia_w:影像标注 vec_w:街道底图 cva_w街道标注) 12 | 13 | 14 | var all = []; 15 | var user_agent_list_2 = [ 16 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60", 17 | "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", 18 | "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10", 19 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2", 20 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36", 21 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11", 22 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16", 23 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36", 24 | "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko", 25 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11", 26 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER", 27 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)", 28 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)", 29 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)", 30 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)", 31 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0", 32 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)", 33 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36", 34 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36" 35 | ] 36 | 37 | 38 | /** 39 | * 计算经纬度转换成瓦片坐标 40 | * @param {Number} lng 经度 41 | * @param {Number} lat 纬度 42 | * @param {Number} level 层级 43 | */ 44 | function calcXY(lng, lat, level) { 45 | let x = (lng + 180) / 360 46 | let title_X = Math.floor(x * Math.pow(2, level)) 47 | let lat_rad = lat * Math.PI / 180 48 | let y = (1 - Math.log(Math.tan(lat_rad) + 1 / Math.cos(lat_rad)) / Math.PI) / 2 49 | let title_Y = Math.floor(y * Math.pow(2, level)) 50 | return { 51 | title_X, 52 | title_Y 53 | } 54 | } 55 | /** 56 | * 计算每个层级的瓦片坐标 57 | * @param {Arr} bounding 范围 58 | * @param {Number} Minlevel 最小层级 59 | * @param {Number} Maxlevel 最大层级 60 | */ 61 | function mainnAllXY(bounding, Minlevel, Maxlevel) { 62 | for (i = Minlevel; i <= Maxlevel; i++) { 63 | alli = {} 64 | let p1 = calcXY(bounding[2], bounding[3], i); 65 | let p2 = calcXY(bounding[0], bounding[1], i); 66 | alli.t = i // 层级 67 | alli.x = [p2.title_X, p1.title_X] // 瓦片横坐标范围(左至右) 68 | alli.y = [p1.title_Y, p2.title_Y] // 瓦片纵坐标范围(下至上) 69 | all.push(alli) 70 | } 71 | 72 | createDir() 73 | } 74 | mainnAllXY(bou, Minlevel, Maxlevel) 75 | 76 | function createDir() { 77 | fs.access(zpath, fs.constants.F_OK, err => { 78 | // 创建tiles文件夹 79 | if (err) fs.mkdir(zpath, err => {}) 80 | for (let z = 0; z <= all.length - 1; z++) { 81 | fs.access(`${zpath}/${all[z].t}`, fs.constants.F_OK, err => { 82 | // 创建tiles/Z文件夹 ,Z是层级 83 | if (err) fs.mkdir(`${zpath}/${all[z].t}`, err => {}) 84 | for (let x = all[z].x[0]; x <= all[z].x[1]; x++) { 85 | fs.access(`${zpath}/${all[z].t}/${x}`, fs.constants.F_OK, err => { 86 | // 创建tiles/Z/X文件夹 ,X是瓦片横坐标 87 | if (err) fs.mkdir(`${zpath}/${all[z].t}/${x}`, err => {}) 88 | }) 89 | } 90 | }) 91 | } 92 | // 文件夹可能较多,等待2s开始下载 93 | setTimeout(() => { 94 | task() 95 | }, 2000) 96 | }) 97 | } 98 | 99 | /** 100 | * 创建下载队列 101 | */ 102 | 103 | var sum = 0; 104 | var bag = new Bagpipe(speed, { 105 | timeout: 1000 106 | }) 107 | 108 | function task() { 109 | for (let z = 0; z <= all.length - 1; z++) { 110 | for (let x = all[z].x[0]; x <= all[z].x[1]; x++) { 111 | for (let y = all[z].y[0]; y <= all[z].y[1]; y++) { 112 | // 将下载任务推入队列 113 | ++sum 114 | bag.push(download, x, y, all[z].t) 115 | } 116 | } 117 | } 118 | } 119 | 120 | 121 | 122 | /** 123 | * 下载图片方法 124 | * @param {Number} x 125 | * @param {Number} y 126 | * @param {Number} z 127 | */ 128 | function download(x, y, z) { 129 | var ts = Math.floor(Math.random() * 8) //随机生成0-7台服务器 130 | // let imgurl = `http://t${ts}.tianditu.gov.cn/DataServer?T=${mapstyle}&x=${x}&y=${y}&l=${z}&tk=${token}`; 131 | let mapstylesegmentation = mapstyle.split("_") 132 | let imgurl = `https://t${ts}.tianditu.gov.cn/${mapstyle}/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=${mapstylesegmentation[0]}&STYLE=default&TILEMATRIXSET=${mapstylesegmentation[1]}&FORMAT=tiles&TILECOL=${x}&TILEROW=${y}&TILEMATRIX=${z}&tk=${token}` 133 | var ip = Math.floor(Math.random() * 256) //随机生成IP迷惑服务器 134 | + 135 | "." + Math.floor(Math.random() * 256) + 136 | "." + Math.floor(Math.random() * 256) + 137 | "." + Math.floor(Math.random() * 256) 138 | var v = Math.floor(Math.random() * 9) 139 | var options = { 140 | method: 'GET', 141 | url: imgurl, 142 | headers: { 143 | 'User-Agent': user_agent_list_2[v], 144 | 'X-Forwarded-For': ip, 145 | "Connection": 'keep-alive', 146 | 'Referer': "https://www.tianditu.gov.cn/", 147 | 'Host': `t${ts}.tianditu.gov.cn` 148 | }, 149 | timeout: 5000, 150 | forever: true 151 | }; 152 | 153 | request(options, (err, res, body) => { 154 | if (err) { 155 | bag.push(download, x, y, z) 156 | console.log("request错误", err) 157 | } 158 | }).pipe(fs.createWriteStream(`${zpath}/${z}/${x}/${y}.png`).on('finish', () => { 159 | console.log(`图片下载成功,第${z}层`) 160 | console.log(--sum) 161 | }).on('error', (err) => { 162 | console.log('发生异常:', err); 163 | })); 164 | } -------------------------------------------------------------------------------- /src/railway.js: -------------------------------------------------------------------------------- 1 | var Bagpipe = require('bagpipe') 2 | var fs = require("fs"); 3 | var request = require("request"); 4 | 5 | var bou = [115.08179, 30.68516, 122.13501, 35.16483];//下载范围 6 | var Minlevel = 1;//最小层级 7 | var Maxlevel = 16;//最大层级 8 | var token = 'a4ee5c551598a1889adfabff55a5fc27';//天地图key(如果失效去天地图官网申请) 9 | var zpath = './tiles' // 瓦片目录 10 | var speed = 10;//并发数 11 | var mapstyle = 'vec_w';//地图类型 12 | 13 | 14 | var all = []; 15 | var user_agent_list_2 = [ 16 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60", 17 | "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", 18 | "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10", 19 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2", 20 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36", 21 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11", 22 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16", 23 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36", 24 | "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko", 25 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11", 26 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER", 27 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)", 28 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)", 29 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)", 30 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)", 31 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0", 32 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)", 33 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36", 34 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36", 35 | ] 36 | 37 | 38 | /** 39 | * 计算经纬度转换成瓦片坐标 40 | * @param {Number} lng 经度 41 | * @param {Number} lat 纬度 42 | * @param {Number} level 层级 43 | */ 44 | function calcXY(lng, lat, level) { 45 | let x = (lng + 180) / 360 46 | let title_X = Math.floor(x * Math.pow(2, level)) 47 | let lat_rad = lat * Math.PI / 180 48 | let y = (1 - Math.log(Math.tan(lat_rad) + 1 / Math.cos(lat_rad)) / Math.PI) / 2 49 | let title_Y = Math.floor(y * Math.pow(2, level)) 50 | return { title_X, title_Y } 51 | } 52 | /** 53 | * 计算每个层级的瓦片坐标 54 | * @param {Arr} bounding 范围 55 | * @param {Number} Minlevel 最小层级 56 | * @param {Number} Maxlevel 最大层级 57 | */ 58 | function mainnAllXY(bounding, Minlevel, Maxlevel) { 59 | for (i = Minlevel; i <= Maxlevel; i++) { 60 | alli = {} 61 | let p1 = calcXY(bounding[2], bounding[3], i); 62 | let p2 = calcXY(bounding[0], bounding[1], i); 63 | alli.t = i // 层级 64 | alli.x = [p2.title_X, p1.title_X] // 瓦片横坐标范围(左至右) 65 | alli.y = [p1.title_Y, p2.title_Y] // 瓦片纵坐标范围(下至上) 66 | all.push(alli) 67 | } 68 | createDir() 69 | } 70 | mainnAllXY(bou, Minlevel, Maxlevel) 71 | 72 | 73 | 74 | function createDir() { 75 | fs.access(zpath, fs.constants.F_OK, err => { 76 | // 创建tiles文件夹 77 | if (err) fs.mkdir(zpath, err => { }) 78 | for (let z = 0; z <= all.length - 1; z++) { 79 | fs.access(`${zpath}/${all[z].t}`, fs.constants.F_OK, err => { 80 | // 创建tiles/Z文件夹 ,Z是层级 81 | if (err) fs.mkdir(`${zpath}/${all[z].t}`, err => { }) 82 | for (let y = all[z].y[0]; y <= all[z].y[1]; y++) { 83 | fs.access(`${zpath}/${all[z].t}/${y}`, fs.constants.F_OK, err => { 84 | // 创建tiles/Z/X文件夹 ,X是瓦片横坐标 85 | if (err) fs.mkdir(`${zpath}/${all[z].t}/${y}`, err => { }) 86 | }) 87 | } 88 | }) 89 | } 90 | // 文件夹可能较多,等待2s开始下载 91 | setTimeout(() => { 92 | task() 93 | }, 2000) 94 | }) 95 | } 96 | 97 | /** 98 | * 创建下载队列 99 | */ 100 | function task() { 101 | var bag = new Bagpipe(speed, { timeout: 1000 }) 102 | for (let z = 0; z <= all.length - 1; z++) { 103 | for (let x = all[z].x[0]; x <= all[z].x[1]; x++) { 104 | for (let y = all[z].y[0]; y <= all[z].y[1]; y++) { 105 | // 将下载任务推入队列 106 | bag.push(download, x, y, all[z].t) 107 | } 108 | } 109 | } 110 | } 111 | 112 | /** 113 | * 下载图片方法 114 | * @param {Number} x 115 | * @param {Number} y 116 | * @param {Number} z 117 | */ 118 | function download(x, y, z) { 119 | // var ts = Math.floor(Math.random() * 8)//随机生成0-7台服务器 120 | let imgurl = `http://218.2.231.245/mapjs2/rest/services/MapJS/js_yxzj_2016/MapServer/tile/${z}/${y}/${x}` 121 | // let imgurl = `http://t${ts}.tianditu.gov.cn/DataServer?T=${mapstyle}&x=${x}&y=${y}&l=${z}&tk=${token}`; 122 | var ip = Math.floor(Math.random() * 256)//随机生成IP迷惑服务器 123 | + "." + Math.floor(Math.random() * 256) 124 | + "." + Math.floor(Math.random() * 256) 125 | + "." + Math.floor(Math.random() * 256) 126 | var v = Math.floor(Math.random() * 9) 127 | var options = { 128 | method: 'GET', 129 | url: imgurl, 130 | headers: { 131 | 'User-Agent': user_agent_list_2[v], 132 | 'X-Forwarded-For': ip, 133 | "Connection": 'keep-alive' 134 | 135 | }, 136 | timeout: 5000, 137 | forever: true 138 | }; 139 | 140 | request(options, (err, res, body) => { 141 | if (err) { console.log(err) } 142 | }).pipe(fs.createWriteStream(`${zpath}/${z}/${y}/${x}.png`).on('finish', () => { 143 | console.log(`图片下载成功,第${z}层`) 144 | })); 145 | } 146 | -------------------------------------------------------------------------------- /start.bat: -------------------------------------------------------------------------------- 1 | npm run serve -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ajv@^6.5.5: 6 | version "6.10.2" 7 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" 8 | integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== 9 | dependencies: 10 | fast-deep-equal "^2.0.1" 11 | fast-json-stable-stringify "^2.0.0" 12 | json-schema-traverse "^0.4.1" 13 | uri-js "^4.2.2" 14 | 15 | asn1@~0.2.3: 16 | version "0.2.4" 17 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 18 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 19 | dependencies: 20 | safer-buffer "~2.1.0" 21 | 22 | assert-plus@1.0.0, assert-plus@^1.0.0: 23 | version "1.0.0" 24 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 25 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 26 | 27 | asynckit@^0.4.0: 28 | version "0.4.0" 29 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 30 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 31 | 32 | aws-sign2@~0.7.0: 33 | version "0.7.0" 34 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 35 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 36 | 37 | aws4@^1.8.0: 38 | version "1.8.0" 39 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 40 | integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== 41 | 42 | bagpipe@^0.3.5: 43 | version "0.3.5" 44 | resolved "https://registry.yarnpkg.com/bagpipe/-/bagpipe-0.3.5.tgz#e341d164fcb24cdf04ea7e05b765ec10c8aea6a1" 45 | integrity sha1-40HRZPyyTN8E6n4Ft2XsEMiupqE= 46 | 47 | bcrypt-pbkdf@^1.0.0: 48 | version "1.0.2" 49 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 50 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 51 | dependencies: 52 | tweetnacl "^0.14.3" 53 | 54 | caseless@~0.12.0: 55 | version "0.12.0" 56 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 57 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 58 | 59 | combined-stream@^1.0.6, combined-stream@~1.0.6: 60 | version "1.0.8" 61 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 62 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 63 | dependencies: 64 | delayed-stream "~1.0.0" 65 | 66 | core-util-is@1.0.2: 67 | version "1.0.2" 68 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 69 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 70 | 71 | dashdash@^1.12.0: 72 | version "1.14.1" 73 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 74 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 75 | dependencies: 76 | assert-plus "^1.0.0" 77 | 78 | delayed-stream@~1.0.0: 79 | version "1.0.0" 80 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 81 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 82 | 83 | ecc-jsbn@~0.1.1: 84 | version "0.1.2" 85 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 86 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 87 | dependencies: 88 | jsbn "~0.1.0" 89 | safer-buffer "^2.1.0" 90 | 91 | extend@~3.0.2: 92 | version "3.0.2" 93 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 94 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 95 | 96 | extsprintf@1.3.0: 97 | version "1.3.0" 98 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 99 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 100 | 101 | extsprintf@^1.2.0: 102 | version "1.4.0" 103 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 104 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 105 | 106 | fast-deep-equal@^2.0.1: 107 | version "2.0.1" 108 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 109 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 110 | 111 | fast-json-stable-stringify@^2.0.0: 112 | version "2.0.0" 113 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 114 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 115 | 116 | forever-agent@~0.6.1: 117 | version "0.6.1" 118 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 119 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 120 | 121 | form-data@~2.3.2: 122 | version "2.3.3" 123 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 124 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 125 | dependencies: 126 | asynckit "^0.4.0" 127 | combined-stream "^1.0.6" 128 | mime-types "^2.1.12" 129 | 130 | getpass@^0.1.1: 131 | version "0.1.7" 132 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 133 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 134 | dependencies: 135 | assert-plus "^1.0.0" 136 | 137 | har-schema@^2.0.0: 138 | version "2.0.0" 139 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 140 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 141 | 142 | har-validator@~5.1.0: 143 | version "5.1.3" 144 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 145 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 146 | dependencies: 147 | ajv "^6.5.5" 148 | har-schema "^2.0.0" 149 | 150 | http-signature@~1.2.0: 151 | version "1.2.0" 152 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 153 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 154 | dependencies: 155 | assert-plus "^1.0.0" 156 | jsprim "^1.2.2" 157 | sshpk "^1.7.0" 158 | 159 | is-typedarray@~1.0.0: 160 | version "1.0.0" 161 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 162 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 163 | 164 | isstream@~0.1.2: 165 | version "0.1.2" 166 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 167 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 168 | 169 | jsbn@~0.1.0: 170 | version "0.1.1" 171 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 172 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 173 | 174 | json-schema-traverse@^0.4.1: 175 | version "0.4.1" 176 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 177 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 178 | 179 | json-schema@0.2.3: 180 | version "0.2.3" 181 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 182 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 183 | 184 | json-stringify-safe@~5.0.1: 185 | version "5.0.1" 186 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 187 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 188 | 189 | jsprim@^1.2.2: 190 | version "1.4.1" 191 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 192 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 193 | dependencies: 194 | assert-plus "1.0.0" 195 | extsprintf "1.3.0" 196 | json-schema "0.2.3" 197 | verror "1.10.0" 198 | 199 | mime-db@1.40.0: 200 | version "1.40.0" 201 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" 202 | integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== 203 | 204 | mime-types@^2.1.12, mime-types@~2.1.19: 205 | version "2.1.24" 206 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" 207 | integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== 208 | dependencies: 209 | mime-db "1.40.0" 210 | 211 | oauth-sign@~0.9.0: 212 | version "0.9.0" 213 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 214 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 215 | 216 | performance-now@^2.1.0: 217 | version "2.1.0" 218 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 219 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 220 | 221 | psl@^1.1.24: 222 | version "1.3.0" 223 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd" 224 | integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag== 225 | 226 | punycode@^1.4.1: 227 | version "1.4.1" 228 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 229 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 230 | 231 | punycode@^2.1.0: 232 | version "2.1.1" 233 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 234 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 235 | 236 | qs@~6.5.2: 237 | version "6.5.2" 238 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 239 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 240 | 241 | request@^2.88.0: 242 | version "2.88.0" 243 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 244 | integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== 245 | dependencies: 246 | aws-sign2 "~0.7.0" 247 | aws4 "^1.8.0" 248 | caseless "~0.12.0" 249 | combined-stream "~1.0.6" 250 | extend "~3.0.2" 251 | forever-agent "~0.6.1" 252 | form-data "~2.3.2" 253 | har-validator "~5.1.0" 254 | http-signature "~1.2.0" 255 | is-typedarray "~1.0.0" 256 | isstream "~0.1.2" 257 | json-stringify-safe "~5.0.1" 258 | mime-types "~2.1.19" 259 | oauth-sign "~0.9.0" 260 | performance-now "^2.1.0" 261 | qs "~6.5.2" 262 | safe-buffer "^5.1.2" 263 | tough-cookie "~2.4.3" 264 | tunnel-agent "^0.6.0" 265 | uuid "^3.3.2" 266 | 267 | safe-buffer@^5.0.1, safe-buffer@^5.1.2: 268 | version "5.2.0" 269 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 270 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 271 | 272 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 273 | version "2.1.2" 274 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 275 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 276 | 277 | sshpk@^1.7.0: 278 | version "1.16.1" 279 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 280 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 281 | dependencies: 282 | asn1 "~0.2.3" 283 | assert-plus "^1.0.0" 284 | bcrypt-pbkdf "^1.0.0" 285 | dashdash "^1.12.0" 286 | ecc-jsbn "~0.1.1" 287 | getpass "^0.1.1" 288 | jsbn "~0.1.0" 289 | safer-buffer "^2.0.2" 290 | tweetnacl "~0.14.0" 291 | 292 | tough-cookie@~2.4.3: 293 | version "2.4.3" 294 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 295 | integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== 296 | dependencies: 297 | psl "^1.1.24" 298 | punycode "^1.4.1" 299 | 300 | tunnel-agent@^0.6.0: 301 | version "0.6.0" 302 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 303 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 304 | dependencies: 305 | safe-buffer "^5.0.1" 306 | 307 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 308 | version "0.14.5" 309 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 310 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 311 | 312 | uri-js@^4.2.2: 313 | version "4.2.2" 314 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 315 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 316 | dependencies: 317 | punycode "^2.1.0" 318 | 319 | uuid@^3.3.2: 320 | version "3.3.3" 321 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" 322 | integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== 323 | 324 | verror@1.10.0: 325 | version "1.10.0" 326 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 327 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 328 | dependencies: 329 | assert-plus "^1.0.0" 330 | core-util-is "1.0.2" 331 | extsprintf "^1.2.0" 332 | --------------------------------------------------------------------------------