worker.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. const fs = require('fs')
  2. const request = require('request')
  3. const path = require('path')
  4. const dirPath = path.join(__dirname, "baseMap");
  5. const setting = require('./region')
  6. function checkLocal(zoom, x, y) {
  7. return new Promise(resolve => {
  8. fs.exists(`${dirPath}/${zoom}_${x}_${y}.png`, resolve)
  9. })
  10. }
  11. const downImage = (function() {
  12. let count = 0
  13. const domains = [
  14. 'http://a.tile.openstreetmap.org',
  15. 'http://b.tile.openstreetmap.org',
  16. 'http://c.tile.openstreetmap.org'
  17. ]
  18. const length = domains.length
  19. return async function downImage(zoom, x, y) {
  20. count++;
  21. let url = domains[count % length] + `/${zoom}/${x}/${y}.png`
  22. let local = `${dirPath}/${zoom}_${x}_${y}.png`
  23. return new Promise(resolve => {
  24. try {
  25. // 如果30秒都还没完成则直接返回
  26. setTimeout(resolve, 30000)
  27. let readStream = request(url)
  28. let writeStream = fs.createWriteStream(local)
  29. readStream.on('error', errorHandle)
  30. function errorHandle(err) {
  31. resolve()
  32. }
  33. readStream.pipe(writeStream)
  34. .on('close', err => {
  35. if (err) {
  36. console.error(url + '文件下载失败')
  37. } else {
  38. console.log(url + '文件下载成功')
  39. }
  40. resolve()
  41. })
  42. .on('error', errorHandle)
  43. } catch (e) {
  44. resolve()
  45. }
  46. })
  47. }
  48. })();
  49. async function cache(...args) {
  50. if (!(await checkLocal(...args))) {
  51. await downImage(...args)
  52. }
  53. }
  54. process.on('message', async msg => {
  55. let zoom = Number(msg)
  56. // 多少个请求一并
  57. let parallel = 10
  58. console.log(zoom)
  59. let {minX, maxX, minY, maxY} = setting[zoom]
  60. // let min = parseInt(basic / 4)
  61. // let maxX = basic * 10
  62. // let maxY = maxX / 1.5
  63. let total = (maxX - minX) * (maxY - minY)
  64. let count = 0
  65. for (let x = maxX; x > minX; x--) {
  66. for (let y = minY; y < maxY && y < x;) {
  67. let run = y + parallel < maxY ? parallel : maxY - y
  68. let pros = []
  69. for (let h = 0; h < run; h++) {
  70. count++
  71. pros.push(cache(zoom, x, y + h))
  72. }
  73. await Promise.all(pros)
  74. y += run
  75. console.log('层级' + zoom + '总共' + total + '已下载' + count)
  76. }
  77. }
  78. fs.writeFileSync('./log.text', fs.readFileSync('./log.text') + '\r\n' + '层级' + zoom + '已下载完毕')
  79. })