public void Test_GLB_Export() { string fileName = "N43E005.hgt"; string sourceFile = Path.Combine("TestData", fileName + ".zip"); bool fileOk = File.Exists(sourceFile); Assert.True(fileOk, "TestData is missing"); if (!File.Exists(fileName)) { ZipFile.ExtractToDirectory(sourceFile, ".", true); } Assert.True(File.Exists(fileName), "Unzip failed."); // Pass the full file name fileName = Path.GetFullPath(fileName); using (IRasterFile raster = _rasterService.OpenFile(fileName, DEMFileFormat.SRTM_HGT)) { FileMetadata metaData = raster.ParseMetaData(); Assert.NotNull(metaData); string str2 = "zsq4"; HeightMap heightMap = _elevationService.GetHeightMap(metaData) .ReprojectGeodeticToCartesian() .ZScale(2.5f); MeshPrimitive meshPrimitive = _gltfService.GenerateTriangleMesh(heightMap); Model model = _gltfService.GenerateModel(meshPrimitive, str2); _gltfService.Export(model, ".", str2, false, true); } }
public void BoudingBoxConservationTest(string datasetName) { var dataset = DEMDataSet.RegisteredDatasets.First(d => d.Name == datasetName); string bboxWKT = "POLYGON((5.54888 43.519525, 5.61209 43.519525, 5.61209 43.565225, 5.54888 43.565225, 5.54888 43.519525))"; BoundingBox bbox = GeometryService.GetBoundingBox(bboxWKT); Assert.NotNull(bbox); Assert.Equal(bboxWKT, bbox.WKT); HeightMap heightMap = _elevationService.GetHeightMap(bbox, dataset); heightMap = heightMap.ReprojectGeodeticToCartesian().BakeCoordinates(); Assert.True(heightMap.BoundingBox == heightMap.Coordinates.GetBoundingBox()); heightMap = heightMap.ZScale(2.5f).BakeCoordinates(); Assert.True(heightMap.BoundingBox == heightMap.Coordinates.GetBoundingBox()); heightMap = heightMap.CenterOnOrigin().BakeCoordinates(); Assert.True(heightMap.BoundingBox == heightMap.Coordinates.GetBoundingBox()); heightMap = heightMap.FitInto(30f).BakeCoordinates(); Assert.True(heightMap.BoundingBox == heightMap.Coordinates.GetBoundingBox()); }
public void Test_GLB_Export() { string fileName = "N43E005.hgt"; string sourceFile = Path.Combine("TestData", fileName + ".zip"); bool fileOk = File.Exists(sourceFile); Assert.True(fileOk, "TestData is missing"); if (!File.Exists(fileName)) { ZipFile.ExtractToDirectory(sourceFile, ".", true); } Assert.True(File.Exists(fileName), "Unzip failed."); // Pass the full file name fileName = Path.GetFullPath(fileName); using (IRasterFile raster = _rasterService.OpenFile(fileName, DEMFileType.SRTM_HGT)) { FileMetadata metaData = raster.ParseMetaData(new DEMFileDefinition(DEMFileType.SRTM_HGT, DEMFileRegistrationMode.Grid)); Assert.NotNull(metaData); HeightMap heightMap = _elevationService.GetHeightMap(metaData) .ReprojectGeodeticToCartesian() .ZScale(2.5f); var model = _sharpGltfService.CreateTerrainMesh(heightMap); model.SaveGLB("test.glb"); } }
internal void Run(string wkt, string name, DEMDataSet dataSet, int precisionMeters = 10) { try { int outputSrid = Reprojection.SRID_PROJECTED_MERCATOR; var bbox = GeometryService.GetBoundingBox(wkt); _logger.LogInformation($"Getting height map..."); HeightMap hMap = _elevationService.GetHeightMap(ref bbox, dataSet); hMap = hMap.ZScale(2); _logger.LogInformation($"Generating TIN with {precisionMeters}m precision..."); hMap = hMap.ReprojectTo(4326, outputSrid); var model = TINGeneration.GenerateTIN(hMap, (double)precisionMeters, _glTFService, null, outputSrid); _logger.LogInformation($"Generating model..."); string v_nomFichierOut = Path.Combine(Directory.GetCurrentDirectory(), $"{name}_TIN_{dataSet.Name}.glb"); model.SaveGLB(v_nomFichierOut); _logger.LogInformation($"Model {v_nomFichierOut} generated."); } catch (Exception ex) { _logger.LogError(ex, ex.Message); } }
public void Run() { try { DEMDataSet dataset = DEMDataSet.SRTM_GL3; Stopwatch sw = Stopwatch.StartNew(); string modelName = $"Montagne Sainte Victoire {dataset.Name}"; // You can get your boox from https://geojson.net/ (save as WKT) string bboxWKT = "POLYGON((5.54888 43.519525, 5.61209 43.519525, 5.61209 43.565225, 5.54888 43.565225, 5.54888 43.519525))"; _logger.LogInformation($"Processing model {modelName}..."); _logger.LogInformation($"Getting bounding box geometry..."); var bbox = GeometryService.GetBoundingBox(bboxWKT); _logger.LogInformation($"Getting height map data..."); var heightMap = _elevationService.GetHeightMap(ref bbox, dataset); _logger.LogInformation($"Processing height map data ({heightMap.Count} coordinates)..."); heightMap = heightMap .ReprojectGeodeticToCartesian() // Reproject to 3857 (useful to get coordinates in meters) .ZScale(2f) // Elevation exageration .CenterOnOrigin() // .FitInto(250f); // Make sure model fits into 250 coordinates units (3D printer size was 30x30cm) // Triangule Irregular Network (not implemented to STL yet) //var TINmesh =TINGeneration.GenerateTIN(heightMap, 2, _glTFService, null, 3857); // Triangulate height map // and add base and sides _logger.LogInformation($"Triangulating height map and generating box (5mm thick)..."); // STL axis differ from glTF var model = _sharpGltfService.CreateTerrainMesh(heightMap, GenOptions.BoxedBaseElevationMin, Matrix4x4.CreateRotationX((float)Math.PI / 2f)); _logger.LogInformation($"Exporting STL model..."); var stlFilePath = Path.Combine(Directory.GetCurrentDirectory(), $"{modelName}.stl"); _stlService.STLExport(model.LogicalMeshes[0].Primitives[0], stlFilePath, false); _logger.LogInformation($"Model exported in {stlFilePath}."); _logger.LogInformation($"Done in {sw.Elapsed:g}"); } catch (Exception ex) { _logger.LogError(ex, ex.Message); } }
public void Run() { try { DEMDataSet dataset = DEMDataSet.AW3D30; ImageryProvider imageryProvider = ImageryProvider.MapBoxSatellite; Stopwatch sw = Stopwatch.StartNew(); string modelName = $"Montagne Sainte Victoire {dataset.Name}"; string outputDir = Directory.GetCurrentDirectory(); // You can get your boox from https://geojson.net/ (save as WKT) string bboxWKT = "POLYGON((5.54888 43.519525, 5.61209 43.519525, 5.61209 43.565225, 5.54888 43.565225, 5.54888 43.519525))"; _logger.LogInformation($"Processing model {modelName}..."); _logger.LogInformation($"Getting bounding box geometry..."); var bbox = GeometryService.GetBoundingBox(bboxWKT); _logger.LogInformation($"Getting height map data..."); var heightMap = _elevationService.GetHeightMap(ref bbox, dataset); _logger.LogInformation($"Processing height map data ({heightMap.Count} coordinates)..."); heightMap = heightMap .ReprojectGeodeticToCartesian() // Reproject to 3857 (useful to get coordinates in meters) .ZScale(2f) // Elevation exageration .CenterOnOrigin(); TileRange tiles = _imageryService.DownloadTiles(bbox, imageryProvider, 8); var texture = _imageryService.ConstructTexture(tiles, bbox, Path.Combine(outputDir, modelName + "_texture.jpg"), TextureImageFormat.image_jpeg); var normalMap = _imageryService.GenerateNormalMap(heightMap, outputDir, modelName + "_normalmap.png"); var pbrTexture = PBRTexture.Create(texture, normalMap); // Triangulate height map _logger.LogInformation($"Triangulating height map and generating 3D mesh..."); var model = _sharpGltfService.CreateTerrainMesh(heightMap, pbrTexture); model.SaveGLB(Path.Combine(Directory.GetCurrentDirectory(), modelName + ".glb")); _logger.LogInformation($"Done in {sw.Elapsed:g}"); } catch (Exception ex) { _logger.LogError(ex, ex.Message); } }
internal void Run(Microsoft.Extensions.DependencyInjection.ServiceProvider serviceProvider) { //======================= // Normal map Console.WriteLine("Height map..."); var bbox = GeometryService.GetBoundingBox(_bbox); HeightMap hMap = _elevationService.GetHeightMap(bbox, DEMDataSet.SRTM_GL3); var coords1 = hMap.Coordinates.ToList(); var coords2 = hMap.Coordinates.ToList(); Logger.RestartPerf("Projection with count"); for (int i = 0; i < 5; i++) { coords2.ReprojectTo(4326, Reprojection.SRID_PROJECTED_MERCATOR, coords2.Count).ToList(); } Logger.StopPerf("Projection with count"); Logger.RestartPerf("Projection without count"); for (int i = 0; i < 5; i++) { coords1.ReprojectTo(4326, Reprojection.SRID_PROJECTED_MERCATOR, null).ToList(); } Logger.StopPerf("Projection without count"); }
internal void Run(ServiceProvider serviceProvider) { bool useTIN = false; // still buggy with SRID 3857 int v_outSrid = Reprojection.SRID_PROJECTED_MERCATOR; IglTFService glTF = serviceProvider.GetService <IglTFService>(); IElevationService elevationService = serviceProvider.GetService <IElevationService>(); string outputDir = Path.GetFullPath(Path.Combine(_outputDirectory, "glTF")); Logger.Info("============================"); Logger.Info($"= {nameof(TextureSamples)}"); Logger.Info("============================"); Logger.Info($"= {nameof(TextureSamples)} : Datadirectory report"); // Get GPX points var bbox = GeometryService.GetBoundingBox(_bboxWkt); //======================= // Textures // TextureInfo texInfo = null; ImageryService imageryService = new ImageryService(); Console.WriteLine("Download image tiles..."); TileRange tiles = imageryService.DownloadTiles(bbox, ImageryProvider.StamenToner, 1); Console.WriteLine("Construct texture..."); string fileName = Path.Combine(outputDir, "Texture.jpg"); texInfo = imageryService.ConstructTexture(tiles, bbox, fileName, TextureImageFormat.image_jpeg); // //======================= //======================= // Normal map Console.WriteLine("Height map..."); float Z_FACTOR = 2f; HeightMap hMapNormal = elevationService.GetHeightMap(bbox, _normalsDataSet); //HeightMap hMapNormal = _elevationService.GetHeightMap(bbox, Path.Combine(_localdatadir, "ETOPO1", "ETOPO1_Bed_g_geotiff.tif"), DEMFileFormat.GEOTIFF); hMapNormal = hMapNormal.ReprojectTo(4326, v_outSrid); //hMapNormal = hMapNormal.ReprojectGeodeticToCartesian(); Console.WriteLine("Generate normal map..."); TextureInfo normal = imageryService.GenerateNormalMap(hMapNormal, outputDir); // //======================= //======================= // Get height map HeightMap hMap = elevationService.GetHeightMap(bbox, _meshDataSet); //HeightMap hMap = _elevationService.GetHeightMap(bbox, Path.Combine(_localdatadir, "ETOPO1","ETOPO1_Bed_g_geotiff.tif"), DEMFileFormat.GEOTIFF); //======================= // UV mapping (before projection) PBRTexture pBRTexture = PBRTexture.Create(texInfo, normal, imageryService.ComputeUVMap(hMap, texInfo)); hMap = hMap.ReprojectTo(4326, v_outSrid); hMap = hMap.CenterOnOrigin().ZScale(Z_FACTOR); //======================= //======================= // MESH 3D terrain List <MeshPrimitive> meshes = new List <MeshPrimitive>(); // generate mesh with texture MeshPrimitive triangleMesh; if (useTIN) { Console.WriteLine("Create TIN..."); //triangleMesh = GenerateTIN(hMapTIN, glTF, pBRTexture); triangleMesh = TINGeneration.GenerateTIN(hMap, 10d, glTF, pBRTexture, v_outSrid); } else { Console.WriteLine("GenerateTriangleMesh..."); triangleMesh = glTF.GenerateTriangleMesh_Boxed(hMap); } meshes.Add(triangleMesh); // model export Console.WriteLine("GenerateModel..."); Model model = glTF.GenerateModel(meshes, this.GetType().Name); glTF.Export(model, outputDir, $"{GetType().Name} NONormal", false, true); }
public void Run(DEMDataSet dataset, bool withTexture = true) { try { //_rasterService.GenerateDirectoryMetadata(dataset, false); Stopwatch sw = Stopwatch.StartNew(); string modelName = $"Montagne Sainte Victoire {dataset.Name}"; string outputDir = Directory.GetCurrentDirectory(); ImageryProvider provider = ImageryProvider.MapBoxSatelliteStreet;// new TileDebugProvider(new GeoPoint(43.5,5.5)); // You can get your boox from https://geojson.net/ (save as WKT) string bboxWKT = "POLYGON((5.54888 43.519525, 5.61209 43.519525, 5.61209 43.565225, 5.54888 43.565225, 5.54888 43.519525))"; // string bboxWKT = // "POLYGON((5.594457381483949 43.545276557046044,5.652135604140199 43.545276557046044,5.652135604140199 43.52038635099936,5.594457381483949 43.52038635099936,5.594457381483949 43.545276557046044))"; // _logger.LogInformation($"Processing model {modelName}..."); // // // _logger.LogInformation($"Getting bounding box geometry..."); var bbox = GeometryService.GetBoundingBox(bboxWKT); //var bbox = new BoundingBox(5.5613898348431485,5.597185285307553,43.49372969433046,43.50939068558466); _logger.LogInformation($"Getting height map data..."); var heightMap = _elevationService.GetHeightMap(ref bbox, dataset); _logger.LogInformation($"Processing height map data ({heightMap.Count} coordinates)..."); heightMap = heightMap .ReprojectGeodeticToCartesian() // Reproject to 3857 (useful to get coordinates in meters) .ZScale(2f); // Elevation exageration //======================= // Textures // PBRTexture pbrTexture = null; if (withTexture) { Console.WriteLine("Download image tiles..."); TileRange tiles = _imageryService.DownloadTiles(bbox, provider, TEXTURE_TILES); string fileName = Path.Combine(outputDir, "Texture.jpg"); Console.WriteLine("Construct texture..."); 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(heightMap, outputDir); pbrTexture = PBRTexture.Create(texInfo, normalMap); //hMap = hMap.CenterOnOrigin(Z_FACTOR); // //======================= } // Triangulate height map // and add base and sides _logger.LogInformation($"Triangulating height map and generating 3D mesh..."); var model = _sharpGltfService.CreateTerrainMesh(heightMap, pbrTexture); model.SaveGLB(Path.Combine(Directory.GetCurrentDirectory(), modelName + ".glb")); model = _sharpGltfService.CreateTerrainMesh(heightMap, GenOptions.Normals | GenOptions.BoxedBaseElevationMin); model.SaveGLB(Path.Combine(Directory.GetCurrentDirectory(), modelName + "_normalsBox.glb")); _logger.LogInformation($"Model exported as {Path.Combine(Directory.GetCurrentDirectory(), modelName + ".gltf")} and .glb"); _logger.LogInformation($"Done in {sw.Elapsed:g}"); } 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); } }