worker.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. console.log(url + '请求中')
  24. return new Promise(resolve => {
  25. try {
  26. // 如果30秒都还没完成则直接返回
  27. setTimeout(resolve, 30000)
  28. let readStream = request(url)
  29. let writeStream = fs.createWriteStream(local)
  30. readStream.on('error', errorHandle)
  31. function errorHandle(err) {
  32. resolve()
  33. }
  34. readStream.pipe(writeStream)
  35. .on('close', err => {
  36. if (err) {
  37. console.error(url + '文件下载失败')
  38. } else {
  39. console.log(url + '文件下载成功')
  40. }
  41. resolve()
  42. })
  43. .on('error', errorHandle)
  44. } catch (e) {
  45. resolve()
  46. }
  47. })
  48. }
  49. })();
  50. async function cache(...args) {
  51. if (!(await checkLocal(...args))) {
  52. await downImage(...args)
  53. }
  54. }
  55. process.on('message', async msg => {
  56. let zoom = Number(msg)
  57. // 多少个请求一并
  58. let parallel = 10
  59. console.log(zoom)
  60. let {minX, maxX, minY, maxY} = setting[zoom]
  61. // let min = parseInt(basic / 4)
  62. // let maxX = basic * 10
  63. // let maxY = maxX / 1.5
  64. let total = (maxX - minX) * (maxY - minY)
  65. let count = 0
  66. for (let x = maxX; x > minX; x--) {
  67. for (let y = minY; y < maxY && y < x;) {
  68. let run = y + parallel < maxY ? parallel : maxY - y
  69. let pros = []
  70. for (let h = 0; h < run; h++) {
  71. count++
  72. pros.push(cache(zoom, x, y + h))
  73. }
  74. await Promise.all(pros)
  75. y += run
  76. console.log('层级' + zoom + '总共' + total + '已下载' + count)
  77. }
  78. }
  79. fs.writeFileSync('./log.text', fs.readFileSync('./log.text') + '\r\n' + '层级' + zoom + '已下载完毕')
  80. })