private void LocalFetchCompleted(object sender, FetchTileCompletedEventArgs e) { //todo remove object sender try { if (e.Error == null && e.Cancelled == false && _isThreadRunning && e.Image != null) { var feature = new Feature { Geometry = new Raster(new MemoryStream(e.Image), e.TileInfo.Extent.ToBoundingBox()) }; _memoryCache.Add(e.TileInfo.Index, feature); } } catch (Exception ex) { e.Error = ex; } finally { _threadCount--; lock (_tilesInProgress) { if (_tilesInProgress.Contains(e.TileInfo.Index)) { _tilesInProgress.Remove(e.TileInfo.Index); } } _waitHandle.Set(); } DataChanged?.Invoke(this, new DataChangedEventArgs(e.Error, e.Cancelled, e.TileInfo)); }
internal void OnFetchCompleted(FetchTileCompletedEventArgs e) { if (e.Error == null) { // Reenter levels below the current removed level. int indexLevel; if (int.TryParse(e.TileInfo.Index.Level, NumberStyles.Integer, CultureInfo.InvariantCulture, out indexLevel)) { foreach (var removedLevel in Levels(_removedResolutions.Keys)) { if (removedLevel <= indexLevel) { int temp; _removedResolutions.TryRemove(removedLevel.ToString(CultureInfo.InvariantCulture), out temp); } } } } else { var webError = e.Error as WebException; if (webError != null) { var httpResponse = webError.Response as HttpWebResponse; if (httpResponse != null) { if (httpResponse.StatusCode == HttpStatusCode.NotFound) { // Remove resolutions. if (!_removedResolutions.ContainsKey(e.TileInfo.Index.Level)) { _removedResolutions[e.TileInfo.Index.Level] = 1; } else { _removedResolutions[e.TileInfo.Index.Level] += 1; } lock (_lock) { _resolutions = null; } // Force reload. if (ForceReload != null) { ForceReload(this, EventArgs.Empty); } } } } } }
private static Raster CreateTileGeometry(FetchTileCompletedEventArgs e) { // A TileSource may return an byte array that is null. This is currently only implemented // for MbTilesTileSource. It is to indicate that the tile is not present in the source, // although it should be given the tile schema. It does not mean the tile could not // be accessed because of some temporary reason. In that case it will throw an exception. // For Mapsui this is important because it will not try again and again to fetch it. // Here we return the geometry as null so that it will be added to the tile cache. // TileLayer.GetFeatureInView will have to return only the non null geometries. if (e.Image == null) { return(null); } return(new Raster(new MemoryStream(e.Image), e.TileInfo.Extent.ToBoundingBox())); }
private void LocalFetchCompleted(object sender, FetchTileCompletedEventArgs e) { //todo remove object sender try { if (e.Error == null && e.Cancelled == false && isThreadRunning && e.Image != null) { var feature = new Feature() { Geometry = new Raster(new MemoryStream(e.Image), e.TileInfo.Extent.ToBoundingBox()) }; memoryCache.Add(e.TileInfo.Index, feature); } } catch (Exception ex) { e.Error = ex; } finally { threadCount--; lock (tilesInProgress) { if (tilesInProgress.Contains(e.TileInfo.Index)) tilesInProgress.Remove(e.TileInfo.Index); } waitHandle.Set(); } if (DataChanged != null) DataChanged(this, new DataChangedEventArgs(e.Error, e.Cancelled, e.TileInfo)); }