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分鐘之內),目前還沒有很好的方法,還需要思考
如果大家對經緯度這裡有很好的想法,可以私聊我討論一下,一起進步