public IHttpActionResult GetPathElevation(Location[] path, int samples = 100) { try { var geoPoints = ModelFactory.Create(path); var geom = GeometryService.ParseGeoPointAsGeometryLine(geoPoints); _elevationService.DownloadMissingFiles(DEMDataSet.AW3D30, geom.GetBoundingBox()); geoPoints = _elevationService.GetLineGeometryElevation(geom, DEMDataSet.AW3D30, InterpolationMode.Bilinear); ElevationMetrics metrics = GeometryService.ComputeMetrics(geoPoints); if (samples > 2) { double ratio = 4 / 2; double tolerance = (metrics.MaxElevation - metrics.MinElevation) / (samples / ratio); geoPoints = DouglasPeucker.DouglasPeuckerReduction(geoPoints, tolerance); } // Model ElevationMetricsModel metricsModel = ModelFactory.CreateElevationMetricsModel(geoPoints, metrics); var feature = ModelFactory.CreateFeature(geoPoints, metricsModel); return(Ok(feature)); } catch (Exception ex) { return(InternalServerError(new Exception(ex.Message))); } }
static void LineDEMBenchmark(ElevationService elevationService, DEMDataSet dataSet, int numSamples) { Dictionary <string, string> dicWktByName = new Dictionary <string, string>(); //dicWktByName.Add(nameof(WKT_EXAMPLE_GOOGLE), WKT_EXAMPLE_GOOGLE); // Before GeoTiff window optim : 90s // After GeoTiff optim : 77s / release : 60s; dicWktByName.Add(nameof(WKT_BREST_NICE), WKT_BREST_NICE); dicWktByName.Add(nameof(WKT_HORIZONTAL_DEM_EDGE), WKT_HORIZONTAL_DEM_EDGE); dicWktByName.Add(nameof(WKT_VERTICAL_DEM_EDGE), WKT_VERTICAL_DEM_EDGE); dicWktByName.Add(nameof(WKT_MONACO), WKT_MONACO); dicWktByName.Add(nameof(WKT_TEST), WKT_TEST); dicWktByName.Add(nameof(WKT_NO_DEM), WKT_NO_DEM); dicWktByName.Add(nameof(WKT_ZERO), WKT_ZERO); dicWktByName.Add(nameof(WKT_NEG100), WKT_NEG100); dicWktByName.Add(nameof(WKT_BREST_SPAIN_OCEAN), WKT_BREST_SPAIN_OCEAN); dicWktByName.Add(nameof(WKT_EXAMPLE_GOOGLE), WKT_EXAMPLE_GOOGLE); dicWktByName.Add(nameof(WKT_PARIS_AIX), WKT_PARIS_AIX); dicWktByName.Add(nameof(WKT_PETITE_BOUCLE), WKT_PETITE_BOUCLE); dicWktByName.Add(nameof(WKT_GRAND_TRAJET), WKT_GRAND_TRAJET); dicWktByName.Add(nameof(WKT_GRAND_TRAJET_MARSEILLE_ALPES_MULTIPLE_TILES), WKT_GRAND_TRAJET_MARSEILLE_ALPES_MULTIPLE_TILES); dicWktByName.Add(nameof(WKT_BAYONNE_AIX_OUEST_EST), WKT_BAYONNE_AIX_OUEST_EST); dicWktByName.Add(nameof(WKT_AIX_BAYONNE_EST_OUEST), WKT_AIX_BAYONNE_EST_OUEST); dicWktByName.Add(nameof(WKT_BAYONNE_NICE_DIRECT), WKT_BAYONNE_NICE_DIRECT); dicWktByName.Add(nameof(WKT_DEM_INTERPOLATION_BUG), WKT_DEM_INTERPOLATION_BUG); Stopwatch sw = Stopwatch.StartNew(); InterpolationMode[] modes = { InterpolationMode.Bilinear, InterpolationMode.Hyperbolic }; for (int i = 0; i < 5; i++) { foreach (var wkt in dicWktByName) { elevationService.DownloadMissingFiles(dataSet, GetBoundingBox(wkt.Value)); foreach (InterpolationMode mode in modes) { var lineElevationData = elevationService.GetLineGeometryElevation(wkt.Value, dataSet, mode); ElevationMetrics metrics = GeometryService.ComputeMetrics(ref lineElevationData); //var sampledLineElevationData = ReduceList(lineElevationData, numSamples).ToList(); //File.WriteAllText($"ElevationData_{wkt.Key}_{mode}.txt", elevationService.ExportElevationTable(lineElevationData)); //File.WriteAllText($"ElevationData_{wkt.Key}_{mode}_{numSamples}samples.txt", elevationService.ExportElevationTable(sampledLineElevationData)); } } } sw.Stop(); Console.WriteLine($"LineDEMTests performed in {sw.Elapsed:g}."); }
public static ElevationMetrics ComputeMetrics(ref List <GeoPoint> points) { ElevationMetrics metrics = new ElevationMetrics(); double total = 0; double minElevation = double.MaxValue; double maxElevation = double.MinValue; double totalClimb = 0; double totalDescent = 0; if (points.Count > 1) { double lastElevation = points[0].Elevation.GetValueOrDefault(0); for (int i = 1; i < points.Count; i++) { GeoPoint curPoint = points[i]; double v_dist = GetDistanceBetweenPoints(curPoint, points[i - 1]); total += v_dist; curPoint.DistanceFromOriginMeters = total; minElevation = Math.Min(minElevation, curPoint.Elevation.GetValueOrDefault(double.MaxValue)); maxElevation = Math.Max(maxElevation, curPoint.Elevation.GetValueOrDefault(double.MinValue)); double currentElevation = curPoint.Elevation.GetValueOrDefault(lastElevation); double diff = currentElevation - lastElevation; if (diff > 0) { totalClimb += diff; } else { totalDescent += diff; } lastElevation = currentElevation; } } metrics.Climb = totalClimb; metrics.Descent = totalDescent; metrics.NumPoints = points.Count; metrics.Distance = total; metrics.MinElevation = minElevation; metrics.MaxElevation = maxElevation; return(metrics); }
static void LineDEMTest(ElevationService elevationService, DEMDataSet dataSet, string wkt, int numSamples) { Stopwatch sw = Stopwatch.StartNew(); elevationService.DownloadMissingFiles(dataSet, GetBoundingBox(wkt)); var lineElevationData = elevationService.GetLineGeometryElevation(wkt, dataSet, InterpolationMode.Bilinear); ElevationMetrics metrics = GeometryService.ComputeMetrics(ref lineElevationData); var lineElevationData_Reduced = DouglasPeucker.DouglasPeuckerReduction(lineElevationData, (metrics.MaxElevation - metrics.MinElevation) / numSamples); sw.Stop(); Console.WriteLine($"LineDEMTest performed in {sw.Elapsed:g}."); SpatialTrace.Enable(); SpatialTrace.Clear(); SpatialTraceLine(lineElevationData, $"Full resolution line ({lineElevationData.Count} points)"); SpatialTraceLine(lineElevationData_Reduced, $"Reduced line ({lineElevationData_Reduced.Count} points)"); SpatialTrace.ShowDialog(); }
internal static ElevationMetricsModel CreateElevationMetricsModel(List <GeoPoint> geoPoints, ElevationMetrics metrics) { return(new ElevationMetricsModel { length = metrics.Distance, maxElevation = metrics.MaxElevation, minElevation = metrics.MinElevation, numSamples = geoPoints.Count, numPointsUsed = metrics.NumPoints, totalClimb = metrics.Climb, totalDescent = metrics.Descent }); }