/// <summary>Constructor</summary> /// <param name="weatherRecord">気象レコード</param> public WeatherDataTable(WeatherRecord[] weatherRecord) { AddWeatherRecord(weatherRecord); }
/// <summary>気象レコードを線形補間する</summary> /// <param name="wRecord1">気象レコード1</param> /// <param name="wRecord2">気象レコード2</param> /// <param name="dTime">補間する時刻</param> /// <returns>補間した気象レコード</returns> private WeatherRecord interpolateWRecord(WeatherRecord wRecord1, WeatherRecord wRecord2, DateTime dTime) { //両端と一致する場合は複製を返す if (wRecord1.DataDTime == dTime) return (WeatherRecord)wRecord1.Clone(); else if (wRecord2.DataDTime == dTime)return (WeatherRecord)wRecord2.Clone(); //その他の場合は補間処理 WeatherRecord wRecord = new WeatherRecord(); double ts1 = (dTime - wRecord1.DataDTime).TotalHours; double ts2 = (wRecord2.DataDTime - dTime).TotalHours; ts1 = ts1 / (ts1 + ts2); ts2 = 1.0 - ts1; foreach (WeatherRecord.RecordType rt in Enum.GetValues(typeof(WeatherRecord.RecordType))) { WeatherData wd1 = wRecord1.GetData(rt); WeatherData wd2 = wRecord2.GetData(rt); WeatherData wd = new WeatherData(); //いずれかが欠測の場合は欠測 if (wd1.Source == WeatherData.DataSource.MissingValue || wd2.Source == WeatherData.DataSource.MissingValue) wd.Source = WeatherData.DataSource.MissingValue; //その他の場合は推定(補間)値 //単純な線形補間では問題がある要素もある。直せ! else wd.Source = WeatherData.DataSource.PredictedValue; wd.Value = wd1.Value * ts1 + wd2.Value * ts2; wRecord.SetData(rt, wd); } return wRecord; }
/// <summary>気象レコードを追加する</summary> /// <param name="weatherRecord">気象レコード</param> /// <remarks> /// 一旦追加した気象レコードは変更不可 /// 変更したい場合は削除した後に新規に追加する /// </remarks> public void AddWeatherRecord(WeatherRecord weatherRecord) { wdList.Add(weatherRecord); }
/// <summary>気象レコードを追加する</summary> /// <param name="weatherRecord">気象レコード配列</param> public void AddWeatherRecord(WeatherRecord[] weatherRecord) { wdList.AddRange(weatherRecord); }
/// <summary>空のWeatherRecordを返す</summary> /// <returns>空のWeatherRecord</returns> public static WeatherRecord GetEmptyWeatherRecord() { WeatherRecord wr = new WeatherRecord(); wr.FillMissingData(); return wr; }