# BruTile **Repository Path**: blitheli/BruTile ## Basic Information - **Project Name**: BruTile - **Description**: No description available - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-02-03 - **Last Updated**: 2025-02-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README | | Status | | ------------- |:-------------:| | Build | [![Build status](https://github.com/brutile/brutile/actions/workflows/build.yml/badge.svg)](https://github.com/BruTile/BruTile/actions/workflows/build.yml?query=branch%3Amaster) | | NuGet BruTile | [![NuGet Status](http://img.shields.io/nuget/v/BruTile.svg?style=flat)](https://www.nuget.org/packages/BruTile/) | | NuGet BruTile.MbTiles | [![NuGet Status](http://img.shields.io/nuget/v/BruTile.MbTiles.svg?style=flat)](https://www.nuget.org/packages/BruTile.MbTiles/) | ### BruTile BruTile is a .NET Standard 2.0 library to access tile services like OpenStreetMap and Bing. Such tile services store pre-rendered tiles for a certain area and for various levels of detail. BruTile helps to determine which tiles to fetch for a certain viewport of a map. BruTile returns tiles as raw image streams and has no dependency on a specific client platform. BruTile does not display those tiles. You need to use a mapping library like SharpMap, ArcBruTile or [Mapsui](https://github.com/Mapsui/Mapsui) or write your own code to display tiles. What BruTile does is: 1. Helps to construct a tile source, an object that has all information about a tile service. 2. Helps to calculate which tiles you need, given a certain map extent and a map resolution (units per pixel). 3. Helps you fetch those tiles. ### BruTile is a .NET Standard library **BruTile V4** consists of 2 nugets that support .NET Standard 2.0. | Library | Targeted Framework | | ------------------------ | --------------------- | | BruTile | .NET Standard 2.0 | | BruTile.MbTiles | .NET Standard 2.0 | - Support for .NET Framework 4.5 has been removed (also the samples and tests have moved to .NET Core). - BruTile.Desktop and BruTile.Desktop.DbCache have been deleted and their content has moved to the BruTile nuget. ### Demo For a demo showing various data sources download the source code and run BruTile.Demo in the Samples folder ## Getting Started ### 1) Create an app and add the BruTile NuGet package Create a .NET Console app in Visual Studio. The the BruTile NuGet package. Use the package manager tools in Visual Studio or add it from the package manager console: ``` PM> install-package BruTile ``` ### 2) Create a tile source ```c# // This is an example that creates the OpenStreetMap tile source: var tileSource = new HttpTileSource(new GlobalSphericalMercator(0, 18), "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", new[] {"a", "b", "c"}, "OSM"); ``` ### 3) Calculate which tiles you need ```c# // the extent of the visible map changes but lets start with the whole world var extent = new Extent(-20037508, -20037508, 20037508, 20037508); var screenWidthInPixels = 400; // The width of the map on screen in pixels var resolution = extent.Width / screenWidthInPixels; var tileInfos = tileSource.Schema.GetTileInfos(extent, resolution); ``` ### 4) Fetch the tiles from the service ```c# Console.WriteLine("Show tile info"); foreach (var tileInfo in tileInfos) { var tile = await tileSource.GetTileAsync(tileInfo); Console.WriteLine( $"tile col: {tileInfo.Index.Col}, " + $"tile row: {tileInfo.Index.Row}, " + $"tile level: {tileInfo.Index.Level} , " + $"tile size {tile.Length}"); } ``` Output: ```console tile col: 0, tile row: 0, tile level: 1 , tile size 11276 tile col: 0, tile row: 1, tile level: 1 , tile size 3260 tile col: 1, tile row: 0, tile level: 1 , tile size 10679 tile col: 1, tile row: 1, tile level: 1 , tile size 4009 ``` ### 5) Try some of the known tile sources ```c# // You can easily create an ITileSource for a number of predefined tile servers // with single line statements like: var tileSource1 = KnownTileSources.Create(); // The default is OpenStreetMap var tileSource2 = KnownTileSources.Create(KnownTileSource.BingAerial); var tileSource3 = KnownTileSources.Create(KnownTileSource.BingHybrid); var tileSource4 = KnownTileSources.Create(KnownTileSource.StamenTonerLite); var tileSource5 = KnownTileSources.Create(KnownTileSource.EsriWorldShadedRelief); ``` The predefined tile sources are defined in a single file. Take a look at that file [here](https://github.com/BruTile/BruTile/blob/master/BruTile/Predefined/KnownTileSources.cs) to learn how you could create any tile source. ### 6) Use MBTiles, the sqlite format for tile data, to work with tiles stored on your device. ```c# var mbtilesTilesource = new MbTilesTileSource(new SQLiteConnectionString("Resources/world.mbtiles", false)); var mbTilesTile = await mbtilesTilesource.GetTileAsync(new TileInfo { Index = new TileIndex(0, 0, 0) }); Console.WriteLine($"This is a byte array of an image file loaded from MBTiles with size: {mbTilesTile.Length}"); ``` Output: ```console This is a byte array of an image file loaded from MBTiles with size: 27412 ``` The above code can also be found in the BruTile sample called BruTile.GettingStarted in the Samples folder of this repository. ### Supported tile service protocols: * [WMTS](http://www.opengeospatial.org/standards/wmts) * [TMS](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification) * [OSM](http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames) (Like TMS with inverted y-axis) * [WMS](http://www.opengeospatial.org/standards/wms) (tiled requests to a regular WMS) * [ArcGIS Tile Server](http://resources.arcgis.com/en/help/rest/apiref/tile.html) * [WMS-C](https://wiki.osgeo.org/wiki/WMS_Tile_Caching#WMS-C_as_WMS_Profile) ### Roadmap - Stability is currently our primary focus. ### Projects that use BruTile * [ArcBruTile](https://bertt.itch.io/arcbrutile) a plugin for ArcGIS * [SharpMap](https://github.com/SharpMap/SharpMap) a GIS library * [Mapsui](https://github.com/Mapsui/Mapsui) a MapComponent for Xamarin.Android. Xamarin.iOS, UWP and WPF * [DotSpatial](https://github.com/DotSpatial/DotSpatial) a GIS library that is used in [HydroDesktop](https://github.com/CUAHSI/HydroDesktop) ### License [Apache 2.0](https://raw.githubusercontent.com/BruTile/BruTile/master/LICENSE.md)