Example #1
0
        public IList <TileInfo> GetTilesWanted(ITileSchema schema, Extent extent, string levelId)
        {
            IList <TileInfo> infos = new List <TileInfo>();
            // Iterating through all levels from current to zero. If lower levels are
            // not availeble the renderer can fall back on higher level tiles.
            var resolution = schema.Resolutions[levelId].UnitsPerPixel;
            var levels     = schema.Resolutions.Where(k => resolution <= k.Value.UnitsPerPixel).OrderByDescending(x => x.Value.UnitsPerPixel);

            //var levelCount = levels.Count();
            foreach (var level in levels)
            {
                var tileInfos = schema.GetTilesInView(extent, level.Key);
                tileInfos = SortByPriority(tileInfos, extent.CenterX, extent.CenterY);

                //var count = infosOfLevel.Count();
                foreach (var info in tileInfos)
                {
                    if ((info.Index.Row >= 0) && (info.Index.Col >= 0))
                    {
                        infos.Add(info);
                    }
                }
            }

            return(infos);
        }
Example #2
0
        public IList <TileInfo> GetTilesWanted(ITileSchema schema, Extent extent, int level)
        {
            //line below only works properly of this instance is always called with the the resolutions. Think of something better
            if (preFetchLayers == null)
            {
                preFetchLayers = GetPreFetchLevels(0, schema.Resolutions.Count - 1);
            }

            IList <TileInfo> infos = new List <TileInfo>();

            // Iterating through all levels from current to zero. If lower levels are
            // not availeble the renderer can fall back on higher level tiles.
            while (level >= 0)
            {
                ////////if (!preFetchLayers.Contains(level)) continue;
                var infosOfLevel = schema.GetTilesInView(extent, level);
                infosOfLevel = PrioritizeTiles(infosOfLevel, extent.CenterX, extent.CenterY);

                foreach (TileInfo info in infosOfLevel)
                {
                    if ((info.Index.Row >= 0) && (info.Index.Col >= 0))
                    {
                        infos.Add(info);
                    }
                }
                level--;
            }

            return(infos);
        }
        private static void RenderTile(WriteableBitmap bitmap, ITileSchema schema, IViewport viewport, MemoryCache<Feature> memoryCache)
        {
            int level = BruTile.Utilities.GetNearestLevel(schema.Resolutions, viewport.Resolution);
            var tiles = schema.GetTilesInView(viewport.Extent.ToExtent(), level);

            foreach (TileInfo tile in tiles)
            {
                var p = NativeCache.Find(tile.Index);
                if (p != null)
                {
                    bitmap.Render(p, null);
                    continue;
                }

                var image = memoryCache.Find(tile.Index);

                if (image != null)
                {
                    Rect dest = WorldToView(tile.Extent, viewport);
                    dest = GeometryRenderer.RoundToPixel(dest);

                    //See here the clumsy way to write a bitmap in SL/WPF
                    var path = new System.Windows.Shapes.Path();
                    path.Data = new RectangleGeometry { Rect = dest };
                    var bitmapImage = new BitmapImage();
                    bitmapImage.SetSource(((IRaster)image.Geometry).Data);
                    path.Fill = new ImageBrush { ImageSource = bitmapImage };
                    path.CacheMode = new BitmapCache();
                    bitmap.Render(path, null);
                }
            }
        }
Example #4
0
        public static void SelectRecursive(IDictionary <TileIndex, Tile <T> > selection, ITileCache <Tile <T> > cache, ITileSchema schema, Extent extent, int level)
        {
            if (level < 0)
            {
                return;
            }

            var tiles = schema.GetTilesInView(extent, level);

            foreach (TileInfo tileInfo in tiles)
            {
                var tile = cache.Find(tileInfo.Index);
                if (tile == null)
                {
                    SelectRecursive(selection, cache, schema, tileInfo.Extent.Intersect(extent), level - 1);
                }
                else
                {
                    selection[tileInfo.Index] = tile;
                    // If a tile is still semi transparent then select the higher level to show underneath the
                    // semi transparent one.
                    if (IsSemiTransparent(tile))
                    {
                        SelectRecursive(selection, cache, schema, tileInfo.Extent.Intersect(extent), level - 1);
                    }
                }
            }
        }
Example #5
0
        public static void GetRecursive(IDictionary <TileIndex, IFeature> resultTiles, ITileSchema schema, MemoryCache <Feature> cache, Extent extent, int level)
        {
            if (level < 0)
            {
                return;
            }

            var tiles = schema.GetTilesInView(extent, level);

            foreach (TileInfo tileInfo in tiles)
            {
                var feature = cache.Find(tileInfo.Index);
                if (feature == null)
                {
                    GetRecursive(resultTiles, schema, cache, tileInfo.Extent.Intersect(extent), level - 1);
                }
                else
                {
                    resultTiles[tileInfo.Index] = feature;
                    if (!IsFullyShown(feature))
                    {
                        GetRecursive(resultTiles, schema, cache, tileInfo.Extent.Intersect(extent), level - 1);
                    }
                }
            }
        }
Example #6
0
        private void Form1_Load(object sender, EventArgs e)
        {
            MapTransform mapTransform = new MapTransform(new PointF(0, 0), 50000f, this.Width, this.Height);

            // Here we use a tile schema that is defined in code. There are a few predefined
            // tile schemas in the BruTile.dll. In the usual case the schema should be parsed
            // from a tile service description.
            ITileSchema schema = CreateTileSchema();

            int level = Utilities.GetNearestLevel(schema.Resolutions, mapTransform.Resolution);
            IList <TileInfo> infos = schema.GetTilesInView(mapTransform.Extent, level);

            IRequest requestBuilder = new TmsRequest(new Uri("http://a.tile.openstreetmap.org"), "png");

            Graphics graphics = Graphics.FromImage(buffer);

            foreach (TileInfo info in infos)
            {
                Uri        url    = requestBuilder.GetUri(info);
                byte[]     bytes  = RequestHelper.FetchImage(url);
                Bitmap     bitmap = new Bitmap(new MemoryStream(bytes));
                RectangleF extent = mapTransform.WorldToMap(info.Extent.MinX, info.Extent.MinY, info.Extent.MaxX, info.Extent.MaxY);
                extent = DrawTile(schema, graphics, bitmap, extent);
            }

            this.Invalidate();
        }
Example #7
0
        private static void DrawRecursive(WriteableBitmap targetBitmap, ITileSchema schema, IViewport viewport, MemoryCache <Feature> memoryCache, Extent extent, int level, double opacity)
        {
            var tileInfos = schema.GetTilesInView(extent, level);

            foreach (TileInfo tile in tileInfos)
            {
                var feature = memoryCache.Find(tile.Index);
                if (feature == null)
                {
                    if (level > 0)
                    {
                        DrawRecursive(targetBitmap, schema, viewport, memoryCache, tile.Extent.Intersect(extent), level - 1, opacity);
                    }
                }
                else
                {
                    if (!feature.RenderedGeometry.Keys.Contains(new VectorStyle()))
                    {
                        var  image  = ((IRaster)feature.Geometry).Data;
                        var  bitmap = LoadBitmap(image);
                        Rect dest   = WorldToView(tile.Extent, viewport);
                        DrawImage(targetBitmap, bitmap, dest, tile, memoryCache, opacity);
                        feature.RenderedGeometry[new VectorStyle()] = bitmap;
                    }
                    else // position
                    {
                        var  bitmap = (WriteableBitmap)feature.RenderedGeometry[new VectorStyle()];
                        Rect dest   = WorldToView(tile.Extent, viewport);
                        DrawImage(targetBitmap, bitmap, dest, tile, memoryCache, opacity);
                    }
                }
            }
        }
Example #8
0
        private static void GetRecursive(IDictionary <TileIndex, IFeature> resultTiles, ITileSchema schema,
                                         ITileCache <Feature> cache, Extent extent, IList <KeyValuePair <string, Resolution> > resolutions, int resolutionIndex)
        {
            if (resolutionIndex < 0 || resolutionIndex >= resolutions.Count)
            {
                return;
            }

            var tiles = schema.GetTilesInView(extent, resolutions[resolutionIndex].Key);

            foreach (var tileInfo in tiles)
            {
                var feature = cache.Find(tileInfo.Index);

                if (feature == null)
                {
                    // only continue the recursive search if this tile is within the extent
                    if (tileInfo.Extent.Intersects(extent))
                    {
                        GetRecursive(resultTiles, schema, cache, tileInfo.Extent.Intersect(extent), resolutions, resolutionIndex - 1);
                    }
                }
                else
                {
                    resultTiles[tileInfo.Index] = feature;
                }
            }
        }
        private static void DrawRecursive(Graphics graphics, ITileSchema schema, IViewport viewport, 
            MemoryCache<Feature> cache, Extent extent, int level)
        {
            var tileInfos = schema.GetTilesInView(extent, level);

            foreach (TileInfo info in tileInfos)
            {
                var feature = cache.Find(info.Index);
                if (feature == null)
                {
                    if (level > 0) DrawRecursive(graphics, schema, viewport, cache, info.Extent.Intersect(extent), level - 1);
                }
                else
                {
                    var image = ((IRaster)feature.Geometry).Data;
                    RectangleF dest = WorldToView(info.Extent, viewport);
                    dest = RoundToPixel(dest);
                    RectangleF clip = WorldToView(extent, viewport);
                    clip = RoundToPixel(clip);

                    if (!Contains(clip, dest))
                    {
                        clip = Intersect(clip, dest);
                        if (clip.IsEmpty) continue;
                        DrawImage(graphics, new Bitmap(image), dest, clip);
                    }
                    else
                    {
                        //Not using a clip at all sometimes performs better than using screenwide clip.
                        DrawImage(graphics, new Bitmap(image), dest);
                    }
                }
            }
        }
        /// <summary>
        /// Renders the layer
        /// </summary>
        /// <param name="g">Graphics object reference</param>
        /// <param name="map">Map which is rendered</param>
        public override void OnRender(System.Drawing.Graphics g, IMap map)
        {
            MapTransform mapTransform = new MapTransform(new PointF((float)Map.Center.X, (float)Map.Center.Y), (float)Map.PixelSize, Map.Image.Width, Map.Image.Height);

            int level = BruTile.Utilities.GetNearestLevel(schema.Resolutions, Map.PixelSize);

            IList <TileInfo> tileInfos = schema.GetTilesInView(mapTransform.Extent, level);

            IRequest requestBuilder = new TmsRequest(new Uri("http://a.tile.openstreetmap.org"), "png");

            var graphics = Graphics.FromImage(Image);

            //log.DebugFormat("Downloading tiles:");
            foreach (var tileInfo in tileInfos)
            {
                var bytes = cache.Find(tileInfo.Index);

                if (bytes == default(byte[]))
                {
                    try
                    {
                        //log.DebugFormat("row: {0}, column: {1}, level: {2}", tileInfo.Index.Row, tileInfo.Index.Col, tileInfo.Index.Level);
                        var url = requestBuilder.GetUri(tileInfo);
                        bytes = FetchImage(url);
                        cache.Add(tileInfo.Index, bytes);
                    }
                    catch (WebException e)
                    {
                        //log once per 45 seconds max
                        if ((DateTime.Now - lastErrorLogged) > TimeSpan.FromSeconds(45))
                        {
                            log.Error("Can't fetch tiles from the server", e);
                            lastErrorLogged = DateTime.Now;
                        }
                    }
                }
                else
                {
                    //log.DebugFormat("row: {0}, column: {1}, level: {2} (cached)", tileInfo.Index.Row, tileInfo.Index.Col, tileInfo.Index.Level);
                }

                if (bytes == null)
                {
                    continue;
                }
                using (var bitmap = new Bitmap(new MemoryStream(bytes)))
                {
                    var rectangle = mapTransform.WorldToMap(tileInfo.Extent.MinX, tileInfo.Extent.MinY,
                                                            tileInfo.Extent.MaxX, tileInfo.Extent.MaxY);
                    DrawTile(schema, graphics, bitmap, rectangle);
                }
            }
        }
Example #11
0
        /// <summary>
        /// Renders the layer
        /// </summary>
        /// <param name="g">Graphics object reference</param>
        /// <param name="map">Map which is rendered</param>
        public override void OnRender(System.Drawing.Graphics g, Map map)
        {
            MapTransform mapTransform = new MapTransform(new PointF((float)Map.Center.X, (float)Map.Center.Y), (float)Map.PixelSize, Map.Image.Width, Map.Image.Height);

            int level = BruTile.Utilities.GetNearestLevel(schema.Resolutions, Map.PixelSize);

            IList <TileInfo> tileInfos = schema.GetTilesInView(mapTransform.Extent, level);

            IRequest requestBuilder = new BingRequest(BingRequest.UrlBing, string.Empty, MapType.Hybrid);

            var graphics = Graphics.FromImage(Image);

            // log.DebugFormat("Downloading tiles:");
            foreach (var tileInfo in tileInfos)
            {
                var bytes = cache.Find(tileInfo.Index);

                if (bytes == default(byte[]))
                {
                    try
                    {
                        // log.DebugFormat("row: {0}, column: {1}, level: {2}", tileInfo.Index.Row, tileInfo.Index.Col, tileInfo.Index.Level);
                        var url = requestBuilder.GetUri(tileInfo);
                        bytes = RequestHelper.FetchImage(url);
                        cache.Add(tileInfo.Index, bytes);
                    }
                    catch (WebException e)
                    {
                        log.Error("Can't fetch tiles from the server", e);
                    }
                }
                else
                {
                    log.DebugFormat("row: {0}, column: {1}, level: {2} (cached)", tileInfo.Index.Row, tileInfo.Index.Col, tileInfo.Index.Level);
                }

                if (bytes == null)
                {
                    continue;
                }
                using (var bitmap = new Bitmap(new MemoryStream(bytes)))
                {
                    var rectangle = mapTransform.WorldToMap(tileInfo.Extent.MinX, tileInfo.Extent.MinY,
                                                            tileInfo.Extent.MaxX, tileInfo.Extent.MaxY);
                    DrawTile(schema, graphics, bitmap, rectangle);
                }
            }
        }
        public IList <IFeature> GetFeatures(BoundingBox box, double resolution, ITileSchema schema, ITileCache <Feature> memoryCache)
        {
            var tiles  = schema.GetTilesInView(box.ToExtent(), resolution);
            var result = new List <IFeature>();

            foreach (var tileInfo in tiles)
            {
                var feature = memoryCache.Find(tileInfo.Index);

                if (feature != null)
                {
                    result.Add(feature);
                }
            }
            return(result);
        }
Example #13
0
        private List <TileInfo> GetTile()
        {
            Extent          exten    = new Extent(extent[0], extent[2], extent[1], extent[3]);
            int             level1   = int.Parse(levelTextBox1.Text);
            int             level2   = int.Parse(levelTextBox2.Text);
            List <TileInfo> alltiles = new List <TileInfo>();

            for (; level1 <= level2; level1++)
            {
                var tiles = schema.GetTilesInView(exten, level1.ToString());
                if (tiles.Count() > 0)
                {
                    alltiles.AddRange(tiles);
                }
            }

            return(alltiles);
        }
Example #14
0
        public IList<TileInfo> GetTilesWanted(ITileSchema schema, Extent extent, int level)
        {
            IList<TileInfo> infos = new List<TileInfo>();
            // Iterating through all levels from current to zero. If lower levels are
            // not availeble the renderer can fall back on higher level tiles. 
            var levels = schema.Resolutions.Keys.Where(k => k <= level).OrderByDescending(x => x);

            foreach (var lvl in levels)
            {
                var infosOfLevel = schema.GetTilesInView(extent, lvl);
                infosOfLevel = SortByPriority(infosOfLevel, extent.CenterX, extent.CenterY);

                foreach (TileInfo info in infosOfLevel)
                {
                    if ((info.Index.Row >= 0) && (info.Index.Col >= 0)) infos.Add(info);
                }
            }

            return infos;
        }
Example #15
0
        public IList <TileInfo> GetTilesWanted(ITileSchema schema, Extent extent, string levelId)
        {
            var infos = new List <TileInfo>();
            // Iterating through all levels from current to zero. If lower levels are
            // not available the renderer can fall back on higher level tiles.
            var resolution = schema.Resolutions[levelId].UnitsPerPixel;
            var levels     = schema.Resolutions.Where(k => k.Value.UnitsPerPixel >= resolution).OrderBy(x => x.Value.UnitsPerPixel).ToList();

            foreach (var level in levels)
            {
                var tileInfos = schema.GetTilesInView(extent, level.Key).OrderBy(
                    t => Algorithms.Distance(extent.CenterX, extent.CenterY, t.Extent.CenterX, t.Extent.CenterY));

                foreach (TileInfo info in tileInfos.Where(info => (info.Index.Row >= 0) && (info.Index.Col >= 0)))
                {
                    infos.Add(info);
                }
            }

            return(infos);
        }
Example #16
0
        private static void DrawRecursive(Graphics graphics, ITileSchema schema, IViewport viewport,
                                          MemoryCache <Feature> cache, Extent extent, int level)
        {
            var tileInfos = schema.GetTilesInView(extent, level);

            foreach (TileInfo info in tileInfos)
            {
                var feature = cache.Find(info.Index);
                if (feature == null)
                {
                    if (level > 0)
                    {
                        DrawRecursive(graphics, schema, viewport, cache, info.Extent.Intersect(extent), level - 1);
                    }
                }
                else
                {
                    var        image = ((IRaster)feature.Geometry).Data;
                    RectangleF dest  = WorldToView(info.Extent, viewport);
                    dest = RoundToPixel(dest);
                    RectangleF clip = WorldToView(extent, viewport);
                    clip = RoundToPixel(clip);

                    if (!Contains(clip, dest))
                    {
                        clip = Intersect(clip, dest);
                        if (clip.IsEmpty)
                        {
                            continue;
                        }
                        DrawImage(graphics, new Bitmap(image), dest, clip);
                    }
                    else
                    {
                        //Not using a clip at all sometimes performs better than using screenwide clip.
                        DrawImage(graphics, new Bitmap(image), dest);
                    }
                }
            }
        }
Example #17
0
        public IList<TileInfo> GetTilesWanted(ITileSchema schema, Extent extent, string levelId)
        {
            IList<TileInfo> infos = new List<TileInfo>();
            // Iterating through all levels from current to zero. If lower levels are
            // not availeble the renderer can fall back on higher level tiles.
            var resolution = schema.Resolutions[levelId].UnitsPerPixel;
            var levels = schema.Resolutions.Where(k => resolution <= k.Value.UnitsPerPixel).OrderByDescending(x => x.Value.UnitsPerPixel);

            //var levelCount = levels.Count();
            foreach (var level in levels)
            {
                var tileInfos = schema.GetTilesInView(extent, level.Key);
                tileInfos = SortByPriority(tileInfos, extent.CenterX, extent.CenterY);

                //var count = infosOfLevel.Count();
                foreach (var info in tileInfos)
                {
                    if ((info.Index.Row >= 0) && (info.Index.Col >= 0)) infos.Add(info);
                }
            }

            return infos;
        }
Example #18
0
        public IList<TileInfo> GetTilesWanted(ITileSchema schema, Extent extent, int level)
        {
            //line below only works properly of this instance is always called with the the resolutions. Think of something better
            if (preFetchLayers == null) preFetchLayers = GetPreFetchLevels(0, schema.Resolutions.Count - 1);

            IList<TileInfo> infos = new List<TileInfo>();
            // Iterating through all levels from current to zero. If lower levels are
            // not availeble the renderer can fall back on higher level tiles. 
            while (level >= 0)
            {
                ////////if (!preFetchLayers.Contains(level)) continue;
                var infosOfLevel = schema.GetTilesInView(extent, level);
                infosOfLevel = PrioritizeTiles(infosOfLevel, extent.CenterX, extent.CenterY);

                foreach (TileInfo info in infosOfLevel)
                {
                    if ((info.Index.Row >= 0) && (info.Index.Col >= 0)) infos.Add(info);
                }
                level--;
            }

            return infos;
        }
Example #19
0
        public IList <TileInfo> GetTilesWanted(ITileSchema schema, Extent extent, int level)
        {
            IList <TileInfo> infos = new List <TileInfo>();
            // Iterating through all levels from current to zero. If lower levels are
            // not availeble the renderer can fall back on higher level tiles.
            var levels = schema.Resolutions.Keys.Where(k => k <= level).OrderByDescending(x => x);

            foreach (var lvl in levels)
            {
                var infosOfLevel = schema.GetTilesInView(extent, lvl);
                infosOfLevel = SortByPriority(infosOfLevel, extent.CenterX, extent.CenterY);

                foreach (TileInfo info in infosOfLevel)
                {
                    if ((info.Index.Row >= 0) && (info.Index.Col >= 0))
                    {
                        infos.Add(info);
                    }
                }
            }

            return(infos);
        }
Example #20
0
        private static void RenderTile(WriteableBitmap bitmap, ITileSchema schema, IViewport viewport, MemoryCache <Feature> memoryCache)
        {
            int level = BruTile.Utilities.GetNearestLevel(schema.Resolutions, viewport.Resolution);
            var tiles = schema.GetTilesInView(viewport.Extent.ToExtent(), level);

            foreach (TileInfo tile in tiles)
            {
                var p = NativeCache.Find(tile.Index);
                if (p != null)
                {
                    bitmap.Render(p, null);
                    continue;
                }

                var image = memoryCache.Find(tile.Index);

                if (image != null)
                {
                    Rect dest = WorldToView(tile.Extent, viewport);
                    dest = GeometryRenderer.RoundToPixel(dest);

                    //See here the clumsy way to write a bitmap in SL/WPF
                    var path = new System.Windows.Shapes.Path();
                    path.Data = new RectangleGeometry {
                        Rect = dest
                    };
                    var bitmapImage = new BitmapImage();
                    bitmapImage.SetSource(((IRaster)image.Geometry).Data);
                    path.Fill = new ImageBrush {
                        ImageSource = bitmapImage
                    };
                    path.CacheMode = new BitmapCache();
                    bitmap.Render(path, null);
                }
            }
        }
Example #21
0
 public IList <TileInfo> GetTilesWanted(ITileSchema schema, Extent extent, string levelId)
 {
     return(schema.GetTilesInView(extent, (levelId)).ToList());
 }
Example #22
0
 public IList<TileInfo> GetTilesWanted(ITileSchema schema, Extent extent, string levelId)
 {
     return schema.GetTilesInView(extent, (levelId)).ToList();
 }
        public static void GetRecursive(IDictionary<TileIndex, IFeature> resultTiles, ITileSchema schema, MemoryCache<Feature> cache, Extent extent, int level)
        {
            if (level < 0) return;

            var tiles = schema.GetTilesInView(extent, level);

            foreach (TileInfo tileInfo in tiles)
            {
                var feature = cache.Find(tileInfo.Index);
                if (feature == null)
                {
                    GetRecursive(resultTiles, schema, cache, tileInfo.Extent.Intersect(extent), level - 1);
                }
                else
                {
                    resultTiles[tileInfo.Index] = feature;
                    if (!IsFullyShown(feature))
                    {
                        GetRecursive(resultTiles, schema, cache, tileInfo.Extent.Intersect(extent), level - 1);
                    }
                }
            }
        }
Example #24
0
        private static void DrawRecursive(WriteableBitmap targetBitmap, ITileSchema schema, IViewport viewport, MemoryCache<Feature> memoryCache, Extent extent, int level, double opacity)
        {
            var tileInfos = schema.GetTilesInView(extent, level);

            foreach (TileInfo tile in tileInfos)
            {
                var feature = memoryCache.Find(tile.Index);
                if (feature == null)
                {
                    if (level > 0) DrawRecursive(targetBitmap, schema, viewport, memoryCache, tile.Extent.Intersect(extent), level - 1, opacity);
                }
                else
                {
                    if (!feature.RenderedGeometry.Keys.Contains(new VectorStyle()))
                    {
                        var image = ((IRaster)feature.Geometry).Data;
                        var bitmap = LoadBitmap(image);
                        Rect dest = WorldToView(tile.Extent, viewport);
                        DrawImage(targetBitmap, bitmap, dest, tile, memoryCache, opacity);
                        feature.RenderedGeometry[new VectorStyle()] = bitmap;
                    }
                    else // position
                    {
                        var bitmap = (WriteableBitmap)feature.RenderedGeometry[new VectorStyle()];
                        Rect dest = WorldToView(tile.Extent, viewport);
                        DrawImage(targetBitmap, bitmap, dest, tile, memoryCache, opacity);
                    }
                }
            }
        }