Esempio n. 1
0
 public AdsCreator(IGeoInfoProvider geoInfoProvider, IDataProvider dataBase)
 {
     _geoInfoProvider = geoInfoProvider;
     _dataBase        = dataBase;
 }
Esempio n. 2
0
        /// <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);
        }