学习使用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);

最终效果:

 

你可能感兴趣的:(silverlight)