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