找回密码
 立即注册
搜索
楼主: wfIRstzhang

[耍宝娱乐] TC低菊渲染(污染)实验贴

[复制链接]

1

主题

15

回帖

137

积分

热带低压

自定义头衔测试

积分
137
 楼主| 发表于 2026-2-24 14:41 | 显示全部楼层
五彩斑斓的灰(不是)有色BD色阶测试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
SIGNATURE

1

主题

15

回帖

137

积分

热带低压

自定义头衔测试

积分
137
 楼主| 发表于 2026-2-24 14:41 | 显示全部楼层
本帖最后由 wfIRstzhang 于 2026-2-24 15:48 编辑
  1. #include <algorithm>
  2. #include <chrono>
  3. #include <cmath>
  4. #include <complex>
  5. #include <cpgplot.h>
  6. #include <iostream>
  7. #include <limits>
  8. #include <map>
  9. #include <mfhdf.h>
  10. #include <numbers>
  11. #include <stdexcept>
  12. #include <type_traits>
  13. #include <vector>

  14. #define PNG_OUTPUT

  15. constexpr double Hc_k = 1.4387768775039337e4;
  16. constexpr double H2c_2 = 1.1910429723971884140794892e8;
  17. constexpr double Deg2rad = std::numbers::pi / 180;
  18. constexpr double K2c = -273.15;
  19. static int lowcol = 16, hicol = 55;

  20. constexpr double brtemp(double bt, double lam_um) {
  21.         return Hc_k / lam_um / std::log(H2c_2 / pow(lam_um, 5) / bt + 1);
  22. }

  23. int segmented_linear_color(float val, float loclow, float lochigh,
  24.         int locmincol, int locmaxcol) {
  25.         return locmincol + (locmaxcol - locmincol) *
  26.                 std::clamp<double>((val - loclow) / (lochigh - loclow), 0., 1.);
  27. }

  28. int color_brtemp(double brtempC) {
  29.         if (brtempC >= 9)
  30.                 return segmented_linear_color(brtempC, 9, 33, 35, 16);
  31.         if (brtempC >= -31)
  32.                 return segmented_linear_color(brtempC, -31, 9, 36, 45);
  33.         if (brtempC >= -42)
  34.                 return 45;
  35.         if (brtempC >= -54)
  36.                 return 46;
  37.         if (brtempC >= -64)
  38.                 return 47;
  39.         if (brtempC >= -70)
  40.                 return 48;
  41.         if (brtempC >= -76)
  42.                 return 49;
  43.         if (brtempC >= -77.6)
  44.                 return 50;
  45.         if (brtempC >= -79.3)
  46.                 return 51;
  47.         if (brtempC >= -81)
  48.                 return 52;
  49.         if (brtempC >= -85)
  50.                 return 53;
  51.         if (brtempC >= -90)
  52.                 return 54;
  53.         return 55;
  54. }

  55. void set_color() {
  56.         for (int i = 16; i < 36; i++)
  57.         {
  58.                 float nsegp = float(i - 16) / 19;
  59.                 float bg = nsegp * 0.6 + 0.4;
  60.                 cpgscr(i, bg - 0.1,
  61.                         bg, bg);
  62.         }
  63.         for (int i = 36; i < 45; i++)
  64.         {
  65.                 float cof = pow(float(i - 35), 1.1) / pow(10, 1.1);
  66.                 float use = pow(45 - i, 2) / pow(10, 2);
  67.                 float gd = 0.5 * cof + 0.47;
  68.                 // cpgscr(i, use + (1 - use) * (cof / 3 + 0.5),
  69.                 //         use + (1 - use) * (cof / 2.25 + 0.3),
  70.                 //         use + (1 - use) * (0.34 + cof / 7));
  71.                 cpgscr(i, gd + 0.03, gd + 0.03, gd);
  72.         }
  73.         cpgscr(45, 0, 1, 0.5);
  74.         cpgscr(46, 0, 0.7, 0.35);
  75.         cpgscr(47, 0, 0.4, 0.2);
  76.         cpgscr(48, 1, 0.5, 0);
  77.         cpgscr(49, 1, 0, 0.5);
  78.         cpgscr(50, 0, 0.65, 1);
  79.         cpgscr(51, 0, 0.5, 1);
  80.         cpgscr(52, 0, 0.35, 1);
  81.         cpgscr(53, 1, 1, 0.2);
  82.         cpgscr(54, 1, 0.6, 0.2);
  83.         cpgscr(55, 1, 1, 1);
  84. }

  85. template<int32 Nt>
  86. using SDtype =
  87.         std::conditional_t<Nt == 3, int8,
  88.         std::conditional_t<Nt == 4, char8,
  89.         std::conditional_t<Nt == 5, float32,
  90.         std::conditional_t<Nt == 6, float64,
  91.         std::conditional_t<Nt == 20, int8,
  92.         std::conditional_t<Nt == 21, uint8,
  93.         std::conditional_t<Nt == 22, int16,
  94.         std::conditional_t<Nt == 23, uint16,
  95.         std::conditional_t<Nt == 24, int32,
  96.         std::conditional_t<Nt == 25, uint32, void>>>>>>>>>>;

  97. struct SDfile {
  98.         int32 sdid;
  99.         int32 ndataset, nattr;
  100.         template<class Tp>
  101.         struct Attribute {
  102.                 int32 obj_id, index;
  103.                 int32 type, count;
  104.                 char name[256];
  105.                 std::vector<Tp> data;
  106.                 Attribute(int32 pobj_id, int32 pindex)
  107.                         :obj_id(pobj_id), index(pindex) {
  108.                         SDattrinfo(pobj_id, pindex, name, &type, &count);
  109.                         data.assign(count, Tp());
  110.                         SDreadattr(obj_id, index, data.data());
  111.                 }
  112.         };
  113.         struct SDS {
  114.                 int32 All_begin[MAX_VAR_DIMS]{};
  115.                 template<class Tp>
  116.                 struct Data_array {
  117.                         int32 dimn;
  118.                         int32 dims[MAX_VAR_DIMS];
  119.                         Tp* data;
  120.                         Tp operator[] (std::initializer_list<int32> dimensions) const {
  121.                                 auto it = dimensions.end();
  122.                                 size_t dimit = dimn - 1, pnow = 1, datanow = 0;
  123.                                 do
  124.                                 {
  125.                                         --it;
  126.                                         datanow += *it * pnow;
  127.                                         pnow *= dims[dimit--];
  128.                                 } while (it != dimensions.begin());
  129.                                 return data[datanow];
  130.                         }
  131.                         Data_array(const SDS* from_sds, const int32* vdims)
  132.                                 :dimn(from_sds->dimn) {
  133.                                 std::copy_n(vdims, from_sds->dimn, dims);
  134.                                 size_t tot = 1;
  135.                                 for (int i = 0; i < dimn; i++)
  136.                                         tot *= dims[i];
  137.                                 data = new Tp[tot];
  138.                         }
  139.                         ~Data_array() { delete[] data; }
  140.                 };
  141.                 int32 sdsid;
  142.                 char name[256];
  143.                 int32 dimn;
  144.                 int32 dims[MAX_VAR_DIMS];
  145.                 int32 dattype;
  146.                 int32 nattr;
  147.                 template<class Tp>
  148.                 Data_array<Tp> get() {
  149.                         Data_array<Tp> res(this, dims);
  150.                         SDreaddata(sdsid, All_begin, nullptr, dims, res.data);
  151.                         return res;
  152.                 }
  153.                 template<class Tp>
  154.                 Data_array<Tp> get(const std::vector<int32>& start, const std::vector<int32>& cntrd) {
  155.                         auto mvas = start, mvac = cntrd;
  156.                         Data_array<Tp> res(this, cntrd.data());
  157.                         SDreaddata(sdsid, mvas.data(), nullptr, mvac.data(), res.data);
  158.                         return res;
  159.                 }
  160.                 template<class Tp>
  161.                 Attribute<Tp> attribute(int32 attr_index) {
  162.                         return Attribute<Tp>(sdsid, attr_index);
  163.                 }
  164.                 template<class Tp>
  165.                 Attribute<Tp> attribute(std::string_view attrname) {
  166.                         return Attribute<Tp>(sdsid, SDfindattr(sdsid, attrname.data()));
  167.                 }
  168.                 SDS(int sds_id)
  169.                         :sdsid(sds_id) {
  170.                         SDgetinfo(sds_id, name, &dimn, dims, &dattype, &nattr);
  171.                 }
  172.                 ~SDS() { SDendaccess(sdsid); }
  173.         };
  174.         SDS select(int32 index) {
  175.                 return SDS(SDselect(sdid, index));
  176.         }
  177.         SDS select(std::string_view sdsname) {
  178.                 return SDS(SDselect(sdid, SDnametoindex(sdid, sdsname.data())));
  179.         }
  180.         template<class Tp>
  181.                 Attribute<Tp> attribute(int32 attr_index) {
  182.                 return Attribute<Tp>(sdid, attr_index);
  183.         }
  184.         template<class Tp>
  185.         Attribute<Tp> attribute(std::string_view attrname) {
  186.                 return Attribute<Tp>(sdid, SDfindattr(sdid, attrname.data()));
  187.         }
  188.         SDfile(std::string_view filename)
  189.                 :sdid(SDstart(filename.data(), DFACC_READ)) {
  190.                 SDfileinfo(sdid, &ndataset, &nattr);
  191.         }
  192.         ~SDfile() { SDend(sdid); }
  193. };

  194. std::map<std::string, double> Center_Wl_in_um{
  195.         {"1", (0.62 + 0.67) / 2},
  196.         {"2", (0.841 + 0.876) / 2},
  197.         {"3", (0.459 + 0.479) / 2},
  198.         {"4", (0.545 + 0.565) / 2},
  199.         {"5", (1.23 + 1.25) / 2},
  200.         {"6", (1.628 + 1.652) / 2},
  201.         {"7", (2.105 + 2.155) / 2},
  202.         {"8", (0.405 + 0.42) / 2},
  203.         {"9", (0.438 + 0.448) / 2},
  204.         {"10", (0.483 + 0.493) / 2},
  205.         {"11", (0.526 + 0.536) / 2},
  206.         {"12", (0.546 + 0.556) / 2},
  207.         {"13hi", (0.662 + 0.672) / 2},
  208.         {"13lo", (0.662 + 0.672) / 2},
  209.         {"14hi", (0.673 + 0.683) / 2},
  210.         {"14lo", (0.673 + 0.683) / 2},
  211.         {"15", (0.743 + 0.753) / 2},
  212.         {"16", (0.862 + 0.877) / 2},
  213.         {"17", (0.89 + 0.92) / 2},
  214.         {"18", (0.931 + 0.941) / 2},
  215.         {"19", (0.915 + 0.965) / 2},
  216.         {"20", (3.66 + 3.84) / 2},
  217.         {"21", (3.929 + 3.989) / 2},
  218.         {"22", (3.929 + 3.989) / 2},
  219.         {"23", (4.02 + 4.08) / 2},
  220.         {"24", (4.433 + 4.498) / 2},
  221.         {"25", (4.482 + 4.549) / 2},
  222.         {"26", (1.36 + 1.39) / 2},
  223.         {"27", (6.535 + 6.895) / 2},
  224.         {"28", (7.175 + 7.475) / 2},
  225.         {"29", (8.4 + 8.7) / 2},
  226.         {"30", (9.58 + 9.88) / 2},
  227.         {"31", (10.78 + 11.28) / 2},
  228.         {"32", (11.77 + 12.27) / 2},
  229.         {"33", (13.185 + 13.485) / 2},
  230.         {"34", (13.485 + 13.785) / 2},
  231.         {"35", (13.785 + 14.085) / 2},
  232.         {"36", (14.085 + 14.385) / 2}
  233. };

  234. template<class Tp>
  235. Tp* interp(const SDfile::SDS::Data_array<Tp>& init, int dsth, int dstw);

  236. int main(int argc, char** argv) {
  237.         using namespace std;
  238.         if (argc < 2)
  239.                 throw invalid_argument("必须在 argv[1] 提供文件名");
  240.         auto lasttime = chrono::high_resolution_clock::now();
  241.         SDfile file(argv[1]);
  242.         /*
  243.          Latitude,Longitude,EV_1KM_RefSB,EV_1KM_RefSB_Uncert_Indexes,EV_1KM_Emissive,
  244.          EV_1KM_Emissive_Uncert_Indexes,EV_250_Aggr1km_RefSB,EV_250_Aggr1km_RefSB_Uncert_Indexes,
  245.          EV_250_Aggr1km_RefSB_Samples_Used,EV_500_Aggr1km_RefSB,EV_500_Aggr1km_RefSB_Uncert_Indexes,
  246.          EV_500_Aggr1km_RefSB_Samples_Used,Height,SensorZenith,SensorAzimuth,
  247.          Range,SolarZenith,SolarAzimuth,gflags,EV_Band26,EV_Band26_Uncert_Indexes,Band_250M,
  248.          Band_500M,Band_1KM_RefSB,Band_1KM_Emissive,Noise in Thermal Detectors,
  249.          Change in relative responses of thermal detectors,DC Restore Change for Thermal Bands,
  250.          DC Restore Change for Reflective 250m Bands,DC Restore Change for Reflective 500m Bands,
  251.          DC Restore Change for Reflective 1km Bands
  252.         */
  253.         string main_sdsname = "EV_1KM_Emissive";
  254.         auto sds = file.select(main_sdsname);
  255.         auto fulldat = sds.get<uint16>();
  256.         auto getbandname = [&] (int bdid) {
  257.                 string bandname;
  258.                 auto bds = sds.attribute<char>("band_names");
  259.                 int cnt = 0;
  260.                 for (auto ch : bds.data)
  261.                         if (ch == ',')
  262.                         {
  263.                                 if (cnt == bdid)
  264.                                         break;
  265.                                 bandname.clear();
  266.                                 ++cnt;
  267.                         }
  268.                         else
  269.                                 bandname.push_back(ch);
  270.                 return bandname;
  271.         };
  272.         auto readband = [&] (int bdid) {
  273.                 auto emmmat = new float[sds.dims[1] * sds.dims[2]];
  274.                 string bandname = getbandname(bdid);
  275.                 float ro = sds.attribute<float>("radiance_offsets").data[bdid],
  276.                 rs = sds.attribute<float>("radiance_scales").data[bdid];
  277.                 for (int i = 0; i < sds.dims[1]; i++)
  278.                         for (int j = 0; j < sds.dims[2]; j++)
  279.                                 emmmat[i * sds.dims[2] + j] = (fulldat[{bdid, i, j}] - ro) * rs;
  280.                 for (int i = 0; i < sds.dims[1] * sds.dims[2]; i++)
  281.                         emmmat[i] = brtemp(emmmat[i], Center_Wl_in_um.at(bandname));
  282.                 return emmmat;
  283.         };
  284.         int bdid = 10;
  285.         string lbinfo = main_sdsname + " Band\\d" + getbandname(bdid) + "\\u";
  286.         //lbinfo += " Anomaly";
  287.         lbinfo += " " + to_string(Center_Wl_in_um.at(getbandname(bdid))) + "um";
  288.         auto emmmat = readband(bdid);
  289.         string outname = string("'") + argv[1] + "-";
  290.         for (auto ch : lbinfo)
  291.                 if (ch == ' ')
  292.                         outname.push_back('-');
  293.                 else if (ch != '\\')
  294.                         outname.push_back(ch);
  295.         outname += ".png'";
  296.         auto solarzsds = file.select("SolarZenith");
  297.         auto solarzl0 = solarzsds.get<int16>();
  298.         SDfile::SDS::Data_array<float> solarzl1(&solarzsds, solarzsds.dims);
  299.         for (int i = 0; i < solarzl0.dims[0] * solarzl0.dims[1]; i++)
  300.                 solarzl1.data[i] = solarzl0.data[i] / 1e2;
  301.         auto solarzl2 = interp<float>(solarzl1, sds.dims[1], sds.dims[2]);
  302.         auto latsds = file.select("Latitude");
  303.         auto latl1 = latsds.get<float>();
  304.         auto latl2 = interp<float>(latl1, sds.dims[1], sds.dims[2]);
  305.         auto lonsds = file.select("Longitude");
  306.         auto lonl1 = lonsds.get<float>();
  307.         for (int i = 0; i < lonl1.dims[0] * lonl1.dims[1]; i++)
  308.                 if (lonl1.data[i] < 0)
  309.                         lonl1.data[i] += 360;
  310.         auto lonl2 = interp<float>(lonl1, sds.dims[1], sds.dims[2]);
  311.         // for (int i = 0; i < sds.dims[1] * sds.dims[2]; i++)
  312.         //         emmmat[i] = brtemp(emmmat[i] / cos(Deg2rad * solarzl2[i]),
  313.         //                 Center_Wl_in_um.at(getbandname(bdid)));
  314.         auto tmp = file.attribute<char>("CoreMetadata.0").data;
  315.         string coremeta(tmp.begin(), tmp.end());
  316.         auto getcmt = [&] (string obj) {
  317.                 auto posm = coremeta.find("OBJECT                 = " + obj);
  318.                 auto pos = coremeta.find("VALUE                = ", posm);
  319.                 int offset = 23, backoff = 0;
  320.                 if (coremeta[pos + offset] == '"')
  321.                 {
  322.                         ++offset;
  323.                         ++backoff;
  324.                 }
  325.                 auto end = coremeta.find('\n', pos + offset);
  326.                 return coremeta.substr(pos + offset, end - pos - offset - backoff);
  327.         };
  328.         string device = getcmt("ASSOCIATEDSENSORSHORTNAME") + "/" +
  329.                 getcmt("ASSOCIATEDPLATFORMSHORTNAME");
  330.         string endtime = getcmt("RANGEENDINGDATE") + " " +
  331.                 getcmt("RANGEENDINGTIME");
  332.         while (endtime.back() == '0')
  333.                 endtime.pop_back();
  334.         endtime.pop_back();
  335.         endtime += "\\uUTC\\d";
  336.         cout << "读取数据用时: " <<
  337.                 chrono::duration_cast<chrono::microseconds>(chrono::high_resolution_clock::now()
  338.                         - lasttime).count() / 1e6 << " s\n";
  339.         lasttime = chrono::high_resolution_clock::now();
  340. #ifdef PNG_OUTPUT
  341.         if (cpgopen("tmp.ps/VCPS") < 0)
  342. #else
  343.         if (cpgopen("/XWINDOW") < 0)
  344. #endif
  345.                 throw runtime_error("打开PGPLOT设备错误");
  346.         cpgbbuf();
  347.         auto latmmx =
  348.                 minmax_element(latl1.data, latl1.data + latl1.dims[0] * latl1.dims[1]),
  349.         lonmmx =
  350.                 minmax_element(lonl1.data, lonl1.data + lonl1.dims[0] * lonl1.dims[1]);
  351.         cpgenv(*lonmmx.first, *lonmmx.second, *latmmx.first, *latmmx.second
  352.                 , 1, 1);
  353.         //cpgenv(117, 135, 10, 25, 1, 1);
  354.         cpglab("Lon", "Lat", argv[1]);
  355.         cpgmtxt("R", 1, 0, 0, lbinfo.c_str());
  356.         cpgmtxt("B", 2.5, 0.15, 0, device.c_str());
  357.         cpgmtxt("B", 2.5, 0.6, 0, endtime.c_str());
  358.         set_color();
  359.         cpgscir(lowcol, hicol);
  360.         for (int i = 0; i < sds.dims[1] * sds.dims[2]; i++)
  361.                 {
  362.                         if (isnan(emmmat[i]))
  363.                                 continue;
  364.                         int col = color_brtemp(emmmat[i] + K2c);
  365.                         int rind = i / sds.dims[2], cind = i % sds.dims[2];
  366.                         double colrng = (float)abs(cind - sds.dims[2] / 2) / sds.dims[2];
  367.                         double siz = 8e-3 * exp(3.5 * colrng + 0.8 * sqrt(abs(latl2[i]) * 1.3e-4)) +
  368.                                 4e-4 * exp(4 * pow(colrng, 2));
  369.                         cpgpixl(&col, 1, 1, 1, 1, 1, 1, lonl2[i],
  370.                                 lonl2[i] + siz, latl2[i], latl2[i] + siz);
  371.                 }
  372.         cpgsch(0.8);
  373.         cpgsci(color_brtemp(33));
  374.         cpgmtxt("R", 2.5, 0, 0, "W");
  375.         cpgsci(color_brtemp(24));
  376.         cpgmtxt("R", 2.5, 0, -1, "M");
  377.         cpgsci(color_brtemp(9.5));
  378.         cpgmtxt("R", 2.5, 0, -2, "G");
  379.         cpgsci(color_brtemp(8.5));
  380.         cpgmtxt("R", 2.5, 0.1, 0, "O");
  381.         cpgsci(color_brtemp(-30.5));
  382.         cpgmtxt("R", 2.5, 0.1, -1, "W");
  383.         cpgsci(color_brtemp(-36.5));
  384.         cpgmtxt("R", 2.5, 0.2, 0, "DG");
  385.         cpgsci(color_brtemp(-48));
  386.         cpgmtxt("R", 2.5, 0.3, 0, "MG");
  387.         cpgsci(color_brtemp(-59));
  388.         cpgmtxt("R", 2.5, 0.4, 0, "LG");
  389.         cpgsci(color_brtemp(-67));
  390.         cpgmtxt("R", 2.5, 0.5, 0, "B");
  391.         cpgsci(color_brtemp(-73));
  392.         cpgmtxt("R", 2.5, 0.6, 0, "W");
  393.         cpgsci(color_brtemp(-76.5));
  394.         cpgmtxt("R", 2.5, 0.7, 0, "C");
  395.         cpgsci(color_brtemp(-78));
  396.         cpgmtxt("R", 2.5, 0.7, -1, "M");
  397.         cpgsci(color_brtemp(-80.5));
  398.         cpgmtxt("R", 2.5, 0.7, -2, "G");
  399.         cpgsci(color_brtemp(-81.5));
  400.         cpgmtxt("R", 2.5, 0.8, 0, "C");
  401.         cpgsci(color_brtemp(-87));
  402.         cpgmtxt("R", 2.5, 0.8, -1, "D");
  403.         cpgsci(color_brtemp(-100));
  404.         cpgmtxt("R", 2.5, 0.8, -2, "G");
  405.         cpgebuf();
  406.         cpgend();
  407.         cout << "PGPLOT输出用时: " <<
  408.                 chrono::duration_cast<chrono::microseconds>(chrono::high_resolution_clock::now()
  409.                         - lasttime).count() / 1e6 << " s\n";
  410.         lasttime = chrono::high_resolution_clock::now();
  411. #ifdef PNG_OUTPUT
  412.         system(("magick -density 240 tmp.ps " + outname).c_str());
  413.         cout << "PNG转换用时: " <<
  414.                 chrono::duration_cast<chrono::microseconds>(chrono::high_resolution_clock::now()
  415.                         - lasttime).count() / 1e6 << " s\n";
  416.         cout << "输出到PNG文件: " << outname << endl;
  417.         system("rm tmp.ps");
  418. #endif
  419.         delete[] solarzl2;
  420.         delete[] latl2;
  421.         delete[] lonl2;
  422.         delete[] emmmat;
  423.         return 0;
  424. }

  425. template<class Tp>
  426. Tp* interp(const SDfile::SDS::Data_array<Tp>& init, int dsth, int dstw) {
  427.         auto res = new Tp[dsth * dstw];
  428.         res[0] = init[{0, 0}];
  429.         res[dsth * dstw - 1] = init[{init.dims[0] - 1, init.dims[1] - 1}];
  430.         double deltaX = double(init.dims[0] - 1) / (dsth - 1), deltaY = double(init.dims[1] - 1) / (dstw - 1);
  431.         for (int i = 0; i < dsth; i++)
  432.                 for (int j = 0; j < dstw; j++)
  433.                         if ((i || j) && (i != dsth - 1 || j != dstw - 1))
  434.                         {
  435.                                 double mappedX = deltaX * i, mappedY = deltaY * j;
  436.                                 double cX = mappedX - floor(mappedX), cY = mappedY - floor(mappedY);
  437.                                 int x0 = mappedX, x1 = std::min<int>(ceil(mappedX), init.dims[0] - 1);
  438.                                 int y0 = mappedY, y1 = std::min<int>(ceil(mappedY), init.dims[1] - 1);
  439.                                 res[i * dstw + j] = (1 - cX) * (1 - cY) * init[{x0, y0}] +
  440.                                         (1 - cX) * cY * init[{x0, y1}] +
  441.                                                 cX * (1 - cY) * init[{x1, y0}] +
  442.                                                         cX * cY * init[{x1, y1}];
  443.                         }
  444.         return res;
  445. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
SIGNATURE

1

主题

15

回帖

137

积分

热带低压

自定义头衔测试

积分
137
 楼主| 发表于 2026-2-24 16:03 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
SIGNATURE

1

主题

15

回帖

137

积分

热带低压

自定义头衔测试

积分
137
 楼主| 发表于 2026-2-26 07:27 | 显示全部楼层
Band01 VIS和真没有加海温反演修正的粗糙伪VIS

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
SIGNATURE

1

主题

15

回帖

137

积分

热带低压

自定义头衔测试

积分
137
 楼主| 发表于 2026-2-26 07:30 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
SIGNATURE
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|TY_Board论坛

GMT+8, 2026-3-7 11:14 , Processed in 0.056134 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表