const fs = require('fs') const request = require('request') const path = require('path') const dirPath = path.join(__dirname, "baseMap"); const setting = require('./region') function checkLocal(zoom, x, y) { return new Promise(resolve => { fs.exists(`${dirPath}/${zoom}_${x}_${y}.png`, resolve) }) } const downImage = (function() { let count = 0 const domains = [ 'http://a.tile.openstreetmap.org', 'http://b.tile.openstreetmap.org', 'http://c.tile.openstreetmap.org' ] const length = domains.length return async function downImage(zoom, x, y) { count++; let url = domains[count % length] + `/${zoom}/${x}/${y}.png` let local = `${dirPath}/${zoom}_${x}_${y}.png` console.log(url + '请求中') return new Promise(resolve => { try { // 如果30秒都还没完成则直接返回 setTimeout(resolve, 30000) let readStream = request(url) let writeStream = fs.createWriteStream(local) readStream.on('error', errorHandle) function errorHandle(err) { resolve() } readStream.pipe(writeStream) .on('close', err => { if (err) { console.error(url + '文件下载失败') } else { console.log(url + '文件下载成功') } resolve() }) .on('error', errorHandle) } catch (e) { resolve() } }) } })(); async function cache(...args) { if (!(await checkLocal(...args))) { await downImage(...args) } } process.on('message', async msg => { let zoom = Number(msg) // 多少个请求一并 let parallel = 10 console.log(zoom) let {minX, maxX, minY, maxY} = setting[zoom] // let min = parseInt(basic / 4) // let maxX = basic * 10 // let maxY = maxX / 1.5 let total = (maxX - minX) * (maxY - minY) let count = 0 for (let x = maxX; x > minX; x--) { for (let y = minY; y < maxY && y < x;) { let run = y + parallel < maxY ? parallel : maxY - y let pros = [] for (let h = 0; h < run; h++) { count++ pros.push(cache(zoom, x, y + h)) } await Promise.all(pros) y += run console.log('层级' + zoom + '总共' + total + '已下载' + count) } } fs.writeFileSync('./log.text', fs.readFileSync('./log.text') + '\r\n' + '层级' + zoom + '已下载完毕') })