/// <summary> /// Retrieves a time series of observations from the database /// (only measured, non-zero values are retrieved) /// </summary> /// <param name="stationId"></param> /// <param name="variableId"></param> /// <param name="start"></param> /// <param name="end"></param> /// <param name="scaleFactor"></param> /// <param name="observations"></param> public static void LoadObservations(int stationId, int variableId, DateTime start, DateTime end, TimeStep step, IObservationList observations) { //observations.Clear(); SqlCommand cmd = DataUtils.CreateCommand(); cmd.CommandText = "plaveninycz.new_query_observations"; cmd.CommandType = CommandType.StoredProcedure; SetCmdParameters(cmd, stationId, variableId, start, end, step); SqlDataReader rdr; double val; DateTime t; try { cmd.Connection.Open(); rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); while (rdr.Read()) { if (!rdr.IsDBNull(1)) { t = Convert.ToDateTime(rdr[0]); val = Convert.ToDouble(rdr[1]); if (val > 0) { observations.AddObservation(t, val); } else { observations.AddUnknownValue(t); } } } rdr.Close(); } finally { cmd.Connection.Close(); } }
public static void ReadBinaryFileDaily(string fileName, DateTime startTime, DateTime endTime, bool includeNA, IObservationList observations) { int SIZEOF_FLOAT = 4; int SIZEOF_LONG = 8; //clear out any existing obs. observations.Clear(); try { using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { //read the startDate byte[] startDateBytes = new byte[SIZEOF_LONG]; stream.Read(startDateBytes, 0, startDateBytes.Length); long[] startDateBinary = new long[1]; Buffer.BlockCopy(startDateBytes, 0, startDateBinary, 0, SIZEOF_LONG); DateTime startDateFromFile = DateTime.FromBinary(startDateBinary[0]); //check start time if (startTime < startDateFromFile) { startTime = startDateFromFile; } //find position of query start time int startTimePositionDays = (int)((startTime - startDateFromFile).TotalDays); if (startTimePositionDays < 0) return; int numDaysInFile = (int)((stream.Length - SIZEOF_LONG) / SIZEOF_FLOAT); DateTime endDateFromFile = startDateFromFile.AddDays(numDaysInFile); if (endTime < startDateFromFile) return; if (startTime > endDateFromFile) return; long startTimePositionInBytes = SIZEOF_LONG + startTimePositionDays * SIZEOF_FLOAT; int numDaysStartEnd = (int)((endTime - startTime).TotalDays); long numBytesStartEnd = numDaysStartEnd * SIZEOF_FLOAT; if (startTimePositionInBytes + numBytesStartEnd > stream.Length) { numBytesStartEnd = stream.Length - startTimePositionInBytes; numDaysStartEnd = (int)(numBytesStartEnd / SIZEOF_FLOAT); } long endTimePositionInBytes = startTimePositionInBytes + numBytesStartEnd; byte[] resultBytes = new byte[numBytesStartEnd]; stream.Seek(startTimePositionInBytes, SeekOrigin.Begin); stream.Read(resultBytes, 0, resultBytes.Length); float[] result = new float[numDaysStartEnd]; Buffer.BlockCopy(resultBytes, 0, result, 0, resultBytes.Length); DateTime curTime = startTime; for (int i = 0; i < result.Length; i++) { if (result[i] == -9999.0) { if (includeNA) { observations.AddUnknownValue(curTime); } } else { observations.AddObservation(curTime, result[i]); } curTime = curTime.AddDays(1); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } }