public IEnumerable<IFeature> FetchTiles(BoundingBox boundingBox, double resolution)
{
var extent = new Extent(boundingBox.Min.X, boundingBox.Min.Y, boundingBox.Max.X, boundingBox.Max.Y);
var levelId = BruTile.Utilities.GetNearestLevel(_source.Schema.Resolutions, resolution);
var infos = _source.Schema.GetTileInfos(extent, levelId).ToList();
ICollection<WaitHandle> waitHandles = new List<WaitHandle>();
foreach (TileInfo info in infos)
{
if (_bitmaps.Find(info.Index) != null) continue;
if (_queue.Contains(info.Index)) continue;
var waitHandle = new AutoResetEvent(false);
waitHandles.Add(waitHandle);
_queue.Add(info.Index);
Task.Run(() => GetTileOnThread(new object[] { _source, info, _bitmaps, waitHandle }));
}
WaitHandle.WaitAll(waitHandles.ToArray());
IFeatures features = new Features();
foreach (TileInfo info in infos)
{
byte[] bitmap = _bitmaps.Find(info.Index);
if (bitmap == null) continue;
IRaster raster = new Raster(new MemoryStream(bitmap), new BoundingBox(info.Extent.MinX, info.Extent.MinY, info.Extent.MaxX, info.Extent.MaxY));
IFeature feature = features.New();
feature.Geometry = raster;
features.Add(feature);
}
return features;
}