• MeteoInfoJava解析与绘图教程(八)_java解析卫星FY4A一级产品文件(HDF举例)


    MeteoInfo-Java解析与绘图教程(八)_java解析卫星一级产品文件(HDF举例)

    最近解析卫星数据遇到了一级产品,它的解析方式与之前文章说的有些不同,特此补充一下

    卫星的一级产品,里面是没有经纬度的,并且里面只有通道数据,同时一级产品也分500KM,1000KM,2000KM,4000KM,解析思路是一样的,我就直接用4000KM举例了

    首先我们要确定文件里面都有那些数据

            String path = "D:\\解析数据\\卫星\\Z_SATE_C_BAWX_20220416084552_P_FY4A-_AGRI--_N_REGC_1047E_L1-_FDI-_MULT_NOM_20220416083836_20220416084253_4000M_V0001.HDF";
            MeteoDataInfo meteo = new MeteoDataInfo();
            meteo.openNetCDFData(path);
            //查询文件存放参数名称
            List<String> list = meteo.getDataInfo().getVariableNames();

     打印出来,发现参数有NOMObsColumn(行列号表),NOMChannel(通道数据,共计14个)以及对应的CALChannel(定标数据,对应通道数据也有14个)

    这样就确定了文件里有14个通道的数据了

    我这里就拿01通道要数据渲染

            String path = "D:\\解析数据\\卫星\\Z_SATE_C_BAWX_20220416084552_P_FY4A-_AGRI--_N_REGC_1047E_L1-_FDI-_MULT_NOM_20220416083836_20220416084253_4000M_V0001.HDF";
            MeteoDataInfo meteo = new MeteoDataInfo();
            meteo.openNetCDFData(path);
            //行列位置读取
            Array column = meteo.read("NOMObsColumn");
            //数据
            Array array = meteo.read("NOMChannel01");
            //获取x,y下标数
            int[] shape = array.getShape();
            //获取x起点,y起点
            Index index = array.getIndex();
            GridData grid = new GridData(0, 0.1, shape[1], 0, 0.1, shape[0]);
            grid.missingValue = -1;
            //第一有效值,最后有效值,平分除二
            for(int i=0; i<column.getSize()/2; i++){
                //2字节,第一个值
                int x = column.getShort(i * 2);
                //2字节,最后一个值
                int y = column.getShort(i * 2 + 1);
                if(x != -1 && y != -1){
                    for(int j=x; j<=y; j++){
                        index.set(i, j);
                        grid.data[shape[0] - i - 1][j] = array.getShort(index);
                    }
                }
            }
            RasterLayer layer = DrawMeteoData.createRasterLayer(grid, "");
            MapView view = new MapView();
            view.addLayer(layer);
            MeteoinfoUtil.drawImage(view, grid.getXNum(), "D:/Data/1.png");

    卫星一级产品绘图核心部分就是NOMObsColumn的应用,我们首先要确定这个的用处

     数据是网格数据,但有效的数据每一行都是有限的,第一有效值就是开头,最后有效值就是结尾,所以行列号有2列,行和网络数据的y相同

    以上就是没有确定色阶的第一通道的绘制

    对比卫星一级产品来说,最难的就是经纬度的问题,虽然官方给了对应的算法,但java的计算速度确实慢,导致出图不快(1分钟之内),目前还没有很好的方法,还需要思考

    如果大家对经纬度这里有很好的想法,可以私聊我讨论一下,一起进步

  • 相关阅读:
    老话题之C#写邮件发送
    MVC readioButtonList的创作过程及运用
    asp.net发送短信
    关于MVC打印问题,打印指定的内容
    Java WebSocket HttpSession与WebSocket Session的关联
    JUnit accuracy/failure/stress test区别
    JUnit pass/failure/error区别
    Eclipse 重构
    Java 注释
    Java API概述
  • 原文地址:https://www.cnblogs.com/zdsgjh/p/16206537.html
Copyright © 2020-2023  润新知