From 1545335aae569e57e1620958e7710306aa29f315 Mon Sep 17 00:00:00 2001 From: yemanzhongting <838044557@qq.com> Date: Tue, 14 Jan 2020 18:33:59 +0800 Subject: [PATCH 1/2] rain data --- Chapter8/rain_data/climate_file.py | 37 + Chapter8/rain_data/ishJava.class | Bin 0 -> 26925 bytes Chapter8/rain_data/ishJava.java | 1787 +++++++++++++++++ Chapter8/rain_data/noaa_data.py | 66 + ...26\347\253\231\347\274\226\345\217\267.py" | 113 ++ ...5\260\346\215\256\350\257\264\346\230\216" | 20 + 6 files changed, 2023 insertions(+) create mode 100644 Chapter8/rain_data/climate_file.py create mode 100644 Chapter8/rain_data/ishJava.class create mode 100644 Chapter8/rain_data/ishJava.java create mode 100644 Chapter8/rain_data/noaa_data.py create mode 100644 "Chapter8/rain_data/\350\257\273\345\217\226\347\253\231\347\274\226\345\217\267.py" create mode 100644 "Chapter8/\346\225\260\346\215\256\350\257\264\346\230\216" diff --git a/Chapter8/rain_data/climate_file.py b/Chapter8/rain_data/climate_file.py new file mode 100644 index 0000000..2bff2b2 --- /dev/null +++ b/Chapter8/rain_data/climate_file.py @@ -0,0 +1,37 @@ +# -*- coding: UTF-8 -*- +__author__ = 'zy' +__time__ = '2019/4/16 20:01' +import os + + +def file_name(file_dir): + + for root, dirs, files in os.walk(file_dir): + print(root) # 当前目录路径 + print(dirs) # 当前路径下所有子目录 + print(files) # 当前路径下所有非目录子文件 + + print('---------') + print(files) + return files + +if __name__=='__main__': + root_source=r'C:\Users\hp\Desktop\气象数据' + file_list=file_name(root_source) + path=r'C:\Users\hp\Desktop\java_file' + # 修改当前工作目录 + os.chdir(path) + # 查看修改后的工作目录 + retval = os.getcwd() + print(retval) + cmds=[] + for i in file_list: + print(i) + i=r'C:\Users\hp\Desktop\气象数据'+'\\'+i + cmds.append('java -classpath . ishJava'+' '+i+' '+i+'.out') + + for cmd in cmds: + os.system(cmd) + print('处理一个') + + diff --git a/Chapter8/rain_data/ishJava.class b/Chapter8/rain_data/ishJava.class new file mode 100644 index 0000000000000000000000000000000000000000..aadd54293d3a9cbfb28d93721c362a64d6d952a6 GIT binary patch literal 26925 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 W565BFXpyGJp(hIYF2= 2) + { + sInFileName = args[0]; + sOutFileName = args[1]; + } + + if (args.length >= 3) + { + if (args[2].equals("0") || + args[2].equals("1")) + { + iLogLevel = Integer.parseInt(args[2]); // Safe to convert to int. + } + else + { + logIt(fDebug, iPROD, false, "Invalid log message level parameter=["+args[2]+"]. Must be 0 or 1. Defaulting to ["+iLogLevel+"]"); + } + } + + if (args.length >= 4) + { + p_sFilter1 = args[3]; + } + + if (args.length >= 5) + { + p_sFilter2 = args[4]; + } + +// sOutFileName = sInFileName+".java.out"; + + logIt(fDebug, iDEBUG, false, " Input Filename=["+sInFileName+"]"); // Append output to log. + logIt(fDebug, iDEBUG, false, " Output Filename=["+sOutFileName+"]"); // Append output to log. + logIt(fDebug, iDEBUG, false, " Logging Level=["+iLogLevel+"]"); // Append output to log. + logIt(fDebug, iDEBUG, false, "1st Log Message Filter=["+p_sFilter1+"]"); + logIt(fDebug, iDEBUG, false, "2nd Log Message Filter=["+p_sFilter2+"]"); +// End of args + + try + { + BufferedReader fInReader = new BufferedReader(new FileReader(sInFileName)); + + FileWriter fFixed = new FileWriter(sOutFileName); + BufferedWriter fFixedWriter = new BufferedWriter(fFixed); + + fFixedWriter.write(sHeader); // Put header into output file. + + try + { + String line = null; + String lineHold = null; + + while (( line = fInReader.readLine()) != null) + { + iCounter++; +// iOffset = 25; + iLength = line.length(); +// logIt(fDebug, iDEBUG, false, "Record # "+iCounter+" had iLength=["+iLength+"]"); +// System.out.println(line); + +// See where the REM section begins + iREM_IndexOf = line.indexOf("REM"); + if (iREM_IndexOf == -1) + { + iREM_IndexOf = 9999; // If no REM section then set to high value + } + + getCDS(line); // Fields making up the Control Data Section. + + sConcat = sCDS_ID+"-"+sCDS_Wban+"-"+sCDS_Year+"-"+sCDS_Month+"-"+sCDS_Day+" "+sCDS_Hour+":"+sCDS_Minute; + sConcatDate = sCDS_Year+"-"+sCDS_Month+"-"+sCDS_Day; + sConcatMonth = sCDS_Year+"-"+sCDS_Month; + + +// =-=-=-=-=-=-=-=-=-=-=-=-=-= Filter out all but a certain station/date =-=-=-=-=-=-=-=-=-=-=-=-=-= +// if ( (! sConcatDate.equals("2011-01-01")) && (! sConcatDate.equals("2010-01-02")) ) +// if ( (! sConcatDate.equals("2012-04-12")) ) // Whole Day +// if ( (! sConcatMonth.equals("2009-04")) ) // Whole month +// { +// continue; +// } +// +// logIt(fDebug, iDEBUG, false, "line=["+line+"] "); +// +// logIt(fDebug, iDEBUG, false, "Record # "+iCounter+" had sConcat=["+sConcat+"]"); +// +// if (iCounter >= 100) +// { +// logIt(fDebug, iDEBUG, false, "Max count reached. Stopping..."); +// fFixedWriter.flush(); +// fFixedWriter.close(); +// System.exit(22); +// } +// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Done =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +// If there is a generated record for an AT1 element, skip it +// iAT1_IndexOf = line.indexOf("AT1"); +// if (iAT1_IndexOf > 0) + if (sCDS_Source.equals("O")) + { + logIt(fDebug, iDEBUG, false, "Found summary record generated to hold AT1 element in ["+sConcat+"] Source=["+sCDS_Source+"] Skipping record..."); + continue; + } + +// logIt(fDebug, iDEBUG, false, "================================ Source=["+sCDS_Source+"] Type=["+sCDS_Type+"]"); + if (sCDS_Type.equals("SOD ")) + { + iAT1_IndexOf = line.indexOf("AT1"); + iAT2_IndexOf = line.indexOf("AT2"); + iAT3_IndexOf = line.indexOf("AT3"); + iAT4_IndexOf = line.indexOf("AT4"); + iAT5_IndexOf = line.indexOf("AT5"); + iAT6_IndexOf = line.indexOf("AT6"); + iAT7_IndexOf = line.indexOf("AT7"); + iAT8_IndexOf = line.indexOf("AT8"); + + if (iAT1_IndexOf > 0) + { + iATx_Cut = iAT1_IndexOf - iAT1_IndexOf + iATx_Length; + } + if (iAT2_IndexOf > 0) + { + iATx_Cut = iAT2_IndexOf - iAT1_IndexOf + iATx_Length; + } + if (iAT3_IndexOf > 0) + { + iATx_Cut = iAT3_IndexOf - iAT1_IndexOf + iATx_Length; + } + if (iAT4_IndexOf > 0) + { + iATx_Cut = iAT4_IndexOf - iAT1_IndexOf + iATx_Length; + } + if (iAT5_IndexOf > 0) + { + iATx_Cut = iAT5_IndexOf - iAT1_IndexOf + iATx_Length; + } + if (iAT6_IndexOf > 0) + { + iATx_Cut = iAT6_IndexOf - iAT1_IndexOf + iATx_Length; + } + if (iAT7_IndexOf > 0) + { + iATx_Cut = iAT7_IndexOf - iAT1_IndexOf + iATx_Length; + } + if (iAT8_IndexOf > 0) + { + iATx_Cut = iAT8_IndexOf - iAT1_IndexOf + iATx_Length; + } + +// logIt(fDebug, iDEBUG, false, "Found SOD record in ["+sConcat+"] AT1=["+iAT1_IndexOf+"] AT2=["+iAT2_IndexOf+"] AT3=["+iAT3_IndexOf+"] AT4=["+iAT4_IndexOf +// +"] AT5=["+iAT5_IndexOf+"] AT6=["+iAT6_IndexOf+"] AT7=["+iAT7_IndexOf+"] AT8=["+iAT8_IndexOf +// +"] Length=["+iATx_Cut+"]"); + if (iAT1_IndexOf > 0) + { + lineHold = line.substring(0,iAT1_IndexOf)+line.substring(iAT1_IndexOf+iATx_Cut,iLength); + line = lineHold; // Rip out the AT elements and continue processing... + logIt(fDebug, iDEBUG, false, "Removed ATx elements for length of "+iATx_Cut+" characters"); +// logIt(fDebug, iDEBUG, false, "Old line=["+line+"]"); +// logIt(fDebug, iDEBUG, false, "New line=["+lineHold+"]"); + } +// continue; + } + + getMDS(line); // Fields making up the Mandatory Data Section. + getOC1(line); // Fields making up the OC1 element. + getGDx(line); // Fields making up the GDx element. // 03/24/2015 ras + getGF1(line); // Fields making up the GF1 element. + getMW1(line); // Fields making up the MW1 element. + getMW2(line); // Fields making up the MW2 element. + getMW3(line); // Fields making up the MW3 element. + getMW4(line); // Fields making up the MW3 element. // 06/21/2012 ras + getAY1(line); // Fields making up the AY1 element. + getMA1(line); // Fields making up the MA1 element. + sMaxTemp = "***"; + sMinTemp = "***"; + getKA1(line); // Fields making up the KA1 element. + getKA2(line); // Fields making up the KA2 element. + sPcp01 = "*****"; + sPcp01t = " "; + sPcp06 = "*****"; + sPcp06t = " "; + sPcp24 = "*****"; + sPcp24t = " "; + sPcp12 = "*****"; + sPcp12t = " "; + getAA1(line); // Fields making up the AA1 element. + getAA2(line); // Fields making up the AA2 element. + getAA3(line); // Fields making up the AA3 element. + getAA4(line); // Fields making up the AA4 element. + getAJ1(line); // Fields making up the AJ1 element. + getAW1(line); // Fields making up the AW1 element. // 06/06/2012 ras + getAW2(line); // Fields making up the AW2 element. // 06/06/2012 ras + getAW3(line); // Fields making up the AW3 element. // 06/06/2012 ras + getAW4(line); // Fields making up the AW4 element. // 06/06/2012 ras + +// Begin formatting output record.............................................................. + +// Post-processing format changes + if ( sCDS_Wban.equals("99999") ) // Show WBAN=99999 as missing "*****" in output file + { + sCDS_Wban = "*****"; + } +// Build Control Data Section + sControlSection = sCDS_ID+" "+sCDS_Wban+" "+sCDS_Year+sCDS_Month+sCDS_Day+sCDS_Hour+sCDS_Minute; + +// Sort Present Weather elements + sWW1234 = new String[] {sMW1_Ww,sMW2_Ww,sMW3_Ww,sMW4_Ww}; + Arrays.sort(sWW1234); + +// Sort Present Weather (Automated) elements + sAW1234 = new String[] {sAW1_Zz,sAW2_Zz,sAW3_Zz,sAW4_Zz}; + Arrays.sort(sAW1234); + +// Build Mandatory Data Section + the rest of the record + sMandatorySection = sMDS_Dir+" "+sMDS_Spd+" "+sOC1_Gus+" "+sMDS_Clg + +" "+sGF1_Skc+" "+sGF1_Low+" "+sGF1_Med+" "+sGF1_Hi+" "+sMDS_Vsb + +" "+sWW1234[3]+" "+sWW1234[2]+" "+sWW1234[1]+" "+sWW1234[0] + +" "+sAW1234[3]+" "+sAW1234[2]+" "+sAW1234[1]+" "+sAW1234[0]+" "+sAY1_Pw + +" "+sMDS_Temp+" "+sMDS_Dewp+" "+sMDS_Slp+" "+sMA1_Alt+" "+sMA1_Stp + +" "+sMaxTemp+" "+sMinTemp+" "+sPcp01+sPcp01t+sPcp06+sPcp06t+sPcp24+sPcp24t+sPcp12+sPcp12t + +sAJ1_Sd; + + sOutputRecord = sControlSection+" "+sMandatorySection; // Put it all together + fFixedWriter.write(sOutputRecord+"\n"); // Write out the record + + } // while read + + } + catch (IOException ex) { + System.err.println(sProgramName+": IOException 2. Error=[" + ex.getMessage()+"]"); + System.err.println(sProgramName+": Stack trace follows:"); + ex.printStackTrace(); + System.exit(2); + } + + fInReader.close(); + fFixedWriter.flush(); + fFixedWriter.close(); + + } catch (Exception e) { //Catch exception if any + sMessage=sProgramName+": Unspecified Exception 1. Error=[" + e.getMessage()+"]"; + bStdErr=true; + logIt(fDebug, iPROD, false, sMessage); // Append output to log. + System.err.println(sProgramName+": Stack trace follows:"); + e.printStackTrace(); + System.exit(1); + } + + logIt(fDebug, iDEBUG, false, "Processed "+iCounter+" records"); + logIt(fDebug, iDEBUG, false, "Done."); + + } // End of main() + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// formatInt - Right-justifies an int. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static String formatInt(int i, int len) + { + final String blanks = " "; + String s = Integer.toString(i); + if (s.length() < len) + s = blanks.substring(0, len - s.length()) + s; + return s; + } + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// formatFloat - Right-justifies a float. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static String formatFloat(float i, int len) + { + final String blanks = " "; + String s = Float.toString(i); + if (s.length() < len) + s = blanks.substring(0, len - s.length()) + s; + return s; + } + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getCDS - Get CDS section and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getCDS(String p_sRecd) + { + // Extract fields making up the Control Data Section. + sCDS = p_sRecd.substring(0,60); + sCDS_Fill1 = p_sRecd.substring(0,4); + sCDS_ID = p_sRecd.substring(4,10); + sCDS_Wban = p_sRecd.substring(10,15); + sCDS_Year = p_sRecd.substring(15,19); + sCDS_Month = p_sRecd.substring(19,21); + sCDS_Day = p_sRecd.substring(21,23); + sCDS_Hour = p_sRecd.substring(23,25); + sCDS_Minute = p_sRecd.substring(25,27); + sCDS_Source = p_sRecd.substring(27,28); + sCDS_Fill2 = p_sRecd.substring(28,41); + sCDS_Type = p_sRecd.substring(41,45); + sCDS_Fill3 = p_sRecd.substring(45,60); + } // End of getCDS + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getMDS - Get MDS section and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getMDS(String p_sRecd) + { + // Extract fields making up the Mandatory Data Section. + sMDS = p_sRecd.substring(60,105); + sMDS_Dir = p_sRecd.substring(60,63); + sMDS_DirQ = p_sRecd.substring(63,64); + sMDS_DirType = p_sRecd.substring(64,65); + sMDS_Spd = p_sRecd.substring(65,69); + sMDS_Fill2 = p_sRecd.substring(69,70); + sMDS_Clg = p_sRecd.substring(70,75); + sMDS_Fill3 = p_sRecd.substring(75,78); + sMDS_Vsb = p_sRecd.substring(78,84); + sMDS_Fill4 = p_sRecd.substring(84,87); + sMDS_TempSign = p_sRecd.substring(87,88); + sMDS_Temp = p_sRecd.substring(88,92); + sMDS_Fill5 = p_sRecd.substring(92,93); + sMDS_DewpSign = p_sRecd.substring(93,94); + sMDS_Dewp = p_sRecd.substring(94,98); + sMDS_Fill6 = p_sRecd.substring(98,99); + sMDS_Slp = p_sRecd.substring(99,104); + sMDS_Fill7 = p_sRecd.substring(104,105); + + if(sMDS_Dir.equals("999")) + { + sMDS_Dir = "***"; + } + + if(sMDS_DirType.equals("V")) // 06/21/2012 ras + { + sMDS_Dir = "990"; + } + +// logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMDS_Dir=["+sMDS_Dir+"] sMDS_DirQ=["+sMDS_DirQ+"] sMDS_DirType=["+sMDS_DirType+"]"); // temporary - ras + + if(sMDS_Spd.equals("9999")) + { + sMDS_Spd = "***"; + } + else + { +// System.out.println("sMDS=["+sMDS+"] Spd=["+sMDS_Spd+"]"); + iWork = Integer.parseInt(sMDS_Spd); // Convert to integer +// System.out.println("iWork=["+iWork+"]"); + iWork = (int)(((float)iWork / 10.0) * 2.237 + .5); // Convert Meters Per Second to Miles Per Hour +// System.out.println("iWork=["+iWork+"]"); +// sMDS_Spd = fmt3.format(iWork); + sMDS_Spd = formatInt(iWork,3); +// System.out.println("Spd=["+sMDS_Spd+"]"); +// logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMDS_Spd=["+sMDS_Spd+"]"); // temporary - ras + } + + if(sMDS_Clg.equals("99999")) + { + sMDS_Clg = "***"; + } + else + { + try + { + iWork = Integer.parseInt(sMDS_Clg); // Convert to integer + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMDS_Clg value could not be converted to integer=["+sMDS_Clg+"]"); + sMDS_Clg = "***"; // Data error. Set to missing. + } + if( ! sMDS_Clg.equals("***") ) + { + iWork = (int)(((float)iWork * 3.281) / 100.0 + .5); // Convert Meters to Hundreds of Feet + sMDS_Clg = formatInt(iWork,3); +// logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMDS_Clg=["+sMDS_Clg+"]"); // temporary - ras + } + } + + if(sMDS_Vsb.equals("999999")) + { + sMDS_Vsb = "****"; + } + else + { + fWork = Float.parseFloat(sMDS_Vsb); // Convert to floating point + fWork = ((float)(fWork * (float) 0.000625)); // Convert Meters to Miles using CDO's value +// fWork = ((float)(fWork * (float) 0.000621371192237334)); // Convert Meters to Miles + fWorkSave = fWork; // Save this value for possible display + if (fWork > 99.9) + { + fWork = (float)99.0; // Set to value that will fit + } + + if (fWork == (float)10.058125) // Match CDO 2011-04-28 ras + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMDS_Vsb value rounded to 10 miles"); + fWork = (float)10.0; + } + sMDS_Vsb = fmt4_1.format(fWork); + sMDS_Vsb = String.format("%4s",sMDS_Vsb); + } + + if(sMDS_Temp.equals("9999")) + { + sMDS_Temp = "****"; + } + else + { +// System.out.println(sMDS_Temp); + iWork = Integer.parseInt(sMDS_Temp); // Convert to integer + if (sMDS_TempSign.equals("-")) + { + iWork*=-1; + } + if(iWork < -178) + { + iWork = (int)(((float)iWork / 10.0) * 1.8 + 32.0 - .5); // Handle temps below 0F + } + else + { + iWork = (int)(((float)iWork / 10.0) * 1.8 + 32.0 + .5); + } + sMDS_Temp = formatInt(iWork,4); +// System.out.println(sMDS_Temp); + } + + if(sMDS_Dewp.equals("9999")) + { + sMDS_Dewp = "****"; + } + else + { +// System.out.println(sMDS_Dewp); + iWork = Integer.parseInt(sMDS_Dewp); // Convert to integer + if (sMDS_DewpSign.equals("-")) + { + iWork*=-1; + } + if(iWork < -178) + { + iWork = (int)(((float)iWork / 10.0) * 1.8 + 32.0 - .5); // Handle temps below 0F + } + else + { + iWork = (int)(((float)iWork / 10.0) * 1.8 + 32.0 + .5); + } + sMDS_Dewp = formatInt(iWork,4); +// System.out.println(sMDS_Dewp); + } + + if(sMDS_Slp.equals("99999")) + { + sMDS_Slp = "******"; + } + else + { + fWork = Float.parseFloat(sMDS_Slp); // Convert to floating point + fWork = ((float)(fWork / 10.0)); // Convert convert Hectopascals to Millibars + sMDS_Slp = fmt6_1.format(fWork); + sMDS_Slp = String.format("%6s",sMDS_Slp); + } + } // End of getMDS + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getGDx - Get highest GDx element (can be 1 thru 6) and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getGDx(String p_sRecd) + { + int iGDx_Looper = 6; + sGDx = ""; + sGDx_Cov1 = ""; + sGDx_Cov2 = ""; + iGDx_IndexOf = 0; + sGDx_Skc = "***"; + + while ( iGDx_Looper > 0 ) + { + iGDx_IndexOf = p_sRecd.indexOf("GD"+Integer.toString(iGDx_Looper)); + + if ( (iGDx_IndexOf >= 0) && (iGDx_IndexOf < iREM_IndexOf) ) + { +// logIt(fDebug, iDEBUG, false, "GD"+Integer.toString(iGDx_Looper)+" found."); + iGDx_Looper = -1; + continue; + } + iGDx_Looper--; + } + + if ( (iGDx_IndexOf >= 0) && (iGDx_IndexOf < iREM_IndexOf) ) + { + sGDx = p_sRecd.substring(iGDx_IndexOf,iGDx_IndexOf+iGDx_Length); + sGDx_Cov1 = sGDx.substring(3,4); + sGDx_Cov2 = sGDx.substring(4,6); + + try + { + iWork = Integer.parseInt(sGDx_Cov1); // Convert to integer + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sGDx_Cov1 value could not be converted to integer=["+sGDx_Cov1+"]"); + iWork = 999; + sGDx_Skc = "***"; // Data error. Set to missing. + } + + if( iWork < 9 ) + { + switch (iWork) + { + case 0: sGDx_Skc = "CLR"; + break; + case 1: sGDx_Skc = "FEW"; + break; + case 2: sGDx_Skc = "SCT"; + break; + case 3: sGDx_Skc = "BKN"; + break; + case 4: sGDx_Skc = "OVC"; + break; + case 5: sGDx_Skc = "OBS"; + break; + case 6: sGDx_Skc = "POB"; + break; + default: sGDx_Skc = "***"; + break; + } + } + else + { + try + { + iWork = Integer.parseInt(sGDx_Cov2); // Convert to integer + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sGDx_Cov2 value could not be converted to integer=["+sGDx_Cov2+"]"); + iWork = 999; + sGDx_Skc = "***"; // Data error. Set to missing. + } + + switch (iWork) + { + case 0: sGDx_Skc = "CLR"; + break; + case 1: + case 2: sGDx_Skc = "FEW"; + break; + case 3: + case 4: + case 11: + case 12: + case 13: sGDx_Skc = "SCT"; + break; + case 5: + case 6: + case 7: + case 14: + case 15: + case 16: sGDx_Skc = "BKN"; + break; + case 8: + case 17: + case 18: + case 19: sGDx_Skc = "OVC"; + break; + case 9: + case 10: sGDx_Skc = "POB"; + break; + default: sGDx_Skc = "***"; + break; + } + + } + } + + } // End of getGDx + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getOC1 - Get OC1 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getOC1(String p_sRecd) + { + sOC1 = ""; + sOC1_Fill1 = ""; + sOC1_Gus = "***"; + sOC1_Fill2 = ""; + iOC1_IndexOf = p_sRecd.indexOf("OC1"); + if ( (iOC1_IndexOf >= 0) && (iOC1_IndexOf < iREM_IndexOf) ) + { + sOC1 = p_sRecd.substring(iOC1_IndexOf,iOC1_IndexOf+iOC1_Length); + sOC1_Fill1 = sOC1.substring(1,3); // 3 + sOC1_Gus = sOC1.substring(3,7); // 4 + sOC1_Fill2 = sOC1.substring(7,8); // 1 + + if(sOC1_Gus.equals("9999")) // 06/06/2012 ras + { + sOC1_Gus = "***"; +// logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sOC1_Gus missing=["+sOC1_Gus+"]"); // temporary - ras + } + else + { + try + { + iWork = Integer.parseInt(sOC1_Gus); // Convert to integer + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sOC1_Gus value could not be converted to integer=["+sOC1_Gus+"]"); + sOC1_Gus = "***"; // Data error. Set to missing. + } + if( ! sOC1_Gus.equals("***") ) + { + iWork = (int)(((float)iWork / 10.0) * 2.237 + .5); // Convert Meters Per Second to Miles Per Hour + sOC1_Gus = formatInt(iWork,3); +// logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sOC1_Gus=["+sOC1_Gus+"]"); // temporary - ras + } + } + } + } // End of getOC1 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getGF1 - Get GF1 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getGF1(String p_sRecd) + { + sGF1 = ""; + sGF1_Fill1 = ""; + sGF1_Skc = "***"; + sGF1_Fill2 = ""; + sGF1_Low = "*"; + sGF1_Fill3 = ""; + sGF1_Med = "*"; + sGF1_Fill4 = ""; + sGF1_Hi = "*"; + sGF1_Fill5 = ""; + iGF1_IndexOf = p_sRecd.indexOf("GF1"); + if ( (iGF1_IndexOf >= 0) && (iGF1_IndexOf < iREM_IndexOf) ) + { + sGF1 = p_sRecd.substring(iGF1_IndexOf,iGF1_IndexOf+iGF1_Length); + sGF1_Fill1 = sGF1.substring(1,3); + sGF1_Skc = sGF1.substring(3,5); + sGF1_Fill2 = sGF1.substring(5,11); + sGF1_Low = sGF1.substring(11,13); + sGF1_Fill3 = sGF1.substring(13,20); + sGF1_Med = sGF1.substring(20,22); + sGF1_Fill4 = sGF1.substring(22,23); + sGF1_Hi = sGF1.substring(23,25); + sGF1_Fill5 = sGF1.substring(25,26); + } + else // Use GDx info when GF1 is missing // 03/24/2015 ras + { + if ( iGDx_IndexOf > 0 ) + { + logIt(fDebug, iDEBUG, false, "GDx found. Using GDx in place of GF1 info."); + sGF1_Skc = sGDx_Skc; + sGF1_Low = "*"; + sGF1_Med = "*"; + sGF1_Hi = "*"; + } + } + + if ( (iGF1_IndexOf >= 0) && (iGF1_IndexOf < iREM_IndexOf) ) + { + if(sGF1_Skc.equals("99")) + { + sGF1_Skc = "***"; + } + else + { +// System.out.println("DateTime=["+sConcat+"] GF1=["+sGF1+"] Skc=["+sGF1_Skc+"]"); + try + { + iWork = Integer.parseInt(sGF1_Skc); // Convert to integer + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sGF1_Skc value could not be converted to integer=["+sGF1_Skc+"]"); + sGF1_Skc = "***"; // Data error. Set to missing. + } + if( ! sGF1_Skc.equals("***") ) + { + if(iWork == 0) { sGF1_Skc = "CLR"; } + else { if((iWork >= 1) && (iWork <= 4)) { sGF1_Skc = "SCT"; } + else { if((iWork >= 5) && (iWork <= 7)) { sGF1_Skc = "BKN"; } + else { if(iWork == 8) { sGF1_Skc = "OVC"; } + else { if(iWork == 9) { sGF1_Skc = "OBS"; } + else { if(iWork == 10) { sGF1_Skc = "POB"; }}}}}} + } + } + if(sGF1_Low.equals("99")) // Low cloud type + { + sGF1_Low = "*"; + } + else + { + sGF1_Low = sGF1_Low.substring(1,2); + } + + if(sGF1_Med.equals("99")) // Med cloud type + { + sGF1_Med = "*"; + } + else + { + sGF1_Med = sGF1_Med.substring(1,2); + } + + if(sGF1_Hi.equals("99")) // High cloud type + { + sGF1_Hi = "*"; + } + else + { + sGF1_Hi = sGF1_Hi.substring(1,2); + } + } + } // End of getGF1 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getMW1 - Get MW1 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getMW1(String p_sRecd) + { + sMW1 = ""; + sMW1_Fill1 = ""; + sMW1_Ww = "**"; + sMW1_Fill2 = ""; + iMW1_IndexOf = p_sRecd.indexOf("MW1"); + if ( (iMW1_IndexOf >= 0) && (iMW1_IndexOf < iREM_IndexOf) ) + { + sMW1 = p_sRecd.substring(iMW1_IndexOf,iMW1_IndexOf+iMW1_Length); + sMW1_Fill1 = sMW1.substring(1,3); // 3 + sMW1_Ww = sMW1.substring(3,5); // 2 + sMW1_Fill2 = sMW1.substring(5,6); // 1 +// System.out.println("MW1=["+sMW1+"] Ww=["+sMW1_Ww+"]"); + } + } // End of getMW1 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getMW2 - Get MW2 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getMW2(String p_sRecd) + { + sMW2 = ""; + sMW2_Fill1 = ""; + sMW2_Ww = "**"; + sMW2_Fill2 = ""; + iMW2_IndexOf = p_sRecd.indexOf("MW2"); + if ( (iMW2_IndexOf >= 0) && (iMW2_IndexOf < iREM_IndexOf) ) + { + sMW2 = p_sRecd.substring(iMW2_IndexOf,iMW2_IndexOf+iMW2_Length); + sMW2_Fill1 = sMW2.substring(1,3); // 3 + sMW2_Ww = sMW2.substring(3,5); // 2 + sMW2_Fill2 = sMW2.substring(5,6); // 1 +// System.out.println("MW2=["+sMW2+"] Ww=["+sMW2_Ww+"]"); + } + } // End of getMW2 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getMW3 - Get MW3 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getMW3(String p_sRecd) + { + sMW3 = ""; + sMW3_Fill1 = ""; + sMW3_Ww = "**"; + sMW3_Fill2 = ""; + iMW3_IndexOf = p_sRecd.indexOf("MW3"); + if ( (iMW3_IndexOf >= 0) && (iMW3_IndexOf < iREM_IndexOf) ) + { + sMW3 = p_sRecd.substring(iMW3_IndexOf,iMW3_IndexOf+iMW3_Length); + sMW3_Fill1 = sMW3.substring(1,3); // 3 + sMW3_Ww = sMW3.substring(3,5); // 2 + sMW3_Fill2 = sMW3.substring(5,6); // 1 +// System.out.println("MW3=["+sMW3+"] Ww=["+sMW3_Ww+"]"); + } + } // End of getMW3 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getMW4 - Get MW4 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getMW4(String p_sRecd) + { + sMW4 = ""; + sMW4_Fill1 = ""; + sMW4_Ww = "**"; + sMW4_Fill2 = ""; + iMW4_IndexOf = p_sRecd.indexOf("MW4"); + if ( (iMW4_IndexOf >= 0) && (iMW4_IndexOf < iREM_IndexOf) ) + { + sMW4 = p_sRecd.substring(iMW4_IndexOf,iMW4_IndexOf+iMW4_Length); + sMW4_Fill1 = sMW4.substring(1,3); // 3 + sMW4_Ww = sMW4.substring(3,5); // 2 + sMW4_Fill2 = sMW4.substring(5,6); // 1 +// logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMW4_Ww=["+sMW4_Ww+"]"); // temporary - ras + } + } // End of getMW4 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getAY1 - Get AY1 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getAY1(String p_sRecd) + { + sAY1 = ""; + sAY1_Fill1 = ""; + sAY1_Pw = "*"; + sAY1_Fill2 = ""; + iAY1_IndexOf = p_sRecd.indexOf("AY1"); + if ( (iAY1_IndexOf >= 0) && (iAY1_IndexOf < iREM_IndexOf) ) + { + sAY1 = p_sRecd.substring(iAY1_IndexOf,iAY1_IndexOf+iAY1_Length); + sAY1_Fill1 = sAY1.substring(1,3); // 3 + sAY1_Pw = sAY1.substring(3,4); // 1 + sAY1_Fill2 = sAY1.substring(4,8); // 4 +// System.out.println("AY1=["+sAY1+"] Pw=["+sAY1_Pw+"]"); + } + } // End of getAY1 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getMA1 - Get MA1 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getMA1(String p_sRecd) + { + sMA1 = ""; + sMA1_Fill1 = ""; + sMA1_Alt = "*****"; + sMA1_Fill2 = ""; + sMA1_Stp = "******"; + sMA1_Fill3 = ""; + iMA1_IndexOf = p_sRecd.indexOf("MA1"); + if ( (iMA1_IndexOf >= 0) && (iMA1_IndexOf < iREM_IndexOf) ) + { + sMA1 = p_sRecd.substring(iMA1_IndexOf,iMA1_IndexOf+iMA1_Length); + sMA1_Fill1 = sMA1.substring(1,3); // 3 + sMA1_Alt = sMA1.substring(3,8); // 5 + sMA1_Fill2 = sMA1.substring(8,9); // 1 + sMA1_Stp = sMA1.substring(9,14); // 5 + sMA1_Fill3 = sMA1.substring(14,15); // 1 + + if(sMA1_Alt.equals("99999")) + { + sMA1_Alt = "*****"; + } + else + { + try + { + fWork = Float.parseFloat(sMA1_Alt); // Convert to floating point + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMA1_Alt value could not be converted to floating point=["+sMA1_Alt+"]"); + sMA1_Alt = "*****"; // Data error. Set to missing. + } + if( ! sMA1_Alt.equals("*****") ) + { + fWork = ((float)((fWork / 10.0)*100.0) / (float) 3386.39); // Convert Hectopascals to Inches + sMA1_Alt = fmt5_2.format(fWork); + sMA1_Alt = String.format("%5s",sMA1_Alt); + } + } + if(sMA1_Stp.equals("99999")) + { + sMA1_Stp = "******"; + } + else + { + try + { + fWork = Float.parseFloat(sMA1_Stp); // Convert to floating point + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMA1_Stp value could not be converted to floating point=["+sMA1_Stp+"]"); + sMA1_Stp = "******"; // Data error. Set to missing. + } + if( ! sMA1_Stp.equals("******") ) + { + fWork = ((float)(fWork / 10.0)); // Convert convert Hectopascals to Millibars + sMA1_Stp = fmt6_1.format(fWork); + sMA1_Stp = String.format("%6s",sMA1_Stp); + } + } + } + } // End of getMA1 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getKA1 - Get KA1 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getKA1(String p_sRecd) + { + sKA1 = ""; + sKA1_Fill1 = ""; + sKA1_Code = "*"; + sKA1_Temp = "***"; + sKA1_Fill2 = ""; + iKA1_IndexOf = p_sRecd.indexOf("KA1"); + if ( (iKA1_IndexOf >= 0) && (iKA1_IndexOf < iREM_IndexOf) ) + { + sKA1 = p_sRecd.substring(iKA1_IndexOf,iKA1_IndexOf+iKA1_Length); + sKA1_Fill1 = sKA1.substring(1,6); // 6 + sKA1_Code = sKA1.substring(6,7); // 1 + sKA1_Temp = sKA1.substring(7,12); // 5 + sKA1_Fill2 = sKA1.substring(12,13); // 1 +// System.out.println("KA1=["+sKA1+"] Code=["+sKA1_Code+"] Temp=["+sKA1_Temp+"]"); + if(sKA1_Temp.equals("+9999")) + { + sKA1_Temp = "***"; + } + else + { + try + { + fWork = Float.parseFloat(sKA1_Temp); // Convert to floating point + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sKA1_Temp value could not be converted to floating point=["+sKA1_Temp+"]"); + sKA1_Temp = "***"; // Data error. Set to missing. + } + if( ! sKA1_Temp.equals("***") ) + { + if(fWork < -178) + { + fWork = (int)(((float)fWork / 10.0) * 1.8 + 32.0 - .5); // Handle temps below 0F + } + else + { + fWork = (int)(((float)fWork / 10.0) * 1.8 + 32.0 + .5); + } + if(sKA1_Code.equals("N")) + { + sMinTemp = formatInt( (int) fWork,3); + } + else + { + if(sKA1_Code.equals("M")) + { + sMaxTemp = formatInt( (int) fWork,3); + } + } + } + } + } + } // End of getKA1 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getKA2 - Get KA2 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getKA2(String p_sRecd) + { + sKA2 = ""; + sKA2_Fill1 = ""; + sKA2_Code = "*"; + sKA2_Temp = "***"; + sKA2_Fill2 = ""; + iKA2_IndexOf = p_sRecd.indexOf("KA2"); + if ( (iKA2_IndexOf >= 0) && (iKA2_IndexOf < iREM_IndexOf) ) + { + sKA2 = p_sRecd.substring(iKA2_IndexOf,iKA2_IndexOf+iKA2_Length); + sKA2_Fill1 = sKA2.substring(1,6); // 6 + sKA2_Code = sKA2.substring(6,7); // 1 + sKA2_Temp = sKA2.substring(7,12); // 5 + sKA2_Fill2 = sKA2.substring(12,13); // 1 +// System.out.println("KA2=["+sKA2+"] Code=["+sKA2_Code+"] Temp=["+sKA2_Temp+"]"); + if(sKA2_Temp.equals("+9999")) + { + sKA2_Temp = "***"; + } + else + { + try + { + fWork = Float.parseFloat(sKA2_Temp); // Convert to floating point + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sKA2_Temp value could not be converted to floating point=["+sKA2_Temp+"]"); + sKA2_Temp = "***"; // Data error. Set to missing. + } + if( ! sKA2_Temp.equals("***") ) + { + if(fWork < -178) + { + fWork = (int)(((float)fWork / 10.0) * 1.8 + 32.0 - .5); // Handle temps below 0F + } + else + { + fWork = (int)(((float)fWork / 10.0) * 1.8 + 32.0 + .5); + } + if(sKA2_Code.equals("N")) + { + sMinTemp = formatInt( (int) fWork,3); + } + else + { + if(sKA2_Code.equals("M")) + { + sMaxTemp = formatInt( (int) fWork,3); + } + } + } + } + } + } // End of getKA2 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getAA1 - Get AA1 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getAA1(String p_sRecd) + { + sAA1 = ""; + sAA1_Fill1 = ""; + sAA1_Hours = ""; + sAA1_Pcp = ""; + sAA1_Trace = ""; + sAA1_Fill2 = ""; + iAA1_IndexOf = p_sRecd.indexOf("AA1"); + if ( (iAA1_IndexOf >= 0) && (iAA1_IndexOf < iREM_IndexOf) ) + { + sAA1 = p_sRecd.substring(iAA1_IndexOf,iAA1_IndexOf+iAA1_Length); + sAA1_Fill1 = sAA1.substring(1,3); // 3 + sAA1_Hours = sAA1.substring(3,5); // 2 + sAA1_Pcp = sAA1.substring(5,9); // 4 + sAA1_Trace = sAA1.substring(9,10); // 1 + sAA1_Fill2 = sAA1.substring(10,11); // 1 +// System.out.println("AA1=["+sAA1+"] Pcp=["+sAA1_Pcp+"]"); + if( sAA1_Pcp.equals("9999") ) + { + sAA1_Pcp = "*****"; + } + else + { + try + { + fWork = Float.parseFloat(sAA1_Pcp); // Convert to floating point + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] AA1_Pcp value could not be converted to floating point=["+sAA1_Pcp+"]"); + sAA1_Pcp = "*****"; // Data error. Set to missing. + } + if( ! sAA1_Pcp.equals("*****") ) + { + setPcp(sAA1_Hours,sAA1_Trace); + } + } + } + } // End of getAA1 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getAA2 - Get AA2 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getAA2(String p_sRecd) + { + sAA2 = ""; + sAA2_Fill1 = ""; + sAA2_Hours = ""; + sAA2_Pcp = ""; + sAA2_Trace = ""; + sAA2_Fill2 = ""; + iAA2_IndexOf = p_sRecd.indexOf("AA2"); + if ( (iAA2_IndexOf >= 0) && (iAA2_IndexOf < iREM_IndexOf) ) + { +// System.out.println("DateTime=["+sConcat+"] iAA2_IndexOf=["+iAA2_IndexOf+"] iAA2_Length=["+iAA2_Length+"] Line Length=["+iLength+"]"); + sAA2 = p_sRecd.substring(iAA2_IndexOf,iAA2_IndexOf+iAA2_Length); + sAA2_Fill1 = sAA2.substring(1,3); // 3 + sAA2_Hours = sAA2.substring(3,5); // 2 + sAA2_Pcp = sAA2.substring(5,9); // 4 + sAA2_Trace = sAA2.substring(9,10); // 1 + sAA2_Fill2 = sAA2.substring(10,11); // 1 +// System.out.println("AA2=["+sAA2+"] Pcp=["+sAA2_Pcp+"]"); + if( sAA2_Pcp.equals("9999") ) + { + sAA2_Pcp = "*****"; + } + else + { + try + { + fWork = Float.parseFloat(sAA2_Pcp); // Convert to floating point + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] AA2_Pcp value could not be converted to floating point=["+sAA2_Pcp+"]"); + sAA2_Pcp = "*****"; // Data error. Set to missing. + } + if( ! sAA2_Pcp.equals("*****") ) + { + setPcp(sAA2_Hours,sAA2_Trace); + } + } + } + } // End of getAA2 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getAA3 - Get AA3 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getAA3(String p_sRecd) + { + sAA3 = ""; + sAA3_Fill1 = ""; + sAA3_Hours = ""; + sAA3_Pcp = ""; + sAA3_Trace = ""; + sAA3_Fill2 = ""; + iAA3_IndexOf = p_sRecd.indexOf("AA3"); + if ( (iAA3_IndexOf >= 0) && (iAA3_IndexOf < iREM_IndexOf) ) + { +// System.out.println("DateTime=["+sConcat+"] iAA3_IndexOf=["+iAA3_IndexOf+"] iAA3_Length=["+iAA3_Length+"] Line Length=["+iLength+"]"); + sAA3 = p_sRecd.substring(iAA3_IndexOf,iAA3_IndexOf+iAA3_Length); + sAA3_Fill1 = sAA3.substring(1,3); // 3 + sAA3_Hours = sAA3.substring(3,5); // 2 + sAA3_Pcp = sAA3.substring(5,9); // 4 + sAA3_Trace = sAA3.substring(9,10); // 1 + sAA3_Fill2 = sAA3.substring(10,11); // 1 +// System.out.println("AA3=["+sAA3+"] Pcp=["+sAA3_Pcp+"]"); + if( sAA3_Pcp.equals("9999") ) + { + sAA3_Pcp = "*****"; + } + else + { + try + { + fWork = Float.parseFloat(sAA3_Pcp); // Convert to floating point + } + catch (Exception e) + { + logIt(fDebug, iPROD, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] AA3_Pcp value could not be converted to floating point=["+sAA3_Pcp+"]"); + sAA3_Pcp = "*****"; // Data error. Set to missing. + } + if( ! sAA3_Pcp.equals("*****") ) + { + setPcp(sAA3_Hours,sAA3_Trace); + } + } + } + } // End of getAA3 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getAA4 - Get AA4 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getAA4(String p_sRecd) + { + sAA4 = ""; + sAA4_Fill1 = ""; + sAA4_Hours = ""; + sAA4_Pcp = ""; + sAA4_Trace = ""; + sAA4_Fill2 = ""; + iAA4_IndexOf = p_sRecd.indexOf("AA4"); + if ( (iAA4_IndexOf >= 0) && (iAA4_IndexOf < iREM_IndexOf) ) + { +// System.out.println("DateTime=["+sConcat+"] iAA4_IndexOf=["+iAA4_IndexOf+"] iAA4_Length=["+iAA4_Length+"] Line Length=["+iLength+"]"); + sAA4 = p_sRecd.substring(iAA4_IndexOf,iAA4_IndexOf+iAA4_Length); + sAA4_Fill1 = sAA4.substring(1,3); // 3 + sAA4_Hours = sAA4.substring(3,5); // 2 + sAA4_Pcp = sAA4.substring(5,9); // 4 + sAA4_Trace = sAA4.substring(9,10); // 1 + sAA4_Fill2 = sAA4.substring(10,11); // 1 +// System.out.println("AA4=["+sAA4+"] Pcp=["+sAA4_Pcp+"]"); + if( sAA4_Pcp.equals("9999") ) + { + sAA4_Pcp = "*****"; + } + else + { + try + { + fWork = Float.parseFloat(sAA4_Pcp); // Convert to floating point + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] AA4_Pcp value could not be converted to floating point=["+sAA4_Pcp+"]"); + sAA4_Pcp = "*****"; // Data error. Set to missing. + } + if( ! sAA4_Pcp.equals("*****") ) + { + setPcp(sAA4_Hours,sAA4_Trace); + } + } + } + } // End of getAA4 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// setPcp - Take AA elements and set Precip values. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void setPcp(String p_sHours, String p_sTrace) + { + fWork = (fWork / (float) 10.0) * (float) .03937008; // Convert precip depths from Millimeters to Inches + if( p_sHours.equals("01") ) + { + sPcp01 = fmt5_2.format(fWork); + sPcp01 = String.format("%5s",sPcp01); + if( p_sTrace.equals("2") ) + { + sPcp01t = "T"; + } + } + else + { + if( p_sHours.equals("06") ) + { + sPcp06 = fmt5_2.format(fWork); + sPcp06 = String.format("%5s",sPcp06); + if( p_sTrace.equals("2") ) + { + sPcp06t = "T"; + } + } + else + { + if( p_sHours.equals("24") ) + { + sPcp24 = fmt5_2.format(fWork); + sPcp24 = String.format("%5s",sPcp24); + if( p_sTrace.equals("2") ) + { + sPcp24t = "T"; + } + } + else + { + sPcp12 = fmt5_2.format(fWork); + sPcp12 = String.format("%5s",sPcp12); + if( p_sTrace.equals("2") ) + { + sPcp12t = "T"; + } + } + } + } + } // End of setPcp + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getAJ1 - Get AJ1 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getAJ1(String p_sRecd) + { + sAJ1 = ""; + sAJ1_Fill1 = ""; + sAJ1_Sd = "**"; + sAJ1_Fill2 = ""; + iAJ1_IndexOf = p_sRecd.indexOf("AJ1"); + if ( (iAJ1_IndexOf >= 0) && (iAJ1_IndexOf < iREM_IndexOf) ) + { + sAJ1 = p_sRecd.substring(iAJ1_IndexOf,iAJ1_IndexOf+iAJ1_Length); + sAJ1_Fill1 = sAJ1.substring(1,3); // 3 + sAJ1_Sd = sAJ1.substring(3,7); // 4 + sAJ1_Fill2 = sAJ1.substring(7,17); // 10 +// System.out.println("AJ1_Fill1=["+sAJ1_Fill1+"] Sd=["+sAJ1_Sd+"]"); + if( sAJ1_Sd.equals("9999") ) + { + sAJ1_Sd = "**"; + } + else + { + try + { + fWork = Float.parseFloat(sAJ1_Sd); // Convert to floating point + } + catch (Exception e) + { + logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sAJ1_Sd value could not be converted to floating point=["+sAJ1_Sd+"]"); + sAJ1_Sd = "**"; // Data error. Set to missing. + } + if( ! sAJ1_Sd.equals("**") ) + { + iWork = (int) (fWork * (float) .3937008 + .5); // Convert precip depths from Millimeters to Inches + sAJ1_Sd = fmt02.format(iWork); + sAJ1_Sd = String.format("%2s",sAJ1_Sd); + } + } + } + } // End of getAJ1 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getAW1 - Get AW1 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getAW1(String p_sRecd) + { + sAW1 = ""; + sAW1_Fill1 = ""; + sAW1_Zz = "**"; + sAW1_Fill2 = ""; + iAW1_IndexOf = p_sRecd.indexOf("AW1"); + if ( (iAW1_IndexOf >= 0) && (iAW1_IndexOf < iREM_IndexOf) ) + { + sAW1 = p_sRecd.substring(iAW1_IndexOf,iAW1_IndexOf+iAW1_Length); + sAW1_Fill1 = sAW1.substring(1,3); // 3 + sAW1_Zz = sAW1.substring(3,5); // 2 + sAW1_Fill2 = sAW1.substring(5,6); // 1 +// logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sAW1_Zz=["+sAW1_Zz+"]"); // temporary - ras + } + } // End of getAW1 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getAW2 - Get AW2 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getAW2(String p_sRecd) + { + sAW2 = ""; + sAW2_Fill1 = ""; + sAW2_Zz = "**"; + sAW2_Fill2 = ""; + iAW2_IndexOf = p_sRecd.indexOf("AW2"); + if ( (iAW2_IndexOf >= 0) && (iAW2_IndexOf < iREM_IndexOf) ) + { + sAW2 = p_sRecd.substring(iAW2_IndexOf,iAW2_IndexOf+iAW2_Length); + sAW2_Fill1 = sAW2.substring(1,3); // 3 + sAW2_Zz = sAW2.substring(3,5); // 2 + sAW2_Fill2 = sAW2.substring(5,6); // 1 +// logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sAW2_Zz=["+sAW2_Zz+"]"); // temporary - ras + } + } // End of getAW2 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getAW3 - Get AW3 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getAW3(String p_sRecd) + { + sAW3 = ""; + sAW3_Fill1 = ""; + sAW3_Zz = "**"; + sAW3_Fill2 = ""; + iAW3_IndexOf = p_sRecd.indexOf("AW3"); + if ( (iAW3_IndexOf >= 0) && (iAW3_IndexOf < iREM_IndexOf) ) + { + sAW3 = p_sRecd.substring(iAW3_IndexOf,iAW3_IndexOf+iAW3_Length); + sAW3_Fill1 = sAW3.substring(1,3); // 3 + sAW3_Zz = sAW3.substring(3,5); // 2 + sAW3_Fill2 = sAW3.substring(5,6); // 1 +// logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sAW3_Zz=["+sAW3_Zz+"]"); // temporary - ras + } + } // End of getAW3 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// getAW4 - Get AW4 element and format its output. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static void getAW4(String p_sRecd) + { + sAW4 = ""; + sAW4_Fill1 = ""; + sAW4_Zz = "**"; + sAW4_Fill2 = ""; + iAW4_IndexOf = p_sRecd.indexOf("AW4"); + if ( (iAW4_IndexOf >= 0) && (iAW4_IndexOf < iREM_IndexOf) ) + { + sAW4 = p_sRecd.substring(iAW4_IndexOf,iAW4_IndexOf+iAW4_Length); + sAW4_Fill1 = sAW4.substring(1,3); // 3 + sAW4_Zz = sAW4.substring(3,5); // 2 + sAW4_Fill2 = sAW4.substring(5,6); // 1 +// logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sAW4_Zz=["+sAW4_Zz+"]"); // temporary - ras + } + } // End of getAW4 + + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// logIt - Append records to the log file. +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + public static int logIt(FileOutputStream p_fDebug, int p_iLogLevel, boolean p_bFilter, String p_sIn) + { + int iRetCode=99; // Set default return code to something crazy. + String sMessageFormatted=""; + + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date now = new Date(); + sMessageFormatted=sProgramName+": "+format.format(now)+"_"+p_sIn; + + if (bStdErr) + { + System.err.println(sMessageFormatted); // Error mode will echo message to standard error + } + + if (bVerbose) + { + System.out.println(sMessageFormatted); // Verbose mode will echo message to screen + } + + if (iLogLevel < p_iLogLevel) // 04/01/2009 ras + { + return 0; // No logging for this + } + + if (p_bFilter) // 04/01/2009 ras + { + if (p_sFilter1.equals("None")) // 04/01/2009 ras + { + } + else + { + if (sConcat.equals(p_sFilter1) || // 04/01/2009 ras // Life is good + sConcat.equals(p_sFilter2)) + { + } + else + { + return 0; // 04/01/2009 ras // No logging for this + } + } + } + + try { + p_fDebug = new FileOutputStream (sDebugName+".debug", true); // Append mode. + new PrintStream(p_fDebug).println (format.format(now)+"_"+p_sIn); // Write output to debug log. + iRetCode=0; // Good. + p_fDebug.close(); + } + catch (IOException e) { + System.out.println("5. Unable to open debug log"); + System.err.println(sProgramName+": Stack trace follows:"); + e.printStackTrace(); + System.exit(5); + } + catch (Exception e) { + iRetCode=6; // An error occurred. + System.err.println(sProgramName+": Unspecified Exception in logIt. Error=[" + e.getMessage()+"]"); + System.err.println(sProgramName+": Stack trace follows:"); + e.printStackTrace(); + System.exit(6); + } + return iRetCode; + } // End of logIt + +} diff --git a/Chapter8/rain_data/noaa_data.py b/Chapter8/rain_data/noaa_data.py new file mode 100644 index 0000000..76cd9c7 --- /dev/null +++ b/Chapter8/rain_data/noaa_data.py @@ -0,0 +1,66 @@ +#本程序下载noaa气象数据,使用网址为国内镜像网站,编辑时间2019.03.14,LJX + +import urllib.request # url request +import os # regular expression +import re # dirs +import requests + + +# 根据网络地址和文件保存地址下载文件 +def download(url, path): + r = requests.get(url) + print(path) + with open(path, "wb") as f: + f.write(r.content) + f.close() + + +url = "https://www1.ncdc.noaa.gov/pub/data/noaa/" # parent url +Station_ID = "580280" # 站点号 +year_start = "1993" # 数据起始时间 +year_end = "2001" +# 时间差,然后根据时间差建立年份数组 +year_sub = int(year_end) - int(year_start) + 1 + +# 建立数据年份数组 +years = [] +for i in range(year_sub): + years.append(str(i + int(year_start)).zfill(4)) + +for i in years: + # file_names.append(Station_ID+"-99999-"+i+".gz") #file_names = [] + # urls.append(url+i+"/"+file_names) #urls = [] + file_name = Station_ID + "-99999-" + i + ".gz" # 文件名 + path = './xuzhou2/' + file_name # 文件存储路径 + url2 = url + i + "/" + file_name # 文件网络地址URL + # 判断网页是否为空 + html = requests.get(url2) + respon = html.status_code + # 网页为空则跳过本次执行,否则下载文件 + if respon == 404: + continue + else: + download(url2, path) # 下载文件 + +''' +XUzHOU + + Period of Record: 1956-08-20 to 2019-03-06 Station ID: 58027099999 + +XUZHOU/ GUANYIN ARPT + + Period of Record: 1973-11-04 to 2003-10-01 Station ID: 58028099999 + +XUZHOU/ GUANYIN ARPT + + Period of Record: 1973-11-04 to 2003-10-01 Station ID: 58028099999 + + + #其它链接 +#https://www.ncdc.noaa.gov/data-access +#https://globalweather.tamu.edu/ +#ftp://ftp.ncdc.noaa.gov/pub/data/noaa #另外一个数据库 + +''' + + diff --git "a/Chapter8/rain_data/\350\257\273\345\217\226\347\253\231\347\274\226\345\217\267.py" "b/Chapter8/rain_data/\350\257\273\345\217\226\347\253\231\347\274\226\345\217\267.py" new file mode 100644 index 0000000..fe37351 --- /dev/null +++ "b/Chapter8/rain_data/\350\257\273\345\217\226\347\253\231\347\274\226\345\217\267.py" @@ -0,0 +1,113 @@ +# -*- coding: UTF-8 -*- +__author__ = 'zy' +__time__ = '2019/4/16 22:40' +import pandas as pd +import os + +def file_name(file_dir): + + for root, dirs, files in os.walk(file_dir): + print(root) # 当前目录路径 + print(dirs) # 当前路径下所有子目录 + print(files) # 当前路径下所有非目录子文件 + + print('---------') + print(files) + return files + +def deal_with_download_file(root_source): + #函数处理一下解压后的数据转换成out文件 + # root_source为解压后数据所在路径 + # path为java代码所在路径以及out文件输出路径 + + file_list = file_name(root_source) + + # 修改当前工作目录 + os.chdir(root_source) + # 查看修改后的工作目录 + retval = os.getcwd() + print(retval) + + cmds = [] + for i in file_list: + try: + print(i) + #判断是否为解压后的原始数据 i = root_source+ '\\' + i + cmds.append('java -classpath . ishJava' + ' ' + i + ' ' + i + '.out') + except: + pass + + for cmd in cmds: + os.system(cmd) + print(cmd) + print('处理一个') + +def filter_time(root_source,start_time,end_time): + #依据时间过滤文件 + #root_source out文件目录 + #start_time,end_time 需要开始结束时间,如201809180000,格式为整数 + rain_data_file_list=file_name(root_source) + contents=[] + for i in rain_data_file_list: + try: + if i.split('.')[1]=='out': + #判断是否是输出文件 + temp_dir=root_source+'\\'+i + for row in open(temp_dir): + print('处理一行') + try: + Time = int(row[13:25]) + if (Time > start_time or Time ==start_time) and Time < end_time:#201809180000 + contents.append(row) + #拿出符合时间筛选的内容 + except ValueError: + pass + except: + pass + + with open('result.txt','w',encoding='utf-8') as f: + for i in contents: + f.write(i) + +def find(root_source,select_station_excel): + # 检索所有待处理的文件 + df = pd.read_excel(select_station_excel) + print(df) + sta = [] + lat = [] + lng = [] + rain_data_file_list=file_name(root_source) + for i in rain_data_file_list: + name = i[0:6] + STATION_ID__num = int(name) + # 检索处理后的数据、筛选想要的站点 + sta.append(STATION_ID__num) + a=df[df.STA_ID == STATION_ID__num].LAT + if a not in lat: + lat.append(a) + b=df[df.STA_ID == STATION_ID__num].LNG + if a not in lat: + lng.append(b) + + for j in range(len(sta)): + print('站' + str(sta[j]) + 'lat' + str(lat[j]) + 'lng' + str(lng[j])) + +if __name__=="__main__": + #root_source=r'C:\Users\hp\Desktop\datadeal\气象数据\原始数据' + # files=file_name(root_source) + root_source=r'C:\Users\hp\Desktop\台风山竹广东示例\原始数据' + #deal_with_download_file(root_source) + + + select_station_excel='筛选工作站.xlsx' + + filter_time(root_source, 201809160000, 201809170000) + #筛选出来我们想要的行列 + + #find(root_source, select_station_excel) + + + + + + diff --git "a/Chapter8/\346\225\260\346\215\256\350\257\264\346\230\216" "b/Chapter8/\346\225\260\346\215\256\350\257\264\346\230\216" new file mode 100644 index 0000000..aefddee --- /dev/null +++ "b/Chapter8/\346\225\260\346\215\256\350\257\264\346\230\216" @@ -0,0 +1,20 @@ +# get_rain_data +论文中气象站数据获得与处理 +http://bbs.06climate.com/forum.php?mod=viewthread&tid=50500 +http://bbs.06climate.com/forum.php?mod=viewthread&tid=50500 +参考资料 +NOAA(美国海洋和大气管理局)提供GHCND(全球历史气候学网络)月度摘要数据库,可以满足全球陆地区域历史月度温度,降水和降雪记录的研究需求。 +GHCND月度摘要数据库数据源自GHCN-Daily数据库,经过质量审查与二次加工制成,主要包含18个气象要素,包括温度(每月平均值和极端值),降水(每月总数,极端值和满足各种数量阈值的天数),降雪,最大雪深等。GHCND月度摘要数据库与它对应的每日数据库一样,包含分布在各大洲的40000多个站点的数十个观测值。 +基于世界气象组织(WMO)第40号决议(Cg-12),世界气象组织(WMO)达成了世界天气监视计划协议,互相交换气象数据,GHCN-Daily数据库提供的数据即基于此计划。WMO成员国可以免费且不受限制的使用或导出数据用于研究,教育和其他非商业活动。 +数据库镜像连接:https://www.ncdc.noaa.gov/pub/data/noaa/。本节以台风山竹期间获取广东省内数据绘制降雨情况为例。点击数据库连接会得到以下文件列表,提供从1901年至今的气象数据,操作步骤如下: + + ![Image text](https://github.com/yemanzhongting/get_rain_data/blob/master/%E5%9B%BE/1.png) + +(1) 在文件列表中找到ish-history.csv文件,文件提供了29726个气象站点,包含站点ID,站点经纬度,站点高程,站点所在城市,站点所在国家(CH代表中国),站点数据起迄时间。根据需求在excel内进行查找,筛选出想要的数据站点。从中筛选出具有2018年9月16日至9月18日数据的38个广东省范围内数据站。 +(2) 点进2018年份文件夹,将筛选后的数据站原始数据下载下来并解压。对解压后的文件进行处理,此时解压出来的文件名称格式如“578660-99999-2018”,579570代表站点ID,99999是统一的命名,2018代表数据年份。此时文件并不能直接使用,官方提供了解析脚本ishJava.java,需要安装JDK环境使用,并在同路径下添加ishJava.class类,cmd下执行命令java -classpath . ishJava 578660-99999-2019 578660-99999-2010.out。这里提供了编写好的脚本,调用deal_with_download_file(root_source)函数即可处理路径下所有文件,输出成.out格式。 + +![Image text2](https://github.com/yemanzhongting/get_rain_data/blob/master/%E5%9B%BE/2.png) + +(3) 此时提供的数据是2018年一整年的数据,依据时间条件进行过滤,调用函数filter_time(root_source, 201809160000, 201809170000)筛选出三天的气象数据,得到筛选后的结果result.txt。 +(4) 依据处理结果进行筛选,Arcgis处理后得到降雨插值图。 +![Image text](https://github.com/yemanzhongting/get_rain_data/blob/master/%E5%9B%BE/3.jpg) From f67e892097cacfb06e4614617f5a49839c69d2a1 Mon Sep 17 00:00:00 2001 From: yemanzhongting <838044557@qq.com> Date: Tue, 14 Jan 2020 18:37:06 +0800 Subject: [PATCH 2/2] rain data --- ...4\270\216MATLAB\344\273\243\347\240\201.zip" | Bin 39158 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 "BP\347\245\236\347\273\217\347\275\221\347\273\234\351\242\204\346\265\213\350\227\273\347\261\273\347\224\237\347\211\251\351\207\217-\346\225\260\346\215\256\344\270\216MATLAB\344\273\243\347\240\201.zip" diff --git "a/BP\347\245\236\347\273\217\347\275\221\347\273\234\351\242\204\346\265\213\350\227\273\347\261\273\347\224\237\347\211\251\351\207\217-\346\225\260\346\215\256\344\270\216MATLAB\344\273\243\347\240\201.zip" "b/BP\347\245\236\347\273\217\347\275\221\347\273\234\351\242\204\346\265\213\350\227\273\347\261\273\347\224\237\347\211\251\351\207\217-\346\225\260\346\215\256\344\270\216MATLAB\344\273\243\347\240\201.zip" deleted file mode 100644 index bc031dfcdc6e67b1cf6588916cd9f17377afa9ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39158 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