Example #1
0
        /// <summary>
        /// Paralelně provede pokus o nalezení nejbližšího bodu a použití jeho výšky
        /// </summary>
        /// <param name="locations">kolekce lokací pro které chceme získat výšku</param>
        /// <param name="elevationResponse">referencovaná odpověď do které chceme výsledky zapsat</param>
        /// <param name="premiumUser">Prémiový uživatel</param>
        /// <param name="spheroid">Použít sféroid pro výpočet vzdálenosti (pomalejší)</param>
        /// <returns>Kolekce lokací pro které nebyla nalezena výška</returns>
        private static IEnumerable <Location> GetPointsFromDbParallel(IEnumerable <Location> locations, ref ElevationResponse elevationResponse, bool premiumUser, bool spheroid)
        {
            var locsWithoutElevation = new List <Location>();
            List <ResultDistance> resultDistances;

            try
            {
                resultDistances = PostgreDbConnector.GetClosestPointWithinParallel(locations, WITHIN_DISTANCE, premiumUser, spheroid);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                logger.Error(e);
                throw;
            }

            foreach (Result result in elevationResponse.result)
            {
                ResultDistance closest = resultDistances.Find(rd => rd.Result.location.Equals(result.location));
                if (closest.Distance <= MAX_DISTANCE && closest.Distance >= 0)
                {
                    result.elevation  = closest.Result.elevation;
                    result.resolution = closest.Result.resolution != -1 ? closest.Result.resolution : closest.Distance;
                }
                else
                {
                    locsWithoutElevation.Add(result.location);
                }
            }

            return(locsWithoutElevation);
        }
Example #2
0
        /// <summary>
        /// Provede pokus o nalezení nejbližšího bodu a použití jeho výšky
        /// </summary>
        /// <param name="locations">kolekce lokací pro které chceme získat výšku</param>
        /// <param name="elevationResponse">referencovaná odpověď do které chceme výsledky zapsat</param>
        /// <param name="premiumUser">Prémiový uživatel</param>
        /// <param name="spheroid">Použít sféroid pro výpočet vzdálenosti (pomalejší)</param>
        /// <returns>Kolekce lokací pro které nebyla nalezena výška</returns>
        private static IEnumerable <Location> GetPointsFromDb(IEnumerable <Location> locations, ref ElevationResponse elevationResponse, bool premiumUser, bool spheroid)
        {
            var locsWithoutElevation = new List <Location>();

            foreach (Result result in elevationResponse.result)
            {
                var closest = new ResultDistance();
                try
                {
                    closest = PostgreDbConnector.GetClosestPointWithin(result.location, WITHIN_DISTANCE, premiumUser, spheroid);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    logger.Error(e);
                }

                if (closest.Distance <= MAX_DISTANCE && closest.Distance >= 0)
                {
                    result.elevation  = closest.Result.elevation;
                    result.resolution = closest.Result.resolution != -1 || closest.Result.resolution != 0 ? closest.Result.resolution : closest.Distance;
                }
                else
                {
                    locsWithoutElevation.Add(result.location);
                }
            }

            return(locsWithoutElevation);
        }
Example #3
0
        private static void LoadXyzFile(string filepath)
        {
            Console.WriteLine("Loading file {0}", filepath);
            logger.Info("Loading file {0}", filepath);
            int rowsAdded = PostgreDbConnector.LoadXyzFileParallel(filepath, SRID.S_JTSK);

            Console.WriteLine("Rows {0} added from {1}", rowsAdded, filepath);
            logger.Info("Rows {0} added from {1}", rowsAdded, filepath);
        }
Example #4
0
        private static void InitializeDatabase()
        {
            PostgreDbConnector.InitializeDatabase();

            Configuration configFile = OpenExeConfiguration(ConfigurationUserLevel.None);
            KeyValueConfigurationCollection settings = configFile.AppSettings.Settings;

            settings["db_initialized"].Value = "true";
            configFile.Save(ConfigurationSaveMode.Modified);
            RefreshSection(configFile.AppSettings.SectionInformation.Name);

            System.Diagnostics.Process.Start(Application.ExecutablePath);
            Environment.Exit(0);
        }
Example #5
0
        /// <summary>
        /// Asynchroně získá výšky pro lokace od externích poskytovatelů výškopisu
        /// </summary>
        /// <param name="locations">kolekce lokací pro které chceme získat výšku</param>
        /// <param name="source">zdroj externích dat</param>
        /// <returns>kolekce výsledků</returns>
        private static async Task <List <Result> > GetElevation(IReadOnlyCollection <Location> locations, string source)
        {
            var google         = new GoogleElevationProvider();
            var seznam         = new SeznamElevationProvider();
            var elevationTasks = new List <Task <IEnumerable <Result> > >()
            {
                google.GetElevationResultsAsync(locations),
                seznam.GetElevationResultsAsync(locations)
            };

            IEnumerable <Result>[] elevationResults = null;
            try
            {
                elevationResults = await Task.WhenAll(elevationTasks);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                logger.Error(e);
            }
            if (elevationResults == null)
            {
                throw new ElevationProviderException("Elevation result were empty");
            }

            List <Result> googleResults = elevationResults[0].ToList();
            List <Result> seznamResults = elevationResults[1].ToList();

            //Uložení hodnot do databáze
            try
            {
                //int rowsAddedGoogle = PostgreDbConnector.InsertResultsParallel(googleResults, Source.Google);
                int rowsAddedSeznam = PostgreDbConnector.InsertResultsParallel(seznamResults, Source.Seznam);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                logger.Error(e);
            }


            switch (source)
            {
            case "google":
                return(googleResults);

            default:
                return(seznamResults);
            }
        }
Example #6
0
        /// <summary>
        /// Vrátí průměrnou výšku vypočítanou jako průměr z nejbližších bodů od zadané lokace
        /// </summary>
        /// <param name="location">Lokace</param>
        /// <param name="within">Vzdálenost ve které bod hledat</param>
        /// <param name="premium">Prohledávat hodnoty nahrané ze souboru</param>
        /// <param name="spheroid">Použití přesnějšího měření vzdálenosti (pomalejší)</param>
        /// <returns>Výsledek s lokací, výškou a přesností</returns>
        public static Result Average(Location location, double within, bool premium, bool spheroid)
        {
            List <ResultDistance> closest = PostgreDbConnector.GetClosestPointsWithin(location, within, premium, spheroid);

            double elevation  = 0;
            double resolution = 0;

            foreach (ResultDistance resultDistance in closest)
            {
                if (resultDistance.Distance == -1)
                {
                    return(null);
                }
                elevation += resultDistance.Result.elevation;
                resolution = Math.Max(resolution, resultDistance.Distance);
            }

            elevation = elevation / closest.Count;

            return(new Result(location, elevation, resolution));
        }
Example #7
0
        public static async void TestElevationPrecision(int limit = 100, int offset = 0, bool file = false, bool closest = true)
        {
            IEnumerable <Result> results = closest
                ? PostgreDbConnector.QueryForTestingElevationPrecisionClosestPoints(new Location(50.499805, 13.6484716), limit)
                : PostgreDbConnector.QueryForTestingElevationPrecision(limit, offset);

            IEnumerable <Result> resultsEnumerable = results.ToList();
            List <Location>      locations         = resultsEnumerable.Select(result => result.location).ToList();
            var seznam         = new SeznamElevationProvider();
            var google         = new GoogleElevationProvider();
            var elevationTasks = new List <Task <IEnumerable <Result> > >()
            {
                google.GetElevationResultsAsync(locations),
                seznam.GetElevationResultsAsync(locations),
            };

            IEnumerable <Result>[] elevationResults = null;
            try
            {
                elevationResults = await Task.WhenAll(elevationTasks);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                logger.Error(e);
            }

            if (elevationResults == null)
            {
                throw new ElevationProviderException("Elevation result were empty");
            }

            List <Result> googleResults = elevationResults[0].ToList();
            List <Result> seznamResults = elevationResults[1].ToList();

            int    i         = -1;
            double googleSum = 0;
            double seznamSum = 0;

            System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
            TextWriter tw = File.CreateText(@"files/acc.csv");

            if (file)
            {
                //tw.WriteLine("{0};{1};{2};{3};{4};{5};{6}", "Lat", "Lng", "DB", "Google", "Seznam", "dGoogle", "dSeznam");
            }
            foreach (Result result in resultsEnumerable)
            {
                i++;
                Result googleResult = googleResults[i];
                Result seznamResult = seznamResults[i];

                Console.WriteLine("Database: {0} (Lat: {1} Lng: {2})", result.elevation, result.location.lat, result.location.lng);
                Console.WriteLine("Google: {0} (Lat: {1} Lng: {2})", googleResult.elevation, googleResult.location.lat, googleResult.location.lng);
                Console.WriteLine("Seznam: {0} (Lat: {1} Lng: {2})", seznamResult.elevation, seznamResult.location.lat, seznamResult.location.lng);


                googleSum += Math.Pow(result.elevation - googleResult.elevation, 2);
                seznamSum += Math.Pow(result.elevation - seznamResult.elevation, 2);

                Console.WriteLine("Google sum: {0}", googleSum);
                Console.WriteLine("Seznam sum: {0}", seznamSum);

                Console.WriteLine("-----------------------");


                if (file)
                {
                    tw.WriteLine("{0};{1};{2};{3};{4};{5};{6}", result.location.lat, result.location.lng, result.elevation, googleResult.elevation, seznamResult.elevation, result.elevation - googleResult.elevation, result.elevation - seznamResult.elevation);
                    //tw.WriteLine("{0};{1};{2}", result.location.lat, result.location.lng, result.elevation);
                }
            }
            tw.Close();

            double googleRozdil = Math.Sqrt(googleSum) / limit;
            double seznamRozdil = Math.Sqrt(seznamSum) / limit;

            Console.WriteLine("Google rozdíl: {0}", googleRozdil);
            Console.WriteLine("Seznam rozdíl: {0}", seznamRozdil);

            googleSum = 0;
            seznamSum = 0;
            i         = 0;
            foreach (Result result in resultsEnumerable)
            {
                Result googleResult = googleResults[i];
                Result seznamResult = seznamResults[i];
                i++;
                double gr = Math.Sqrt(Math.Pow(result.elevation - googleResult.elevation, 2));
                double sr = Math.Sqrt(Math.Pow(result.elevation - seznamResult.elevation, 2));
                googleSum += Math.Pow(gr - googleRozdil, 2);
                seznamSum += Math.Pow(sr - seznamRozdil, 2);
            }

            double googleOdchylka = Math.Sqrt((1.0 / (limit - 1)) * googleSum);
            double seznamOdchylka = Math.Sqrt((1.0 / (limit - 1)) * seznamSum);

            Console.WriteLine("Google odchylka: {0}", googleOdchylka);
            Console.WriteLine("Seznam odchylka: {0}", seznamOdchylka);
        }
Example #8
0
 /// <summary>
 /// Kontrola zdali se API klíč nachází v DB
 /// </summary>
 /// <param name="key">API klíč</param>
 /// <returns>Dvojice (existující uživatel, prémiový uživatel)</returns>
 private static (bool existingUser, bool premiumUser) CheckApiKey(string key)
 {
     (string name, bool premium) = PostgreDbConnector.GetUser(key);
     return(name == null ? (false, premium) : (true, premium));
 }