BruTile介绍
BruTile是一个针对.NET Standard 2.0的库,用于访问OpenStreetMap和Bing等瓦片服务。这类服务存储了特定区域不同详细级别的预渲染瓦片。BruTile帮助确定在地图的特定视口下需要获取哪些瓦片。
BruTile提供原始图像流形式的瓦片,并不依赖于特定的客户端平台。它本身并不显示这些瓦片,你需要使用如SharpMap、ArcBruTile或Mapsui这样的映射库,或者编写自定义代码来展示瓦片。
BruTile的功能包括:
- 协助构建瓦片源对象,该对象包含关于瓦片服务的所有信息。
- 根据地图范围和地图分辨率(像素单位)计算所需瓦片。
- 帮助获取这些瓦片。
BruTile是.NET Standard库
BruTile V4 包括两个支持.NET Standard 2.0的NuGet包:
库名 | 目标框架 |
---|---|
BruTile | .NET Standard 2.0 |
BruTile.MbTiles | .NET Standard 2.0 |
- 对.NET Framework 4.5的支持已被移除(示例和测试也已迁移到.NET Core)。
- BruTile.Desktop和BruTile.Desktop.DbCache已被删除,其内容已移动到BruTile NuGet包中。
演示
要查看各种数据源的演示,请下载源代码并在样例文件夹中运行BruTile.Demo。
开始使用
1) 创建应用并添加BruTile NuGet包
在Visual Studio中创建一个.NET控制台应用程序。然后通过Visual Studio的NuGet包管理工具或从包管理器控制台安装BruTile包:
PM> install-package BruTile
2) 创建瓦片源
// 这是一个创建OpenStreetMap瓦片源的例子:
var tileSource = new HttpTileSource(new GlobalSphericalMercator(0, 18),
"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
new[] {"a", "b", "c"}, "OSM");
3) 计算所需的瓦片
// 可以假设可视地图范围会发生变化,但让我们先用整个世界为例
var extent = new Extent(-20037508, -20037508, 20037508, 20037508);
var screenWidthInPixels = 400; // 映射在屏幕上的宽度(像素)
var resolution = extent.Width / screenWidthInPixels;
var tileInfos = tileSource.Schema.GetTileInfos(extent, resolution);
4) 从服务中获取瓦片
Console.WriteLine("显示瓷砖信息");
foreach (var tileInfo in tileInfos)
{
var tile = await tileSource.GetTileAsync(tileInfo);
Console.WriteLine(
$"瓦片列:{tileInfo.Index.Col}, " +
$"瓦片行:{tileInfo.Index.Row}, " +
$"瓦片级别:{tileInfo.Index.Level} , " +
$"瓦片大小:{tile.Length}");
}
输出:
瓦片列:0, 瓦片行:0, 瓦片级别:1 , 瓦片大小:11276
瓦片列:0, 瓦片行:1, 瓦片级别:1 , 瓦片大小:3260
瓦片列:1, 瓦片行:0, 瓦片级别:1 , 瓦片大小:10679
瓦片列:1, 瓦片行:1, 瓦片级别:1 , 瓦片大小:4009
5) 尝试一些已知的瓦片源
// 你可以使用一行语句轻松为多个预定义的瓦片服务器创建ITileSource:
var tileSource1 = KnownTileSources.Create(); // 默认为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);
预定义的瓦片源定义在一个文件中。查看这个文件链接,了解如何创建任何瓦片源。
6) 使用MBTiles(用于存储在设备上的瓦片数据的SQLite格式)
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($"这是一个从MBTiles加载的图像文件字节数组,大小为:{mbTilesTile.Length}");
输出:
这是一个从MBTiles加载的图像文件字节数组,大小为:27412
上述代码可在本仓库样例文件夹中的BruTile.GettingStarted找到。
支持的瓦片服务协议:
发展路线图
- 当前我们的主要关注点是稳定性。
使用BruTile的项目
- ArcBruTile —— ArcGIS插件
- SharpMap —— 地理信息系统库
- Mapsui —— 适用于Xamarin.Android、Xamarin.iOS、UWP和WPF的地图组件
- DotSpatial —— 用于HydroDesktop的GIS库