Beispiel #1
0
        private void buttonSelectAMSFile_Click(object sender, EventArgs e)
        {
            OpenFileDialog of = new OpenFileDialog();

            of.Filter = "Текстовые файлы *.txt|*.txt";
            if (of.ShowDialog(this) == DialogResult.OK)
            {
                bool f = new AMSMeteostationDatabase(of.FileName).CheckDatabaseFile();
                if (!f)
                {
                    _ = MessageBox.Show(this, "Не удалось открыть выбранный файл", "Изменение файла БД АМС", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                this.AMSFile      = of.FileName;
                labelAMSFile.Text = Path.GetFileName(AMSFile);
            }
        }
Beispiel #2
0
        /// <summary>
        /// на основе ряда наблюдений на высоте 10м подобрать АМС и выбрать ряд коэффициентов m для поднятия скорости на высоту
        /// </summary>
        /// <param name="range">ряд наблюдений на МС</param>
        /// <param name="coordinates">координаты ряда</param>
        /// <param name="MSMeteostations">БД АМС</param>
        /// <param name="searchRadius">расстояние для фильтрации АМС в метрах. Если задано NaN, то фильтрация по расстоянию проводить не будет</param>
        /// <param name="maximalRelativeSpeedDeviation">максимальное среднеквадратичное отклонение относительной скорости. NaN, если не надо учитывать</param>
        /// <returns></returns>
        public static SuitAMSResult GetSuitAMS(RawRange range, PointLatLng coordinates, AMSMeteostationDatabase MSMeteostations, double searchRadius, double maximalRelativeSpeedDeviation)
        {
            //посчитать среднемесячные относительные скорости для МС
            //выбрать АМС из заданного радиуса
            //посчитать относительные скорости на всех АМС
            //найти наиболее подходящую АМС по наименьшему среднеквадратичному отклонению относительных скоростей

            //относительные среднемесячные скорости на МС
            Dictionary <Months, double> msRelatives = getRelativeAverageMonthSpeeds(range, out bool allMonth);

            //выбор АМС в заданном радиусе
            List <AMSMeteostationInfo> amss = double.IsNaN(searchRadius) ? MSMeteostations.List : MSMeteostations.GetNearestMS(coordinates, searchRadius, true); //выбираем все АМС в радиусе

            if (amss == null)
            {
                return(null);
            }

            //поиск АМС с минимальным среднеквадр отклонением относительных скоростей
            SuitAMSResult     res     = new SuitAMSResult();
            double            minDev  = double.MaxValue;
            SuitAMSResultItem minItem = null;

            foreach (AMSMeteostationInfo ams in amss)
            {
                SuitAMSResultItem item = new SuitAMSResultItem();
                item.Deviation         = Math.Sqrt(msRelatives.Average((kv) => { return(Math.Pow(kv.Value - ams.RelativeSpeeds[kv.Key], 2)); })); //корень(среднее ((KjМС - KjАМС)^2)), j - номер месяца
                item.AMS               = ams;
                item.AllMonthInRange   = allMonth;
                item.IsDeviationFailed = !double.IsNaN(maximalRelativeSpeedDeviation) && item.Deviation > maximalRelativeSpeedDeviation;
                item.Distance          = EarthModel.CalculateDistance(coordinates, ams.Position);
                res.Add(item);

                //ищем минимальный элемент
                if (minDev > item.Deviation)
                {
                    minDev  = item.Deviation;
                    minItem = item;
                }
            }

            res.AllMonthInRange          = allMonth;
            res.RangeRelativeSpeeds      = msRelatives;
            res.ItemWithMinimalDeviation = minItem;
            return(res);
        }