public override IEnumerable <Primitive2D> Get(float zoomFactor, View2D view) { var result = new List <Primitive2D>(); var viewBox = view.OuterBox; var box = new GeoCoordinateBox(_projection.ToGeoCoordinates(viewBox.Min[0], viewBox.Min[1]), _projection.ToGeoCoordinates(viewBox.Max[0], viewBox.Max[1])); var point = _projection.ToPixel(box.Center.Latitude, box.Center.Longitude); var p = new Icon2D(point[0], point[1], Create("")); p.ToolTip = "Подсказка"; result.Add(p); return(result); }
/// <summary> /// Returns all primitives from this layer visible for the given parameters. /// </summary> /// <param name="zoomFactor"></param> /// <param name="view"></param> /// <returns></returns> public override IEnumerable <Primitive2D> Get(float zoomFactor, View2D view) { var primitives = new List <Primitive2D>(); //if(_suspended) //{ // just return an empty primitives list if suspended. // return primitives; //} try { // calculate the current zoom level. var zoomLevel = (int)System.Math.Round(_projection.ToZoomLevel(zoomFactor), 0); if (zoomLevel >= _minZoomLevel && zoomLevel <= _maxZoomLevel) { // build the bounding box. var viewBox = view.OuterBox; var box = new GeoCoordinateBox(_projection.ToGeoCoordinates(viewBox.Min[0], viewBox.Min[1]), _projection.ToGeoCoordinates(viewBox.Max[0], viewBox.Max[1])); var tileRange = TileRange.CreateAroundBoundingBox(box, zoomLevel); var tileRangeIndex = new TileRangeIndex(tileRange); var primitivePerTile = new Dictionary <Tile, Primitive2D>(); lock (_cache) { Image2D temp; foreach (var tile in _cache) { if (tile.Value.IsVisibleIn(view)) { tileRangeIndex.Add(tile.Key); primitivePerTile.Add(tile.Key, tile.Value); var minZoom = _projection.ToZoomFactor(tile.Key.Zoom - _zoomMinOffset); var maxZoom = _projection.ToZoomFactor(tile.Key.Zoom + (1 - _zoomMinOffset)); if (zoomFactor < maxZoom && zoomFactor > minZoom) { // just hit the cache for tiles of this zoom level. _cache.TryGet(tile.Key, out temp); } } } // set the ascending flag. if (_previousZoomFactor != zoomFactor) { // only change flag when difference. _ascending = (_previousZoomFactor < zoomFactor); _previousZoomFactor = zoomFactor; } // get candidate tiles for every tile. var selectedTiles = new List <Tile>(); foreach (var tile in tileRange) { var best = tileRangeIndex.ChooseBest(tile, _ascending); foreach (var bestTile in best) { if (!selectedTiles.Contains(bestTile)) { // make sure no doubles are added! selectedTiles.Add(bestTile); } } } // sort according to the tiles index. selectedTiles.Sort(delegate(Tile x, Tile y) { return(TileRangeIndex.TileWeight(tileRange.Zoom, x.Zoom, !_ascending).CompareTo( TileRangeIndex.TileWeight(tileRange.Zoom, y.Zoom, !_ascending))); }); selectedTiles.Reverse(); // recursively remove tiles. for (int idx = selectedTiles.Count; idx > 0; idx--) { if (selectedTiles[selectedTiles.Count - idx].IsOverlappedBy( selectedTiles.GetRange(selectedTiles.Count - idx + 1, selectedTiles.Count - (selectedTiles.Count - idx + 1)))) { selectedTiles.RemoveAt(selectedTiles.Count - idx); } } // TODO: trim this collection so that only tiles remain close to the zoom level not overlapping. Image2D primitive; foreach (Tile tile in selectedTiles) { if (_cache.TryPeek(tile, out primitive)) { // add to the primitives list. primitives.Add(primitive); } } } } OsmSharp.Logging.Log.TraceEvent("LayerTile", Logging.TraceEventType.Information, string.Format("LayerTile returned {0} primitives.", primitives.Count)); return(primitives); } catch (Exception ex) { // don't worry about exceptions here. OsmSharp.Logging.Log.TraceEvent("LayerTile", Logging.TraceEventType.Error, ex.Message); } return(primitives); }