10 自定义Tile系统
本篇将介绍如何建立自己的Tile系统,并在Bing Maps中使用。
这里的Tile数据是使用MapCruncher工具获得,具体使用请参看:http://www.cnblogs.com/xwgli/archive/2013/04/27/3046166.html
在获得Tile数据后,就可以开始了。因为自定义的Tile系统是使用的Bing Maps Tile System,所以抛开Tile系统的基础原理(有关Bing Maps Tile System 可参考:http://www.cnblogs.com/xwgli/archive/2013/04/12/3016345.html),需要做的就是一个可以根据请求返回相应Tile的处理页面。
1、添加文件。
这里就直接利用之前项目所在的Web应用程序进行开发。首先将生成好的Tile数据复制到网站目录下,这里就存在根目录\Layers\ChinaLayer中,以便以后可以添加更多Tile数据。然后新建一个一般处理程序:GetTile.ashx,用于处理对Tile的请求。完成后最终目录如下图:
蓝色选中的就是新添加的ChinaLayer和GetTile.ashx。
2、GetTile.ashx
1)定义请求的路径格式:
/// <summary> /// 请求路径格式:http://{0}/GetTile.ashx?type={1}&format={2}&quadkey={3} /// (0:服务器地址;1:地图类型[china];2:图片格式[png];3:请求瓦片的quadkey;) /// </summary> public class GetTile : IHttpHandler { }
通过向GetTile.ashx传递3个参数来确定请求的Tile。
2)在ProcessRequest中处理参数并返回结果:
public void ProcessRequest(HttpContext context) { //获取请求参数 string type = context.Request["type"]; string format = context.Request["format"]; //检查地图类型 switch (type) { case "china": { //检查地图格式 if (format != "png") goto default; //返回png格式的地图瓦片 context.Response.ContentType = "image/png"; //获取地图瓦片参数 string quadkey, fileName; //检查参数的有效性 quadkey = context.Request["quadkey"]; //拼接文件名 fileName = quadkey + ".png"; //获取服务器路径 string ImgPath = context.Server.MapPath("~/Layers/ChinaLayer/" + fileName); //检查是否存在瓦片 if (File.Exists(ImgPath)) { //返回相应的瓦片数据 context.Response.WriteFile(ImgPath); return; } //出错跳至default goto default; } default: //默认返回无图片 context.Response.Clear(); context.Response.Close(); return; } }
这只是一个简单的解决方案,只是为了实现功能,没有考虑其他内容,所以实际应用时请根据需要来具体的进行优化。
到此,自定义的Tile System就完成了,下面就是在Bing Maps控件中的使用。
3、创建TileSource
/// <summary> /// 中国地图的Tile系统 /// </summary> public class ChinaTileSource : LocationRectTileSource { public ChinaTileSource() { string server = "localhost:58591"; //设定瓦片源Tile系统的Uri格式,其中的{quadkey}就是每个瓦片quadkey的对应位置 //这里使用的是刚刚自定义切片产生的地图的Tile系统 UriFormat = string.Format("http://{0}/GetTile.ashx?type=china&format=png&quadkey={quadkey}", server); } }
注:这里直接使用的开发服务器地址作为Tile系统的地址,实际使用时可根据实际需要灵活定制服务器地址。
(可参考:http://www.cnblogs.com/xwgli/archive/2013/04/27/3046927.html,使用参数动态定制服务器地址。)
4、使用TileSource
使用的时候既可以自定义一个MapMode出来专门使用,也可以直接在其它MapMode上进行图层的叠加,这里就直接新建一个MapMode来承载这个TileSource:
/// <summary> /// 中国地图模式2 /// </summary> public class ChinaMode2 : CustomModeBase { public ChinaMode2() { //初始化中国地图瓦片源 ChinaTileSource TileSource = new ChinaTileSource(); //向瓦片图层添加瓦片源 base.TileLayer.TileSources.Add(TileSource); //向地图添加限制范围 base.LatitudeRange = new Range<double>(0, 50); base.LongitudeRange = new Range<double>(70, 140); base.MapZoomRange = new Range<double>(1, 5); } }
然后在工具栏上添加一个该模式按钮:
ChangeMapModeButton btnChina2 = new ChangeMapModeButton(new ChinaMode2(), "中国地图2", "中国地图2模式"); navBar.HorizontalPanel.Children.Add(btnChina2);
最终效果: