getGrb2FileUrl.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. const path = require('path');
  2. const axios = require('axios');
  3. const { extractDOM } = require("./jsDom.js");
  4. let basicGfsList = [];
  5. let gfsFile = "";
  6. let rootPage = {};
  7. let cycleList = [];
  8. const { leftlon, rightlon, toplat, bottomlat } = require("./region.js");
  9. /**
  10. *
  11. * @param {String} degree 气象模型精度,需自己找可选值,非要列举几个的话: ["gfs_0p25","gfs_0p50","gfs_1p00"]
  12. * @param {Number} step 步进数值,此参数不需要传入,自行递归
  13. * @returns
  14. */
  15. async function getGrib2FileUrl(degree = "gfs_1p00", step = 0) {
  16. if (basicGfsList.length) {
  17. gfsFile = basicGfsList[0 + step];
  18. const cyclePage = await axios.get(`https://nomads.ncep.noaa.gov/find_subdirs_files.php?ds=${degree}&path=&subdir_num=0&subdir_name=${gfsFile}`);
  19. cycleList = extractDOM(`<html><body>${cyclePage.data}</body></html>`, ".selectable .subdir_1");
  20. } else {
  21. rootPage = await axios.get(`https://nomads.ncep.noaa.gov/gribfilter.php?ds=${degree}`);
  22. const gfsList = extractDOM(rootPage.data, "#div_subdir_0 .subdir_0");
  23. for (let i = 0; i < gfsList.length; i++) {
  24. basicGfsList.push(gfsList[i].innerHTML);
  25. }
  26. gfsFile = basicGfsList[0 + step];
  27. cycleList = extractDOM(rootPage.data, "#div_subdir_1 .subdir_1");
  28. }
  29. const optionPage = await axios.get(`https://nomads.ncep.noaa.gov/find_subdirs_files.php?ds=${degree}&path=/${basicGfsList[0 + step]}&subdir_num=1&subdir_name=${cycleList[0].innerHTML}`);
  30. const optionList = extractDOM(`<html><body>${optionPage.data}</body></html>`, "#file_selector option");
  31. if (optionList) {
  32. let grb2FileList = [];
  33. for (let i = 1; i < optionList.length; i++) {
  34. grb2FileList.push({
  35. url: `https://nomads.ncep.noaa.gov/cgi-bin/filter_${degree}.pl?dir=/${basicGfsList[0 + step]}/${cycleList[0].innerHTML}/atmos&file=${optionList[i].getAttribute("value")}&all_var=on&all_lev=on&toplat=${toplat}&leftlon=${leftlon}&rightlon=${rightlon}&bottomlat=${bottomlat}`,
  36. filePath: path.join(__dirname, `../model/grib2/${degree}/${basicGfsList[0 + step]}/${cycleList[0].innerHTML}`),
  37. fileName: optionList[i].getAttribute("value"),
  38. });
  39. }
  40. const urls = JSON.parse(JSON.stringify(grb2FileList));
  41. basicGfsList = [];
  42. gfsFile = "";
  43. rootPage = {};
  44. return urls;
  45. } else {
  46. console.log(`${degree}第${step}个模型内未找到数据,切换下一个模型`);
  47. return getGrib2FileUrl(degree, ++step);
  48. }
  49. }
  50. // 提取DOM元素函数
  51. module.exports = {
  52. getGrib2FileUrl
  53. }