学习使用Bing Maps Silverlight Control(八):自定义的Tile系统

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的请求。完成后最终目录如下图:

QQ截图20130427111217

蓝色选中的就是新添加的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);

最终效果:

QQ截图20130427113341

 

posted @ 2013-04-27 11:36  不是豆豆  阅读(1105)  评论(0编辑  收藏  举报
友情链接:迷途