Exemple #1
0
 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;
 }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        /// <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);
        }