zoukankan      html  css  js  c++  java
  • 学习使用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

     


    输了你,赢了世界又如何...
  • 相关阅读:
    Higher-Order Functions and Lambdas
    dispatch_sync:As an optimization, this function invokes the block on the current thread when possible
    为什么使用dispatch_sync
    如何安全使用dispatch_sync
    dispatch_sync
    Dispatch Queues and Thread Safety
    高阶函数-参数与返回值
    In Swift, typedef is called typealias:
    偏函数应用(Partial Application)和函数柯里化(Currying)
    Centos下添加用户到用户组
  • 原文地址:https://www.cnblogs.com/xwgli/p/3046711.html
Copyright © 2011-2022 走看看