Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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))));
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }