当前位置: 首页 > news >正文

Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图

  OSM(OpenStreetMap-开放街道地图)服务就是一种发布自己地图数据图片为服务的一种实现类型,开放街道地图成立动机在于希望能创造并且提供可以被自由地使用的地理资料(像街道地图)给每个想使用的人,就像自由软体所赋予使用者的自由一样,本篇将介绍如何在Bing Maps Silverlight Control开发中去使用OSM发布的地图服务。
 
   要在Bing Maps Silverlight Control中集成OSM地图是非常简单的,其实无论什么地图都是以地图服务的形式发布出来的,隐藏在其后的都有一套Tile算法,最终在客户端呈现地图则根据具体的Tile映射系统的算法可确定客户端呈现的时候以何种请求的加载出地图数据。实际上要在Bing Maps中集成OSM,也就是通过自定义TileSource来实现,为所需要集成的OSM自定义一个TileSource,专门用于加载此OSM地图数据。关于Bing Maps的TileSystem可查阅我的另一篇博文:《 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)》,里面有对TileSystem的简单应用示例,还有两篇详细介绍Bing Maps的Tile System的博文连接。
 
  在Bing Maps Silverlight Controls开发中,实现自定义的TileSource有多种方式,可以直接继承Bing Maps Silverlight Controls内置的TileSource实现无范围限制的图层加载,也可以继承于LocationRectTileSource类实现定制范围的地图图层加载,这里以LocationRectTileSource为例演示自定义TileSource加载指定范围的OSM( http://www.openstreetmap.org/)地图数据。
public   class  OpenStreetMapTileSource : LocationRectTileSource
{
    
private   const   string  TilePathMapnik  =   @" http://{S}.tile.openstreetmap.org/{Z}/{X}/{Y}.png " ;
    
private   readonly  Random _Rand  =   new  Random();
    
private   readonly   string [] TilePathPrefixes  =   new [] {  " a " " b " " c " " d " " e " " f "  };

    
public  OpenStreetMapTileSource()
        : 
base (TilePathMapnik,
            
new  LocationRect( new  Location( 60 60 ),  new  Location( 13 140 )),
            
new  Range < double > ( 1 17 ))
    { }

    
public   override  Uri GetUri( int  x,  int  y,  int  zoomLevel)
    {
        
string  prefix  =  TilePathPrefixes[_Rand.Next( 6 )];
        
string  url  =   this .UriFormat;
        url 
=  url.Replace( " {S} " , prefix);
        url 
=  url.Replace( " {Z} " , zoomLevel.ToString());
        url 
=  url.Replace( " {X} " , x.ToString());
        url 
=  url.Replace( " {Y} " , y.ToString());

        
return   new  Uri(url);
    }
}
 
  如上代码块就是为OSM( http://www.openstreetmap.org/)地图自定义的TileSource,接下来只需要在程序中制定地图的MapTileLayer的源为该TileSource就能实现加载OSM的地图,实现OSM地图与Bing Maps集成了。
< m:Map  x:Name ="map"  Margin ="0,0,0,0"  CredentialsProvider =" {StaticResource MyCredentials} "  
       ScaleVisibility
="Visible"
       CopyrightVisibility
="Collapsed" >
    
< m:MapTileLayer  x:Name ="OSMTileLayer" ></ m:MapTileLayer >
</ m:Map >
 
  可以通过在XAML中直接给地图(Map)添加一个MapTileLayer,用于加载指定的TileSource的地图,也可以在程序中动态构造MapTileLayer,两种方式实现的效率是一样的。如上代码块是通过直接在XAML代码中加入的MapTileLayer图层,那么可以通过如下方式设置该Tile图层的源,去加载OSM地图。
OSMTileLayer.TileSources.Add( new  OpenStreetMapTileSource());
 
  编译项目运行可以看到成功的将OSM地图集成进了Bing Maps中,详细如下图所示:
        
 
  需要注意的是OSM也有很多种,在自定义OSM的Tile加载算法得时候得根据所要集成的不同OSM地图进行编写,比如下面的自定义加载OSM地图的TileSource定义:
///   <summary>
///  自定义OSM地图服务的TileSource
///   </summary>
public   class  OSMTileSource : LocationRectTileSource
{
    
public  OSMTileSource()
        : 
base ( @" http://az1923.vo.msecnd.net/osm/{2}/{0}/{1}.png " ,
            
new  LocationRect( new  Location( - 19.047 47.379 ),  new  Location( - 18.733 47.645 )),
            
new  Range < double > ( 1 17 ))
    {
        
    }

    
///   <summary>
    
///  重写Tile算法
    
///   </summary>
    
///   <param name="x"></param>
    
///   <param name="y"></param>
    
///   <param name="zoomLevel"></param>
    
///   <returns></returns>
     public   override  Uri GetUri( int  x,  int  y,  int  zoomLevel)
    {
        
return   new  Uri( string .Format( this .UriFormat, x, y, zoomLevel), UriKind.RelativeOrAbsolute);
    }
}
 
  通过和上面集成OSM()地图的TileSource的算法是不同的,加载地图的Tile算法主要取决于发布OSM地图的Tile映射。上面代码块中的定义指定的加载地图图层的范围也不在是中国地区范围了,下图为最终运行效果截图:
        
 
  最近很多朋友都在问我一个问题,要如何才能发布自己的图片为地图服务,然后加载到地图组件中呈现出来?其实要实现这一功能点是可以的,当然实现这一功能也是痛苦的,首先得了解常用、常见或是一些比较通用的GIS相关的概论和知识体系,了解相关的技术原理和工具的使用后就可以将自己的图片发布为OSM的地图服务,通过本文所介绍的方式就可以加载到Bing Maps中呈现了。
 
   推荐资源:
   http://www.openstreetmap.org/
   http://msdn.microsoft.com/en-us/library/ee690939(v=MSDN.10).aspx

相关文章:

  • KiB是什么单位
  • 关注程序员健康之——白天打个盹提高记忆力
  • UML建模之业务处理模型(Business Process Model,BPM)
  • RealView Development Suite 4.0 Professional安装
  • SharePoint开发中常见的几种错误类型及解决方法!
  • 实时内存数据库的数据管理
  • 主要城市公交路线下载Mono版(使用MonoDevelop开发)
  • 工业级开发中的一些常识
  • 第一个shell
  • Android环境搭建及相关命令
  • c# asp.net 日历控件(9)
  • 献给各位已婚者
  • 上海世博会园区进行首次试运行
  • SQL Server 数据库故障修复顶级技巧之一
  • Rose HA for SQL2008的安装之一
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【剑指offer】让抽象问题具体化
  • 77. Combinations
  • CSS 提示工具(Tooltip)
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • php ci框架整合银盛支付
  • VuePress 静态网站生成
  • 创建一个Struts2项目maven 方式
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 关于Flux,Vuex,Redux的思考
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 日剧·日综资源集合(建议收藏)
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 设计模式走一遍---观察者模式
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 由插件封装引出的一丢丢思考
  • 找一份好的前端工作,起点很重要
  • 阿里云重庆大学大数据训练营落地分享
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​TypeScript都不会用,也敢说会前端?
  • ​马来语翻译中文去哪比较好?
  • #DBA杂记1
  • #NOIP 2014# day.1 T2 联合权值
  • (04)odoo视图操作
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (4)(4.6) Triducer
  • (java)关于Thread的挂起和恢复
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (八)Flask之app.route装饰器函数的参数
  • (蓝桥杯每日一题)love
  • (六)软件测试分工
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .FileZilla的使用和主动模式被动模式介绍
  • .gitignore文件---让git自动忽略指定文件
  • .net 无限分类
  • .Net的DataSet直接与SQL2005交互