private void PopulateGeoTiffDictionary(GeoTiffDictionary dictionary, FileMetadata mainTile, IGeoTiffService geoTiffService, IEnumerable <FileMetadata> fileMetadataList) { // Add main tile if (!dictionary.ContainsKey(mainTile)) { dictionary[mainTile] = geoTiffService.OpenFile(mainTile.Filename); } foreach (var fileMetadata in fileMetadataList) { if (!dictionary.ContainsKey(fileMetadata)) { dictionary[fileMetadata] = geoTiffService.OpenFile(fileMetadata.Filename); } } }
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>(); foreach (FileMetadata metadata in bboxMetadata) { using (IGeoTiff geoTiff = _IGeoTiffService.OpenFile(metadata.Filename)) { tilesHeightMap.Add(geoTiff.ParseGeoDataInBBox(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.Mininum = tilesHeightMap.Min(hmap => hmap.Mininum); heightMap.Maximum = tilesHeightMap.Min(hmap => hmap.Maximum); Debug.Assert(heightMap.Count == tilesHeightMap.Sum(h => h.Count)); return(heightMap); }