private void FormRangeStatistic_Shown(object sender, EventArgs e) { range.PerformRefreshQuality(); qualityInfo = range.Quality; labelCompletness.Text = "Полнота ряда: " + (qualityInfo.Completeness * 100).ToString("0.0") + "%"; labelExpectAmount.Text = "Ожидаемое число измерений: " + qualityInfo.ExpectAmount.ToString() + " штук"; labelLength.Text = "Длительность ряда наблюдений: " + range.Length.ToText(); labelMaxEmpty.Text = "Максимальная длительность пропуска данных: " + qualityInfo.MaxEmptySpace.ToText(); labelMeasureAmount.Text = "Общее количество наблюдений: " + qualityInfo.MeasureAmount.ToString() + " штук"; dataGridViewExt1.DataSource = null; dataGridViewExt1.DataSource = qualityInfo.Intervals; }
/// <summary> /// Пытается импортировать файл на основе заданных настроек. При ошибке выбрасывает исключение WindEnergyException с информацией или ArgumentException при недопустимых настройках /// </summary> /// <returns></returns> /// <param name="count">количество считываемых строк, начиная со StartLine</param> public RawRange Import(long count = long.MaxValue) { CheckParameters(); //проверка параметров //Импорт данных string data = GetText(count); RawRange res = new RawRange(); res.BeginChange(); string[] lines = data.Split('\r'); int line_i = 0; foreach (string line in lines) { line_i++; string[] arr = new Regex("w*" + Delimeter + "w*").Split(line.Replace("\n", "")); if (arr.Length <= 1) { continue; } List <ImportFields> fields = this.Columns.Keys.ToList(); RawItem item = new RawItem(); foreach (ImportFields field in fields) { int index = Columns[field] - 1; string value = arr[index]; if (Trimmers != null && Trimmers.Length > 0) { value = value.Trim(Trimmers); } try { switch (field) { case ImportFields.Date: item.Date = DateTime.Parse(value); break; case ImportFields.Direction: switch (DirectionUnit) { case DirectionUnits.Degrees: item.Direction = double.Parse(value.Replace('.', Constants.DecimalSeparator)); break; case DirectionUnits.TextRP5: item.DirectionRhumb = RP5ru.GetWindDirectionFromString(value); break; case DirectionUnits.None: throw new ArgumentException("Не заданы единицы измерения для направления"); default: throw new WindEnergyException("Эта единица измерений не реализована"); } break; case ImportFields.Pressure: switch (PressureUnit) { case PressureUnits.KPa: item.Pressure = double.Parse(value.Replace('.', Constants.DecimalSeparator)) * Constants.MMHGART_IN_1KPA; //перевод в мм рт. ст. break; case PressureUnits.mmHgArt: item.Pressure = double.Parse(value.Replace('.', Constants.DecimalSeparator)); break; case PressureUnits.None: throw new ArgumentException("Не заданы единицы измерения для давления"); default: throw new WindEnergyException("Эта единица измерений не реализована"); } break; case ImportFields.Wetness: switch (WetnessUnit) { case WetnessUnits.Percents: item.Wetness = double.Parse(value.Replace('.', Constants.DecimalSeparator)); break; case WetnessUnits.Parts: item.Wetness = double.Parse(value.Replace('.', Constants.DecimalSeparator)) * 100d; //перевод в % break; case WetnessUnits.None: throw new ArgumentException("Не заданы единицы измерения для влажности"); default: throw new WindEnergyException("Эта единица измерений не реализована"); } break; case ImportFields.Temperature: item.Temperature = double.Parse(value.Replace('.', Constants.DecimalSeparator)); break; case ImportFields.Speed: item.Speed = double.Parse(value.Replace('.', Constants.DecimalSeparator)); break; default: throw new WindEnergyException("Этот параметр не реализован"); } } catch (Exception ex) { throw new WindEnergyException($"Не удалось распознать строку \"{value}\" как значение поля {field.Description()} в строке {line_i}", ex.Message); } } res.Add(item); } if ((bool)BindNearestMS) { res.Meteostation = Vars.RP5Meteostations.GetNearestMS(this.Coordinates); } res.Position = this.Coordinates; res.Name = Path.GetFileNameWithoutExtension(this.FilePath); res.EndChange(); res.PerformRefreshQuality(); return(res); }
/// <summary> /// восстановить ряд до нужного интревала наблюдений /// </summary> /// <param name="range">Ряд для восстановления</param> /// <param name="param">параметры восстановления</param> /// <param name="actionPercent">изменение процента выполнения</param> /// <param name="actionAfter">действие после обработки</param> /// <returns></returns> public Task <RawRange> ProcessRange(RawRange range, RestorerParameters param, Action <int, string> actionPercent, Action <RawRange, RawRange, double> actionAfter) { RawRange baseRange = null;//ряд, на основе которого будет идти восстановление range.PerformRefreshQuality(); Range = new RawRange(range.OrderBy(x => x.Date).ToList()); this.param = param; this.actionPercent = actionPercent; prepareIterpolators(); //расчет каждого значения Task <RawRange> tsk = new Task <RawRange>(() => { ConcurrentBag <RawItem> resultCollection = new ConcurrentBag <RawItem>(); Parallel.ForEach(newRangeX, (p) => { incrementCounter(); StandartIntervals currentInterval = getIntervalOfDateArgument(p, range); if (currentInterval == StandartIntervals.None) { throw new WindEnergyException("Что-то не так. Не удалось найти интервал наблюдений"); } double speed, direct, temp, wet, press; //если целевой интервал меньше текущего, то интерполируем как обычно if ((int)currentInterval >= (int)param.Interval || param.Method == InterpolateMethods.NearestMeteostation) { speed = methodSpeeds.GetValue(p); direct = methodDirects.GetValue(p); temp = methodTemp.GetValue(p); wet = methodWet.GetValue(p); press = methodPress.GetValue(p); } else //Если целевой интервал больше текущего, то надо осреднять значения за целевой интервал { DateTime from = new DateTime().AddMinutes(p - (int)param.Interval); DateTime to = new DateTime().AddMinutes(p); RawRange part = range.GetRange(true, false, from, to, null, null); if (part.Count == 0) { speed = methodSpeeds.GetValue(p); direct = methodDirects.GetValue(p); temp = methodTemp.GetValue(p); wet = methodWet.GetValue(p); press = methodPress.GetValue(p); } else { speed = part.Average(item => item.Speed); direct = part.Average(item => item.Direction > 0 ? item.Direction : 0); temp = part.Average(item => item.Temperature); wet = part.Average(item => item.Wetness); press = part.Average(item => item.Pressure); } } if (double.IsNaN(speed)) { return; } if (speed < 0) { speed = 0; } resultCollection.Add(new RawItem(p, speed, direct, temp, wet, press)); }); RawRange res = new RawRange(resultCollection.OrderBy(item => item.DateArgument)); res.Position = range.Position; res.Meteostation = range.Meteostation; res.Height = range.Height; if (actionAfter != null) { actionAfter.Invoke(res, baseRange, r); } return(res); }); tsk.Start(); return(tsk); }