Пример #1
0
        internal void Run(string gpxFile, DEMDataSet dataSet, float Z_FACTOR = 2f, int outputSrid = Reprojection.SRID_PROJECTED_MERCATOR)
        {
            try
            {
                float     paddingFactor        = 2f;
                float     ModelMaxUnits        = 250f;
                float     GpxLineWidthSTLUnits = 0.1f;
                Matrix4x4 stlTransformMatrix   = Matrix4x4.CreateRotationX((float)Math.PI / 2f);


                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().ReprojectTo(4326, outputSrid);
                bbox = bbox.Pad(bbox.Width * paddingFactor, bbox.Height * paddingFactor, 0)
                       .ReprojectTo(outputSrid, 4326);
                var gpxPointsElevated = _elevationService.GetPointsElevation(points, dataSet);

                HeightMap hMap = _elevationService.GetHeightMap(ref bbox, dataSet);

                hMap = hMap.ReprojectTo(4326, outputSrid)
                       .ZScale(Z_FACTOR)
                       .CenterOnOrigin()
                       .FitInto(ModelMaxUnits)
                       .BakeCoordinates();

                // generate mesh
                ModelRoot model = _sharpGltfService.CreateTerrainMesh(hMap, GenOptions.BoxedBaseElevationMin, stlTransformMatrix);

                List <Attribution> attributions = new List <Attribution>();
                attributions.Add(dataSet.Attribution);
                attributions.Add(new Attribution("Generator", "DEM Net Elevation API", "https://elevationapi.com"));

                _stlService.STLExport(model.LogicalMeshes[0].Primitives[0], Path.ChangeExtension(gpxFile, ".stl"), false, attributions);



                var bboxPoints = bbox.ReprojectTo(4326, outputSrid).CenterOnOrigin();

                gpxPointsElevated = gpxPointsElevated.ReprojectTo(4326, outputSrid)
                                    .ZScale(Z_FACTOR)
                                    .CenterOnOrigin(bbox.ReprojectTo(4326, outputSrid))
                                    .FitInto(bboxPoints, ModelMaxUnits)
                                    .ToList();


                var gpxModel = _sharpGltfService.AddLine(null, "GPX", gpxPointsElevated, Vector4.One, GpxLineWidthSTLUnits, stlTransformMatrix);
                _stlService.STLExport(gpxModel.LogicalMeshes[0].Primitives[0], Path.ChangeExtension(gpxFile, ".gpx.stl"), false, attributions);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        internal void RunGPX(DEMDataSet largeDataSet, DEMDataSet localDataset)
        {
            try
            {
                string outputDir     = Path.GetFullPath(".");
                string _gpxFile      = Path.Combine("SampleData", "20191022-Puch-Pöllau.gpx");
                string sensorLogFile = Path.Combine("SampleData", "20191023-Puch-Pöllau-sensorlog.json");
                var    sensorLog     = SensorLog.FromJson(sensorLogFile);
                //sensorLog.Plot("sensorLog.png");
                string balloonModel     = Path.Combine("SampleData", "OE-SOE.glb");
                float  Z_FACTOR         = 2f;
                float  trailWidthMeters = 5f;


                ModelRoot balloon = ModelRoot.Load(balloonModel);

                //=======================
                /// Line strip from GPX
                ///
                // Get GPX points
                var segments  = GpxImport.ReadGPX_Segments <GpxTrackPoint>(_gpxFile, p => p);
                var pointsGpx = segments.SelectMany(seg => seg);
                var geoPoints = pointsGpx.ToGeoPoints();

                var model = _sharpGltfService.CreateNewModel();
                //var largeMesh = GetMeshFromGpxTrack(outputDir, largeDataSet, geoPoints
                //                                , bboxScale: 5
                //                                , zFactor: Z_FACTOR
                //                                , generateTIN: false
                //                                , tinPrecision: 500d
                //                                , drawGpxOnTexture: false
                //                                , ImageryProvider.OpenTopoMap);
                //meshes.Add(largeMesh);

                model = GetMeshFromGpxTrack(model, outputDir, localDataset, geoPoints
                                            , bboxScale: (1.3, 1.5)
                                            , zFactor: Z_FACTOR
                                            , generateTIN: false
                                            , tinPrecision: 50d
                                            , drawGpxOnTexture: true
                                            , ImageryProvider.EsriWorldImagery);


                var gpxPoints = geoPoints.ReprojectGeodeticToCartesian().ZScale(Z_FACTOR);

                model = _sharpGltfService.AddLine(model, gpxPoints, new Vector4(0, 1, 0, 0.5f), trailWidthMeters);

                // model export
                Console.WriteLine("GenerateModel...");

                var node = model.LogicalNodes.First();
                pointsGpx = pointsGpx.ReprojectGeodeticToCartesian().ZScale(Z_FACTOR);
                // animations
                node = CreateAnimationFromGpx("GPX", node, pointsGpx, 1f);
                node = CreateAnimationFromGpx("GPX x500", node, pointsGpx, 500f);


                var sceneBuilderBalloon = balloon.DefaultScene.ToSceneBuilder();

                var sceneBuilderTerrain = model.DefaultScene.ToSceneBuilder();
                //sceneBuilderBalloon.



                model.SaveGLB(Path.Combine(Directory.GetCurrentDirectory(), $"{GetType().Name}.glb"));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
            }
        }
Пример #4
0
        internal void Run(DEMDataSet dataSet, bool trackIn3D = true, bool generateTIN = false, int outputSrid = Reprojection.SRID_PROJECTED_LAMBERT_93)
        {
            try
            {
                string _gpxFile    = Path.Combine("SampleData", "GPX", "lake-pleasant-camping.gpx");
                bool   withTexture = true;
                float  Z_FACTOR    = 1.8f;
                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.1, 1.1).ReprojectTo(4326, dataSet.SRID);
                // 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(dataSet.SRID, outputSrid)
                       //.CenterOnOrigin()
                       .ZScale(Z_FACTOR)
                       .BakeCoordinates();
                //
                //=======================

                //=======================
                // Textures
                //
                PBRTexture pbrTexture = null;
                if (withTexture)
                {
                    Console.WriteLine("Download image tiles...");
                    TileRange tiles    = _imageryService.DownloadTiles(bbox, provider, 12);
                    string    fileName = Path.Combine(outputDir, "Texture.jpg");

                    Console.WriteLine("Construct texture...");
                    //TextureInfo texInfo = _imageryService.ConstructTextureWithGpxTrack(tiles, bbox, fileName, TextureImageFormat.image_jpeg, gpxPointsElevated, false);
                    TextureInfo texInfo = _imageryService.ConstructTexture(tiles, bbox, fileName, TextureImageFormat.image_jpeg);

                    //
                    //=======================

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

                    pbrTexture = PBRTexture.Create(texInfo, null);

                    //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(dataSet.SRID, outputSrid)
                                        //.CenterOnOrigin()
                                        //.CenterOnOrigin(hMap.BoundingBox)
                                        .ZScale(Z_FACTOR);


                    model = _sharpGltfService.AddLine(model, "GPX", gpxPointsElevated, VectorsExtensions.CreateColor(255, 0, 0, 128), 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);
            }
        }