public List <GeoPoint> GetElevationList(IEnumerable <LatLon> points) { var geoPoints = points.Select(p => new GeoPoint(p.Latitude, p.Longitude)); var elevations = elevationService.GetPointsElevation(geoPoints, dataSet); return(elevations.ToList()); }
internal void Run() { try { string _gpxFile = Path.Combine("SampleData", "trail.gpx"); if (!File.Exists(_gpxFile)) { _logger.LogError($"Cannot run sample: {_gpxFile} is missing !"); } DEMDataSet _dataSet = DEMDataSet.SRTM_GL1; // Read GPX points var segments = GpxImport.ReadGPX_Segments(_gpxFile); var points = segments.SelectMany(seg => seg); // Retrieve elevation for each point on DEM var gpxPointsElevated = _elevationService.GetPointsElevation(points, _dataSet) .ToList(); _logger.LogInformation($"{gpxPointsElevated.Count} GPX points elevation calculated"); // Get metrics (stats) var metrics = gpxPointsElevated.ComputeMetrics(); _logger.LogInformation($"GPX points stats: {metrics}"); var gpxPointsSimplified = gpxPointsElevated.Simplify(50); _logger.LogInformation($"GPX track is reduced with 50m tolerance."); var metricsWithReducedPoints = gpxPointsSimplified.ComputeMetrics(); _logger.LogInformation($"GPX points stats after reduction: {metricsWithReducedPoints}"); var geoJson = ConvertLineElevationResultToGeoJson(gpxPointsSimplified); } catch (Exception ex) { _logger.LogError(ex, ex.Message); } }
public void Run() { try { double lat1 = 46.00000000000004; double lon1 = 10.000000000000007; double lat2 = 45.212278; double lont2 = 5.468857; _logger.LogInformation($"Getting location elevation for each dataset (location lat: {lat1:N2}, lon: {lon1:N2})"); Stopwatch sw = new Stopwatch(); Parallel.ForEach(DEMDataSet.RegisteredNonLocalDatasets, (dataSet, loopState) => //foreach (var dataSet in DEMDataSet.RegisteredNonSingleFileDatasets) { sw.Restart(); _elevationService.DownloadMissingFiles(dataSet, lat1, lon1); GeoPoint geoPoint = _elevationService.GetPointElevation(lat1, lon1, dataSet); _logger.LogInformation($"{dataSet.Name} elevation: {geoPoint.Elevation:N2} (time taken: {sw.Elapsed.TotalMilliseconds:N1}ms)"); } ); _logger.LogInformation("Multiple point elevation"); sw.Restart(); GeoPoint pt1 = new GeoPoint(lat1, lon1); GeoPoint pt2 = new GeoPoint(lat2, lont2); GeoPoint[] points = { pt1, pt2 }; Parallel.ForEach(DEMDataSet.RegisteredNonLocalDatasets, (dataSet, loopState) => //foreach (var dataSet in DEMDataSet.RegisteredNonSingleFileDatasets) { sw.Restart(); var geoPoints = _elevationService.GetPointsElevation(points, dataSet); _logger.LogInformation($"{dataSet.Name} elevation: {string.Join(" / ", geoPoints.Select(e => e.Elevation.GetValueOrDefault().ToString("N2")))} (time taken: {sw.Elapsed.TotalMilliseconds:N1}ms)"); } ); _logger.LogInformation("Line elevation"); sw.Restart(); // Line passing by mont ventoux peak [5.144899, 44.078873], [5.351516, 44.225876] var elevationLine = GeometryService.ParseGeoPointAsGeometryLine(new GeoPoint(44.078873, 5.144899), new GeoPoint(44.225876, 5.351516)); Parallel.ForEach(DEMDataSet.RegisteredNonLocalDatasets, (dataSet, loopState) => //foreach (var dataSet in DEMDataSet.RegisteredNonSingleFileDatasets) { _elevationService.DownloadMissingFiles(dataSet, elevationLine.GetBoundingBox()); var geoPoints = _elevationService.GetLineGeometryElevation(elevationLine, dataSet); var metrics = geoPoints.ComputeMetrics(); _logger.LogInformation($"{dataSet.Name} metrics: {metrics.ToString()}"); var simplified = geoPoints.Simplify(50 /* meters */); _logger.LogInformation($"{dataSet.Name} after reduction : {simplified.Count} points"); var geoJson = ConvertLineElevationResultToGeoJson(simplified); } ); _logger.LogInformation($"Done in {sw.Elapsed.TotalMilliseconds:N1}ms"); } catch (Exception ex) { _logger.LogError(ex, ex.Message); } }
internal void Run(DEMDataSet dataSet, bool trackIn3D = true, bool generateTIN = false, int outputSrid = Reprojection.SRID_PROJECTED_LAMBERT_93) { try { string _gpxFile = Path.Combine("SampleData", "BikeRide.gpx"); bool withTexture = true; float Z_FACTOR = 4f; float Z_TRANSLATE_GPX_TRACK_METERS = 5; float trailWidthMeters = 5f; int skipGpxPointsEvery = 1; ImageryProvider provider = ImageryProvider.MapBoxSatellite; // new TileDebugProvider(null, maxDegreeOfParallelism: 1);// ImageryProvider.MapBoxSatellite; string outputDir = Path.GetFullPath("."); //======================= /// Line strip from GPX /// // Get GPX points var segments = GpxImport.ReadGPX_Segments(_gpxFile); var points = segments.SelectMany(seg => seg); var bbox = points.GetBoundingBox().Scale(1.3, 1.3); // DEBUG // Test case : ASTER GDEMv3 : 5.5 43.5 Z=315 // 303 307 308 // 309 *315* 317 // 314 321 324 //points = GenerateDebugTrailPointsGenerateDebugTrailPoints(5.003, 5.006, 43.995, 43.997, 0.0001, 0.001); //points = GenerateDebugTrailPointsGenerateDebugTrailPoints(5.4990, 5.501, 43.4990, 43.501, 0.0001, 0.001); //points = GenerateDebugTrailPointsGenerateDebugTrailPoints(5.49, 5.51, 43.49, 43.51, 0.0005, 0.001); //bbox = points.GetBoundingBox().Scale(1.3,1.3); IEnumerable <GeoPoint> gpxPointsElevated = _elevationService.GetPointsElevation(points, dataSet); // //======================= //======================= /// Height map (get dem elevation for bbox) /// HeightMap hMap = _elevationService.GetHeightMap(ref bbox, dataSet); // var refPoint = new GeoPoint(43.5, 5.5); // hMap = hMap.BakeCoordinates(); // var hMapRefPoint = hMap.Coordinates.OrderBy(c => c.DistanceSquaredTo(refPoint)).First(); // var gpxRefPoint = gpxPointsElevated.OrderBy(c => c.DistanceSquaredTo(refPoint)).First(); // hMapRefPoint.Elevation += 60; // gpxRefPoint.Elevation += 60; hMap = hMap.ReprojectTo(4326, outputSrid) //.CenterOnOrigin() .ZScale(Z_FACTOR) .BakeCoordinates(); // //======================= //======================= // Textures // PBRTexture pbrTexture = null; if (withTexture) { Console.WriteLine("Download image tiles..."); TileRange tiles = _imageryService.DownloadTiles(bbox, provider, 8); string fileName = Path.Combine(outputDir, "Texture.jpg"); Console.WriteLine("Construct texture..."); TextureInfo texInfo = _imageryService.ConstructTextureWithGpxTrack(tiles, bbox, fileName, TextureImageFormat.image_jpeg, gpxPointsElevated, false); // //======================= //======================= // Normal map Console.WriteLine("Height map..."); //float Z_FACTOR = 0.00002f; //hMap = hMap.CenterOnOrigin().ZScale(Z_FACTOR); var normalMap = _imageryService.GenerateNormalMap(hMap, outputDir); pbrTexture = PBRTexture.Create(texInfo, normalMap); //hMap = hMap.CenterOnOrigin(Z_FACTOR); // //======================= } //======================= // MESH 3D terrain Console.WriteLine("Height map..."); Console.WriteLine("GenerateTriangleMesh..."); //hMap = _elevationService.GetHeightMap(bbox, _dataSet); ModelRoot model = null; if (generateTIN) { model = TINGeneration.GenerateTIN(hMap, 10d, _sharpGltfService, pbrTexture, outputSrid); } else { //hMap = hMap.CenterOnOrigin().ZScale(Z_FACTOR); // generate mesh with texture model = _sharpGltfService.CreateTerrainMesh(hMap, pbrTexture); } if (trackIn3D) { // take 1 point evert nth gpxPointsElevated = gpxPointsElevated.Where((x, i) => (i + 1) % skipGpxPointsEvery == 0); gpxPointsElevated = gpxPointsElevated.ZTranslate(Z_TRANSLATE_GPX_TRACK_METERS) .ReprojectTo(4326, outputSrid) //.CenterOnOrigin() //.CenterOnOrigin(hMap.BoundingBox) .ZScale(Z_FACTOR); model = _sharpGltfService.AddLine(model, gpxPointsElevated, new Vector4(0, 1, 0, 0.5f), trailWidthMeters); } // model export Console.WriteLine("GenerateModel..."); model.SaveGLB(Path.Combine(Directory.GetCurrentDirectory(), $"{GetType().Name} dst{dataSet.Name} TIN{generateTIN} Srid{outputSrid}.glb")); } catch (Exception ex) { _logger.LogError(ex, ex.Message); } }