/// <summary> /// Convert MICAPS1 data to GrADS station data /// </summary> /// <param name="inFile"></param> /// <param name="outFile"></param> public void MICAPS1ToGrADS(string inFile, string outFile) { MICAPS1DataInfo aDataInfo = new MICAPS1DataInfo(); GrADSDataInfo CGrADSData = new GrADSDataInfo(); aDataInfo = ReadMicaps1(inFile); CGrADSData.WriteGrADSStationData(outFile, aDataInfo); CGrADSData.WriteGrADSCtlFile_Station(outFile, aDataInfo); }
private void B_Convert_Click(object sender, EventArgs e) { //Check data folder string dataFolder = TB_DataFolder.Text; if (!Directory.Exists(dataFolder)) { MessageBox.Show("The data folder is not exist!" + Environment.NewLine + dataFolder, "Error"); return; } //Check start/end time DateTime sTime = DTP_Start.Value; DateTime eTime = DTP_End.Value; if (eTime < sTime) { MessageBox.Show("End time is early than start time!", "Error"); return; } int tIncrement = int.Parse(TB_Increment.Text); string incrementUnit = CB_Increment.Text; int timeNum = (eTime - sTime).Days + 1; //Set output file SaveFileDialog aDLG = new SaveFileDialog(); aDLG.Filter = "GrADS Control File (*.ctl)|*.ctl"; if (aDLG.ShowDialog() == DialogResult.OK) { string cFile = aDLG.FileName; string dFile = Path.ChangeExtension(cFile, ".dat"); GrADSDataInfo aDataInfo = new GrADSDataInfo(); aDataInfo.FileName = cFile; aDataInfo.DSET = dFile; aDataInfo.TITLE = "OMI AI data"; aDataInfo.DTYPE = "GRIDDED"; aDataInfo.XDEF.Type = "LINEAR"; aDataInfo.XDEF.XNum = 360; aDataInfo.XDEF.XMin = -179.5f; aDataInfo.XDEF.XDelt = 1.0f; aDataInfo.YDEF.Type = "LINEAR"; aDataInfo.YDEF.YNum = 180; aDataInfo.YDEF.YMin = -89.5f; aDataInfo.YDEF.YDelt = 1.0f; aDataInfo.ZDEF.Type = "LINEAR"; aDataInfo.ZDEF.ZNum = 1; aDataInfo.ZDEF.SLevel = 1; aDataInfo.ZDEF.ZDelt = 1; aDataInfo.TDEF.Type = "LINEAR"; aDataInfo.TDEF.TNum = timeNum; aDataInfo.TDEF.STime = sTime; aDataInfo.TDEF.TDelt = "1dy"; Variable aVar = new Variable(); aVar.Name = "AI"; //aVar.LevelNum = 0; aVar.Units = "99"; aVar.Description = "OMI AI"; aDataInfo.VARDEF.AddVar(aVar); aDataInfo.MissingValue = -999; FileStream fs = new FileStream(dFile, FileMode.Create, FileAccess.Write); BinaryWriter bw = new BinaryWriter(fs); //Time loop DateTime aTime = sTime; string inFile; int fNum = 0; while (aTime.Date <= eTime.Date) { inFile = Path.Combine(dataFolder, "L3_aersl_omi_" + aTime.ToString("yyyyMMdd") + ".txt"); if (File.Exists(inFile)) { fNum += 1; //Read grid data from OMI AI data file double[,] gridData = new double[180, 360]; StreamReader sr = new StreamReader(inFile); sr.ReadLine(); sr.ReadLine(); sr.ReadLine(); string aLine = sr.ReadLine(); string dataStr = string.Empty; int yNum = 0; while (aLine != null) { aLine = aLine.Substring(1); dataStr = dataStr + aLine; if (aLine.Contains("lat")) { for (int i = 0; i < 360; i++) { string dStr = dataStr.Substring(i * 3, 3); if (dStr == "888" || dStr == "999") { gridData[yNum, i] = aDataInfo.MissingValue; } else { gridData[yNum, i] = double.Parse(dStr) / 10; } } dataStr = string.Empty; yNum++; } aLine = sr.ReadLine(); } sr.Close(); //Write grid data to GrADS data file aDataInfo.WriteGrADSData_Grid(bw, gridData); } else { aDataInfo.WriteGrADSData_Grid_Null(bw); } aTime = aTime.AddDays(tIncrement); } bw.Close(); fs.Close(); //Write ctl file aDataInfo.WriteGrADSCTLFile(); } }
private void SavGrADSMaskoutFile() { SaveFileDialog SFDlg = new SaveFileDialog(); SFDlg.Filter = "GrADS File (*.ctl)|*.ctl"; if (SFDlg.ShowDialog() == DialogResult.OK) { string aFile = SFDlg.FileName; int i; bool hasSelShape = _currentLayer.HasSelectedShapes(); //Get grid set PolygonShape aPGS = new PolygonShape(); Extent aExtent = new Extent(); int n = 0; for (i = 0; i < _currentLayer.ShapeNum; i++) { aPGS = (PolygonShape)_currentLayer.ShapeList[i]; if (hasSelShape) { if (!aPGS.Selected) { continue; } } if (n == 0) { aExtent = aPGS.Extent; } else { aExtent = MIMath.GetLagerExtent(aExtent, aPGS.Extent); } n += 1; } GridDataSetting aGDP = new GridDataSetting(); aGDP.DataExtent.minX = Math.Floor(aExtent.minX); aGDP.DataExtent.maxX = Math.Ceiling(aExtent.maxX); aGDP.DataExtent.minY = Math.Floor(aExtent.minY); aGDP.DataExtent.maxY = Math.Ceiling(aExtent.maxY); aGDP.XNum = 20; aGDP.YNum = 20; frmGridSet aFrmGS = new frmGridSet(); aFrmGS.SetParameters(aGDP); if (aFrmGS.ShowDialog() == DialogResult.OK) { aFrmGS.GetParameters(ref aGDP); //Show progressbar this.toolStripProgressBar1.Visible = true; this.toolStripProgressBar1.Value = 0; this.Cursor = Cursors.WaitCursor; Application.DoEvents(); //Get grid data double[,] gridData = new double[aGDP.YNum, aGDP.XNum]; int j, p; MeteoInfoC.PointD aPoint = new MeteoInfoC.PointD(); double xSize, ySize; xSize = (aGDP.DataExtent.maxX - aGDP.DataExtent.minX) / (aGDP.XNum - 1); ySize = (aGDP.DataExtent.maxY - aGDP.DataExtent.minY) / (aGDP.YNum - 1); bool isIn = false; for (i = 0; i < aGDP.YNum; i++) { aPoint.Y = aGDP.DataExtent.minY + i * ySize; for (j = 0; j < aGDP.XNum; j++) { aPoint.X = aGDP.DataExtent.minX + j * xSize; isIn = false; for (p = 0; p < _currentLayer.ShapeNum; p++) { aPGS = (PolygonShape)_currentLayer.ShapeList[p]; if (hasSelShape) { if (!aPGS.Selected) { continue; } } if (MIMath.PointInPolygon(aPGS, aPoint)) { isIn = true; break; } } if (isIn) { gridData[i, j] = 1; } else { gridData[i, j] = -1; } } this.toolStripProgressBar1.Value = (i + 1) * 100 / aGDP.YNum; Application.DoEvents(); } //Get GrADS data info string dFile = Path.ChangeExtension(aFile, ".dat"); GrADSDataInfo aDataInfo = new GrADSDataInfo(); aDataInfo.TITLE = "Mask data"; aDataInfo.DSET = dFile; aDataInfo.DTYPE = "GRIDDED"; aDataInfo.XDEF.Type = "LINEAR"; aDataInfo.XDEF.XNum = aGDP.XNum; aDataInfo.XDEF.XMin = (Single)aGDP.DataExtent.minX; aDataInfo.XDEF.XDelt = (Single)(xSize); aDataInfo.YDEF.Type = "LINEAR"; aDataInfo.YDEF.YNum = aGDP.YNum; aDataInfo.YDEF.YMin = (Single)aGDP.DataExtent.minY; aDataInfo.YDEF.YDelt = (Single)(ySize); aDataInfo.ZDEF.Type = "LINEAR"; aDataInfo.ZDEF.ZNum = 1; aDataInfo.ZDEF.SLevel = 1; aDataInfo.ZDEF.ZDelt = 1; aDataInfo.TDEF.Type = "LINEAR"; aDataInfo.TDEF.TNum = 1; aDataInfo.TDEF.STime = DateTime.Now; aDataInfo.TDEF.TDelt = "1mo"; Variable aVar = new Variable(); aVar.Name = "mask"; //aVar.LevelNum = 0; aVar.Units = "99"; aVar.Description = "background mask data"; aDataInfo.VARDEF.AddVar(aVar); //Save files aDataInfo.WriteGrADSCTLFile(); aDataInfo.WriteGrADSData_Grid(dFile, gridData); //Hide progressbar this.toolStripProgressBar1.Visible = false; this.Cursor = Cursors.Default; } } }
private void B_Convert_Click(object sender, EventArgs e) { //Check data folder string dataFolder = TB_DataFolder.Text; if (!Directory.Exists(dataFolder)) { MessageBox.Show("The data folder is not exist!" + Environment.NewLine + dataFolder, "Error"); return; } //Check variable list if (CLB_Variables.CheckedItems.Count == 0) { MessageBox.Show("No variable was selected!", "Error"); return; } //Check start/end time DateTime sTime = DTP_Start.Value; DateTime eTime = DTP_End.Value; if (eTime < sTime) { MessageBox.Show("End time is early than start time!", "Error"); return; } //Set output file SaveFileDialog aDLG = new SaveFileDialog(); aDLG.Filter = "GrADS binary (*.bin)|*.bin"; if (aDLG.ShowDialog() == DialogResult.OK) { string outFile = aDLG.FileName; FileStream fs = new FileStream(outFile, FileMode.Create, FileAccess.Write); BinaryWriter bw = new BinaryWriter(fs); List <int> varIdxList = new List <int>(); List <string> varNameList = new List <string>(); for (int i = 0; i < CLB_Variables.CheckedItems.Count; i++) { varIdxList.Add(CLB_Variables.Items.IndexOf(CLB_Variables.CheckedItems[i])); varNameList.Add(CLB_Variables.CheckedItems[i].ToString()); } //Time loop int tIncrement = int.Parse(TB_Increment.Text); string incrementUnit = CB_Increment.Text; DateTime aTime = sTime; string inFile; int fNum = 0; //MICAPSData CMICAPSData = new MICAPSData(); MICAPS1DataInfo aMDataInfo = new MICAPS1DataInfo(); GrADSDataInfo CGrADSData = new GrADSDataInfo(); int timeNum = 0; while (aTime <= eTime) { inFile = Path.Combine(dataFolder, aTime.ToString("yyMMddHH") + ".000"); if (File.Exists(inFile)) { fNum += 1; //aMDataInfo = CMICAPSData.ReadMicaps1(inFile); aMDataInfo.ReadDataInfo(inFile); CGrADSData.WriteGrADSStationData(bw, aMDataInfo, varIdxList); } else { CGrADSData.WriteGrADSStationDataNull(bw); } if (incrementUnit == "hr") { aTime = aTime.AddHours(tIncrement); } else { aTime = aTime.AddDays(tIncrement); } timeNum += 1; } bw.Close(); fs.Close(); //Write ctl file CGrADSData.WriteGrADSCtlFile_Station(outFile, varNameList, aMDataInfo.MissingValue, tIncrement.ToString() + incrementUnit, sTime, timeNum); } }