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