private Location3DModelResponse ParseResultCsvLine(string cols, char separator) { string[] values = cols.Split(separator); //pk, pn, lat, lon, link, tilecount_running_total, sketchfab_status , sketchfab_id int index = 0; Location3DModelRequest request = new Location3DModelRequest(); request.Id = values[index++]; request.Title = values[index++].Trim('\"'); request.Latitude = double.Parse(values[index++], CultureInfo.InvariantCulture); request.Longitude = double.Parse(values[index++], CultureInfo.InvariantCulture); request.Description = values[index++]; Location3DModelResponse result = new Location3DModelResponse(); result.Request = request; result.Id = request.Id; result.NumTiles = int.Parse(values[index++]); if (Enum.TryParse <UploadStatus>(values[index++], true, out UploadStatus uploadStatus)) { result.UploadStatus = uploadStatus; } result.UploadedFileId = values[index++]; return(result); }
private Location3DModelRequest ParseRequestCsvLine(string cols, char separator) { string[] values = cols.Split(separator); //pk,pn,lat,lon,link int index = 0; Location3DModelRequest request = new Location3DModelRequest(); request.Id = values[index++]; request.Title = values[index++].Trim('\"'); request.Latitude = double.Parse(values[index++], CultureInfo.InvariantCulture); request.Longitude = double.Parse(values[index++], CultureInfo.InvariantCulture); request.Description = values[index++]; return(request); }
private Dictionary <string, Location3DModelRequest> ParseInputFile(string fileName) { Dictionary <string, Location3DModelRequest> requests = new Dictionary <string, Location3DModelRequest>(); using (StreamReader sr = new StreamReader(fileName, Encoding.UTF8)) { sr.ReadLine(); // skip header do { //pk,pn,lat,lon,link Location3DModelRequest request = ParseRequestCsvLine(sr.ReadLine(), '\t'); requests.Add(request.Id, request); } while (!sr.EndOfStream); } return(requests); }
private string GenerateDescription(Location3DModelSettings settings, Location3DModelRequest request) { List <string> desc = new List <string>(); // Location //desc.Add($"[See on Helladic.info](https://www.google.com/maps/@{request.Latitude:N7},{request.Longitude:N7},13z)"); // Helladic.info desc.Add($"[Helladic.info Link]({request.Description})"); desc.AddRange(settings.Attributions.Select(a => $"{a.Subject}: [{a.Text}]({a.Url})")); desc.Add($"Elevation: [{settings.Dataset.Attribution.Text}]({settings.Dataset.Attribution.Url})"); if (settings.OsmBuildings) { desc.Add("Data: OpenStreetMap and Contributors [www.openstreetmap.org](https://www.openstreetmap.org)"); } desc.Add($"Imagery: [{settings.ImageryProvider.Attribution.Text}]({settings.ImageryProvider.Attribution.Url})"); return(string.Join(Environment.NewLine, desc.Select(d => string.Concat("* ", d)))); }
private Location3DModelResponse Generate3DLocationModel(Location3DModelRequest request, Location3DModelSettings settings) { Location3DModelResponse response = new Location3DModelResponse(); try { bool imageryFailed = false; using (TimeSpanBlock timer = new TimeSpanBlock($"3D model {request.Id}", _logger)) { BoundingBox bbox = GetBoundingBoxAroundLocation(request.Latitude, request.Longitude, settings.SideSizeKm); HeightMap hMap = _elevationService.GetHeightMap(ref bbox, settings.Dataset); var transform = new ModelGenerationTransform(bbox, Reprojection.SRID_PROJECTED_MERCATOR, centerOnOrigin: true, settings.ZScale, centerOnZOrigin: true); response.Attributions.AddRange(settings.Attributions); // will be added to the model response.Attributions.Add(settings.Dataset.Attribution); // will be added to the model PBRTexture pbrTexture = null; if (settings.ImageryProvider != null) { response.Attributions.Add(settings.ImageryProvider.Attribution); // will be added to the model // Imagery TileRange tiles = _imageryService.ComputeBoundingBoxTileRange(bbox, settings.ImageryProvider, settings.MinTilesPerImage); Debug.Assert(tiles.Count < 400); tiles = _imageryService.DownloadTiles(tiles, settings.ImageryProvider); string fileName = Path.Combine(settings.OutputDirectory, $"{request.Id}_Texture.jpg"); TextureInfo texInfo = _imageryService.ConstructTexture(tiles, bbox, fileName, TextureImageFormat.image_jpeg); transform.BoundingBox = bbox; hMap = transform.TransformHeightMap(hMap); //var normalMap = _imageryService.GenerateNormalMap(hMap, settings.OutputDirectory, $"{request.Id}_normalmap.png"); pbrTexture = PBRTexture.Create(texInfo); } // Center on origin //hMap = hMap.CenterOnOrigin(out Matrix4x4 transform).BakeCoordinates(); //response.Origin = new GeoPoint(request.Latitude, request.Longitude).ReprojectTo(Reprojection.SRID_GEODETIC, Reprojection.SRID_PROJECTED_MERCATOR); ModelRoot model = _gltfService.CreateNewModel(); //======================= // Buildings if (settings.OsmBuildings) { model = _sampleOsmProcessor.Run(model, OsmLayer.Buildings, bbox, transform, computeElevations: true, settings.Dataset, settings.DownloadMissingFiles); } if (settings.GenerateTIN) { model = AddTINMesh(model, hMap, 2d, _gltfService, pbrTexture, Reprojection.SRID_PROJECTED_MERCATOR); } else { model = _gltfService.AddTerrainMesh(model, hMap, pbrTexture); } model.Asset.Generator = "DEM Net Elevation API with SharpGLTF"; //model.TryUseExtrasAsList(true).AddRange(response.Attributions); model.SaveGLB(Path.Combine(settings.OutputDirectory, string.Concat(imageryFailed ? "imageryFailed_" : "", settings.ModelFileNameGenerator(settings, request)))); // cleanup //if (pbrTexture != null) //{ // if (pbrTexture.NormalTexture != null) File.Delete(pbrTexture.NormalTexture.FilePath); // File.Delete(pbrTexture.BaseColorTexture.FilePath); //} response.Elapsed = timer.Elapsed; response.NumTiles = pbrTexture.BaseColorTexture.TileCount; } } catch (Exception) { throw; } return(response); }
private UploadModelRequest GetUploadRequest(Location3DModelSettings settings, Location3DModelRequest request) { UploadModelRequest upload = new UploadModelRequest() { Description = GenerateDescription(settings, request),// "TEST",// * Generated by [DEM Net Elevation API](https://elevationapi.com)\n* Helladic test upload", FilePath = Path.Combine(settings.OutputDirectory, settings.ModelFileNameGenerator(settings, request)), IsInspectable = true, IsPrivate = false, IsPublished = true, Name = string.Concat(request.Id, " ", request.Title), Options = new ModelOptions() { Background = SkecthFabEnvironment.Tokyo_Big_Sight, Shading = ShadingType.lit }, Source = "mycenaean-atlas-project_elevationapi", TokenType = TokenType.Token }; return(upload); }