Beispiel #1
0
        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);
        }