worker.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. const fs = require('fs')
  2. const request = require('request')
  3. const path = require('path')
  4. const dirPath = path.join(__dirname, "baseMap");
  5. function checkLocal(zoom, x, y) {
  6. return new Promise(resolve => {
  7. fs.exists(`${dirPath}/${zoom}_${x}_${y}.png`, resolve)
  8. })
  9. }
  10. const downImage = (function() {
  11. let count = 0
  12. const domains = [
  13. 'http://a.tile.openstreetmap.org',
  14. 'http://b.tile.openstreetmap.org',
  15. 'http://c.tile.openstreetmap.org'
  16. ]
  17. const length = domains.length
  18. return async function downImage(zoom, x, y) {
  19. count++;
  20. let url = domains[count % length] + `/${zoom}/${x}/${y}.png`
  21. let local = `${dirPath}/${zoom}_${x}_${y}.png`
  22. return new Promise(resolve => {
  23. try {
  24. let readStream = request(url)
  25. let writeStream = fs.createWriteStream(local)
  26. readStream.on('error', errorHandle)
  27. function errorHandle(err) {
  28. console.error(err)
  29. resolve()
  30. }
  31. readStream.pipe(writeStream)
  32. .on('close', err => {
  33. if (err) {
  34. console.error(url + '文件下载失败')
  35. } else {
  36. console.log(url + '文件下载成功')
  37. }
  38. resolve()
  39. })
  40. .on('error', errorHandle)
  41. } catch (e) {
  42. resolve()
  43. console.error(e)
  44. }
  45. })
  46. }
  47. })();
  48. async function cache(...args) {
  49. if (!(await checkLocal(...args))) {
  50. await downImage(...args)
  51. }
  52. }
  53. let setting = {
  54. 1: {
  55. minX: -1,
  56. maxX: 5,
  57. minY: -1,
  58. maxY: 5
  59. },
  60. 2: {
  61. minX: -1,
  62. maxX: 10,
  63. minY: -1,
  64. maxY: 10
  65. },
  66. 3: {
  67. minX: -1,
  68. maxX: 20,
  69. minY: -1,
  70. maxY: 20
  71. },
  72. 9: {
  73. minX: 200,
  74. maxX: 600,
  75. maxY: 100,
  76. maxY: 400
  77. },
  78. 10: {
  79. minX: 500,
  80. maxX: 1100,
  81. minY: 200,
  82. maxY: 600
  83. },
  84. 11: {
  85. minX: 1200,
  86. maxX: 2000,
  87. minY: 400,
  88. maxY: 1200
  89. },
  90. 12: {
  91. minX: 2300,
  92. maxX: 4300,
  93. minY: 1500,
  94. maxY: 2100
  95. },
  96. 13: {
  97. minX: 4600,
  98. maxX: 8600,
  99. minY: 2000,
  100. maxY: 4000
  101. },
  102. 14: {
  103. minX: 10000,
  104. maxX: 16600,
  105. minY: 5000,
  106. maxY: 8000
  107. },
  108. 15: {
  109. minX: 23000,
  110. maxX: 29000,
  111. minY: 10000,
  112. maxY: 16000
  113. },
  114. 16: {
  115. minX: 40000,
  116. maxX: 60000,
  117. minY: 23000,
  118. maxY: 31000
  119. },
  120. 17: {
  121. minX: 80000,
  122. maxX: 120000,
  123. minY: 50000,
  124. maxY: 62000
  125. },
  126. 18: {
  127. minX: 200000,
  128. maxX: 233000,
  129. minY: 80000,
  130. maxY: 130000
  131. },
  132. 19: {
  133. minX: 380000,
  134. maxX: 470000,
  135. minY: 180000,
  136. maxY: 250000
  137. }
  138. }
  139. process.on('message', async msg => {
  140. let zoom = Number(msg)
  141. console.log(zoom)
  142. let {minX, maxX, minY, maxY} = setting[zoom]
  143. // let min = parseInt(basic / 4)
  144. // let maxX = basic * 10
  145. // let maxY = maxX / 1.5
  146. let total = (maxX - minX) * (maxY - minY)
  147. let count = 0
  148. for (let x = maxX; x > minX; x--) {
  149. for (let y = minY; y < maxY && y < x;) {
  150. let run = y + 100 < maxY ? 100 : maxY - y
  151. let pros = []
  152. for (let h = 0; h < run; h++) {
  153. count++
  154. pros.push(cache(zoom, x, y + h))
  155. }
  156. await Promise.all(pros)
  157. y += run
  158. console.log('层级' + zoom + '总共' + total + '已下载' + count)
  159. }
  160. }
  161. fs.writeFileSync('./log.text', fs.readFileSync('./log.text') + '\r\n' + '层级' + zoom + '已下载完毕')
  162. })