123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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 + '已下载完毕')
- })
|