aqiWorker.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. "use script"; //开发环境建议开启严格模式
  2. var url = "https://api.waqi.info/mapq/bounds/?bounds={RECTANGLE}&inc=placeholders&k={KEY}&_={DATA}";
  3. var table = [
  4. { level: "一级(优)", influence: "空气质量令人满意,基本无空气污染", suggestion: " 各类人群可正常活动" },
  5. {
  6. level: "二级(良)",
  7. influence: "空气质量可接受,但某些污染物可能对极少数异常敏感人群健康有较弱影响",
  8. suggestion: "心脏病和肺病患者症状显著加剧,运动耐受力降低,健康人群普遍出现症状",
  9. },
  10. {
  11. level: "三级(轻度污染)",
  12. influence: "易感人群症状有轻度加剧,健康人群出现刺激症状",
  13. suggestion: "儿童、老年人及心脏病、呼吸系统疾病患者应减少长时间、高强度的户外锻炼",
  14. },
  15. {
  16. level: "四级(中度污染)",
  17. influence: "易感人群症状有轻度加剧,健康人群出现刺激症状",
  18. suggestion: "儿童、老年人及心脏病、呼吸系统疾病患者避免长时间、高强度的户外锻炼,一般人群适量减少户外运动",
  19. },
  20. {
  21. level: "五级(重度污染)",
  22. influence: "心脏病和肺病患者症状显著加剧,运动耐受力降低,健康人群普遍出现症状",
  23. suggestion: "儿童、老年人及心脏病、肺病患者应停留在室内,停止户外运动,一般人群减少户外运动",
  24. },
  25. {
  26. level: "六级(严重污染)",
  27. influence: "心脏病和肺病患者症状显著加剧,运动耐受力降低,健康人群普遍出现症状",
  28. suggestion: "儿童、老年人和病人应停留在室内,避免体力消耗,一般人群避免户外活动",
  29. },
  30. ];
  31. var xmlHttpRequest;
  32. var nWidth = 500;
  33. var currTime;
  34. onmessage = function (e) {
  35. let bounds = e.data.bounds;
  36. currTime = new Date().getTime();
  37. var strKey = jskey();
  38. var nowUrl = url.replace("{RECTANGLE}", bounds).replace("{KEY}", strKey).replace("{DATA}", currTime);
  39. xmlHttpRequest = new XMLHttpRequest();
  40. //2.设置回调函数
  41. xmlHttpRequest.onreadystatechange = callback;
  42. //3.初始化XMLHttpRequest组建
  43. xmlHttpRequest.open("POST", nowUrl, true);
  44. //4.发送请求
  45. xmlHttpRequest.send();
  46. };
  47. function callback() {
  48. if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {
  49. var entityTable = [];
  50. ////////////////////////////////////////////////////
  51. var currentData = JSON.parse(xmlHttpRequest.responseText);
  52. for (var i = currentData.length - 1; i >= 0; i--) {
  53. var item = currentData[i];
  54. var aqi = parseInt(item.aqi);
  55. if (!isNumber(aqi)) {
  56. continue;
  57. }
  58. var level = 0;
  59. if (aqi > nWidth) {
  60. level = 5;
  61. aqi = nWidth - 1;
  62. } else {
  63. if (aqi > 300) {
  64. level = 5;
  65. } else if (aqi > 200) {
  66. level = 4;
  67. } else if (aqi > 150) {
  68. level = 3;
  69. } else if (aqi > 100) {
  70. level = 2;
  71. } else if (aqi > 50) {
  72. level = 1;
  73. }
  74. }
  75. var newItem = {
  76. ...item,
  77. aqi: aqi,
  78. level: table[level].level,
  79. influence: table[level].influence,
  80. suggestion: table[level].suggestion,
  81. };
  82. entityTable.push(newItem);
  83. }
  84. //////////////////////////////////////////////////////
  85. //self代表子线程自身
  86. self.postMessage({ currTime: currTime, entityTable: entityTable });
  87. self.close();
  88. } else if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 0) {
  89. self.postMessage({ currTime: currTime, entityTable: [] });
  90. self.close();
  91. }
  92. }
  93. function isNumber(obj) {
  94. return typeof obj === "number" && !isNaN(obj);
  95. }
  96. function jskey() {
  97. return (function () {
  98. var u = "";
  99. decodeURIComponent("%603Z3F%7BWS%3A3BSBdIRlJTySXYnmecFR%2CF%7BeSGHhkMh%3E%3E")
  100. .split("")
  101. .forEach(function (c) {
  102. u += String.fromCharCode(c.charCodeAt(0) - 1);
  103. });
  104. return u;
  105. })();
  106. }