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中呈现了。
 




本文转自 beniao 51CTO博客,原文链接:http://blog.51cto.com/beniao/291108,如需转载请自行联系原作者

目录
相关文章
|
6月前
|
机器学习/深度学习 人工智能 缓存
突发!ChatGPT 紧急暂停 Bing 集成,下线搜索功能
突发!ChatGPT 紧急暂停 Bing 集成,下线搜索功能
74 0
|
4月前
|
数据采集 Web App开发 XML
爬虫进阶:Selenium与Ajax的无缝集成
爬虫进阶:Selenium与Ajax的无缝集成
|
4月前
|
数据采集 数据安全/隐私保护
Kameleo指纹浏览器进阶使用:轻松集成IPXProxy海外代理IP
Kameleo是一款出色的指纹浏览器,它能够帮助用户实现隐身浏览。大家在进行网络抓取的时候总会碰到一些阻碍,而采取指纹浏览器可以提升网络抓取的效率,并且集成代理IP能增加一层防护,让数据采集更加全面,为制定营销策略提供更好的支持。那如何将Kameleo指纹浏览器与IPXProxy海外代理IP集成?
|
5月前
|
数据采集 DataWorks 安全
DataWorks产品使用合集之选择独享调度,数据集成里可以使用,但是数据地图里面测试无法通过,是什么原因导致的
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
54 0
DataWorks产品使用合集之选择独享调度,数据集成里可以使用,但是数据地图里面测试无法通过,是什么原因导致的
|
5月前
|
安全 定位技术 API
探讨如何在Flutter中集成支付、地图等第三方服务,以及集成过程中需要注意的问题和最佳实践
【6月更文挑战第11天】本文介绍了在Flutter中集成第三方服务,如支付和地图,以增强应用功能和用户体验。开发者可通过官方或社区插件集成服务,注意服务选择、API调用、错误处理和用户体验。支付集成涉及选择服务、获取API密钥、引入插件、调用API及处理结果。地图集成则包括选择地图服务、获取API密钥、初始化地图组件和添加交互功能。集成时要选择稳定插件、仔细阅读文档,处理错误,优化性能并遵循安全规范。随着Flutter生态发展,更多优质服务将可供选择。
112 2
|
5月前
|
SQL 数据采集 DataWorks
DataWorks操作报错合集之数据集成里面的数据调度独享资源组测试通过了,但是数据地图里无法通过,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
6月前
|
前端开发 定位技术 API
【Flutter前端技术开发专栏】Flutter中的第三方服务集成(如支付、地图等)
【4月更文挑战第30天】本文介绍了在Flutter中集成第三方服务,如支付和地图,以增强应用功能和用户体验。开发者可通过官方或社区插件集成服务,关注服务选择、API调用、错误处理和用户体验。支付集成涉及选择服务、获取API密钥、引入插件、调用API及处理结果。地图集成则需选择地图服务、获取API密钥、初始化地图并添加交互功能。集成时注意选择稳定插件、阅读文档、处理异常、优化性能和遵循安全规范。随着Flutter生态发展,更多第三方服务将可供选择。
91 0
【Flutter前端技术开发专栏】Flutter中的第三方服务集成(如支付、地图等)
|
6月前
|
安全 Shell 网络安全
Git学习---Git快速入门、Git基础使用、Git进阶使用、Git服务器使用(IDEA集成GitHub、Gitee、GitLab)、GitHub Desktop客户端
Git学习---Git快速入门、Git基础使用、Git进阶使用、Git服务器使用(IDEA集成GitHub、Gitee、GitLab)、GitHub Desktop客户端
201 0
|
6月前
|
Java 定位技术 Android开发
【Android App】集成腾讯地图显示位置和地图面板讲解及实战(附源码和演示 超详细必看)
【Android App】集成腾讯地图显示位置和地图面板讲解及实战(附源码和演示 超详细必看)
392 1
|
Linux 网络安全 开发工具
Git学习---Git快速入门、Git基础使用、Git进阶使用、Git服务器使用(IDEA集成GitHub、Gitee、GitLab)、GitHub Desktop客户端
Git学习---Git快速入门、Git基础使用、Git进阶使用、Git服务器使用(IDEA集成GitHub、Gitee、GitLab)、GitHub Desktop客户端
下一篇
无影云桌面