/// <summary> /// выбор текста для рекомендаций, какой тип рельефа лучше использовать /// </summary> /// <param name="range"></param> /// <param name="pointCoordinates"></param> /// <param name="geoinfo"></param> /// <returns></returns> public static Dictionary <string, Color> GetRecommendation(RawRange range, PointLatLng pointCoordinates, IGeoInfoProvider geoinfo) { if (range.Position.IsEmpty) { throw new WindEnergyException("Не заданы координаты метеостанции"); } if (pointCoordinates.IsEmpty) { throw new WindEnergyException("Не заданы координаты точки ВЭС"); } if (geoinfo == null) { throw new ArgumentNullException(nameof(geoinfo)); } Dictionary <string, Color> result = new Dictionary <string, Color>(); double L = EarthModel.CalculateDistance(range.Position, pointCoordinates) / 1000; //расстояние вкилометрах между МС и точкой ВЭС double Hms = geoinfo.GetElevation(range.Position); //высота точки МС double Hpoint = geoinfo.GetElevation(pointCoordinates); //высота точки ВЭС double Habs = Math.Max(Hms, Hpoint); //максимальная высота на у.м. double dH = Math.Abs(Hpoint - Habs); //перепад высот между МС и ВЭС StatisticalRange <WindDirections8> expectancy = StatisticEngine.GetDirectionExpectancy(range, GradationInfo <WindDirections8> .Rhumb8Gradations); //повторяемости скорости ветра по 8 румбам var maxes = expectancy.Values.OrderByDescending((d) => d).ToList(); if (maxes[0] < 0.2) //если все румбы меньше 20%, то нет преобладающего направления { result.Add("Нет преобладающего направления ветра", Color.Black); } else//выбор преобладающих направлений ветра { var dirs = GetRhumbsDominants(range, expectancy); string ln = dirs.Aggregate("", (str, dir) => str + $"{dir.Description()} ({Math.Round(expectancy[dir] * 100, 2)}%), ").Trim(new char[] { ' ', ',' }); result.Add("Преобладающие направления ветра: " + ln, Color.Black); } if (Hms > 750) { result.Add($"Высота точки МС больше 750 м над у. м. ({Hms:0.0} м), не рекомендуеся выполнять преобразование", Color.Red); } else if (Hpoint > 750) { result.Add($"Высота точки ВЭС больше 750 м над у. м. ({Hpoint:0.0} м), не рекомендуеся выполнять преобразование", Color.Red); } else { if (L > 50 && dH <= 750 && Habs <= 750) //макрорельеф { result.Add($"Рекомендуется выбрать макрорельеф (L={L:0.0} км, Δh={dH:0.0} м)", Color.Green); } if (L > 3 && L <= 50 && dH <= 750 && Habs <= 750) //мезорельеф { result.Add($"Рекомендуется выбрать мезорельеф (L={L:0.0} км, Δh={dH:0.0} м)", Color.Green); } if (L <= 3 && dH <= 80 && Habs <= 750) //микрорельеф { result.Add($"Рекомендуется выбрать микрорельеф (L={L:0.0} км, Δh={dH:0.0} м)", Color.Green); } } return(result); }