https://github.com/BruTile/BruTile
BruTile is a .NET library to access tile services like those of OpenStreetMap, MapBox or GeodanMaps.
https://github.com/BruTile/BruTile
brutile map mapping osm tiling tms wms wmts
Last synced: 4 days ago
JSON representation
BruTile is a .NET library to access tile services like those of OpenStreetMap, MapBox or GeodanMaps.
- Host: GitHub
- URL: https://github.com/BruTile/BruTile
- Owner: BruTile
- License: apache-2.0
- Created: 2014-10-17T15:43:32.000Z (about 11 years ago)
- Default Branch: master
- Last Pushed: 2025-10-27T11:21:14.000Z (24 days ago)
- Last Synced: 2025-10-27T13:11:46.039Z (24 days ago)
- Topics: brutile, map, mapping, osm, tiling, tms, wms, wmts
- Language: C#
- Homepage:
- Size: 34 MB
- Stars: 360
- Watchers: 29
- Forks: 121
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: license.txt
Awesome Lists containing this project
- Awesome-Geospatial - BruTile - BruTile is a .NET library to access tile services like those of OpenStreetMap, MapBox or GeodanMaps. (C Sharp)
- awesome-gis - BruTile - BruTile is a .NET library to access tile services like those of OpenStreetMap, MapBox or GeodanMaps. (Geospatial Library / C Sharp)
README
| | Status |
| ------------- |:-------------:|
| Build | [](https://github.com/BruTile/BruTile/actions/workflows/build.yml?query=branch%3Amaster) |
| NuGet BruTile | [](https://www.nuget.org/packages/BruTile/) |
| NuGet BruTile.MbTiles | [](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. Add 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)