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); } }
/// <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); }