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分钟之内),目前还没有很好的方法,还需要思考
如果大家对经纬度这里有很好的想法,可以私聊我讨论一下,一起进步