public HeightMap GetHeightMap(BoundingBox bbox, DEMDataSet dataSet) { DownloadMissingFiles(dataSet, bbox); // Locate which files are needed // Find files matching coords List <FileMetadata> bboxMetadata = GetCoveringFiles(bbox, dataSet); if (bboxMetadata.Count == 0) { string errorMessage = $"Dataset {dataSet.Name} has no coverage for provided bounding box."; this._logger.LogWarning(errorMessage); throw new Exception(errorMessage); } else { // Check if bounding box is fully covered (will result in invalid models without any error being thrown) bool covered = this.IsBoundingBoxCovered(bbox, bboxMetadata.Select(m => m.BoundingBox)); if (!covered) { const string errorMessage = "Bounding box is partially covered by DEM dataset. Heightmap in its current state supports only full data tiles."; this._logger.LogWarning(errorMessage); throw new Exception(errorMessage); } else { // get height map for each file at bbox List <HeightMap> tilesHeightMap = new List <HeightMap>(bboxMetadata.Count); foreach (FileMetadata metadata in bboxMetadata) { using (IRasterFile raster = _IRasterService.OpenFile(metadata.Filename, dataSet.FileFormat)) { tilesHeightMap.Add(raster.GetHeightMapInBBox(bbox, metadata, NO_DATA_OUT)); } } // Merge height maps int totalHeight = tilesHeightMap.GroupBy(h => h.BoundingBox.xMin).Select(g => g.Sum(v => v.Height)).First(); int totalWidth = tilesHeightMap.GroupBy(h => h.BoundingBox.yMin).Select(g => g.Sum(v => v.Width)).First(); HeightMap heightMap = new HeightMap(totalWidth, totalHeight); heightMap.BoundingBox = new BoundingBox(xmin: tilesHeightMap.Min(h => h.BoundingBox.xMin) , xmax: tilesHeightMap.Max(h => h.BoundingBox.xMax) , ymin: tilesHeightMap.Min(h => h.BoundingBox.yMin) , ymax: tilesHeightMap.Max(h => h.BoundingBox.yMax)); heightMap.Coordinates = tilesHeightMap.SelectMany(hmap => hmap.Coordinates).Sort(); heightMap.Count = totalWidth * totalHeight; heightMap.Minimum = tilesHeightMap.Min(hmap => hmap.Minimum); heightMap.Maximum = tilesHeightMap.Max(hmap => hmap.Maximum); System.Diagnostics.Debug.Assert(heightMap.Count == tilesHeightMap.Sum(h => h.Count)); return(heightMap); } } }
public HeightMap GetHeightMap(BoundingBox bbox, string rasterFilePath, DEMFileFormat format) { HeightMap heightMap = null; using (IRasterFile raster = _IRasterService.OpenFile(rasterFilePath, format)) { var metaData = raster.ParseMetaData(); heightMap = raster.GetHeightMapInBBox(bbox, metaData, NO_DATA_OUT); } return(heightMap); }
public HeightMap GetHeightMap(BoundingBox bbox, DEMDataSet dataSet) { DownloadMissingFiles(dataSet, bbox); // Locate which files are needed // Find files matching coords List <FileMetadata> bboxMetadata = GetCoveringFiles(bbox, dataSet); // get height map for each file at bbox List <HeightMap> tilesHeightMap = new List <HeightMap>(bboxMetadata.Count); foreach (FileMetadata metadata in bboxMetadata) { using (IRasterFile raster = _IRasterService.OpenFile(metadata.Filename, dataSet.FileFormat)) { tilesHeightMap.Add(raster.GetHeightMapInBBox(bbox, metadata, NO_DATA_OUT)); } } // Merge height maps int totalHeight = tilesHeightMap.GroupBy(h => h.BoundingBox.xMin).Select(g => g.Sum(v => v.Height)).First(); int totalWidth = tilesHeightMap.GroupBy(h => h.BoundingBox.yMin).Select(g => g.Sum(v => v.Width)).First(); HeightMap heightMap = new HeightMap(totalWidth, totalHeight); heightMap.BoundingBox = new BoundingBox(xmin: tilesHeightMap.Min(h => h.BoundingBox.xMin) , xmax: tilesHeightMap.Max(h => h.BoundingBox.xMax) , ymin: tilesHeightMap.Min(h => h.BoundingBox.yMin) , ymax: tilesHeightMap.Max(h => h.BoundingBox.yMax)); heightMap.Coordinates = tilesHeightMap.SelectMany(hmap => hmap.Coordinates).Sort(); heightMap.Count = totalWidth * totalHeight; heightMap.Minimum = tilesHeightMap.Min(hmap => hmap.Minimum); heightMap.Maximum = tilesHeightMap.Max(hmap => hmap.Maximum); System.Diagnostics.Debug.Assert(heightMap.Count == tilesHeightMap.Sum(h => h.Count)); return(heightMap); }