Bing Maps进阶系列三:使用地图图像服务(ImageryService)

  地图图像服务(ImageryService)提供了根据地理位置(经度和纬度)坐标和地图的缩放级别解析出对应于地图图片系统的完整地图数据元数据,包括图片映射地址、图片大小等一系列详细参数。通过该服务的服务接口也可以反向实现通过指定地理位置坐标、地图缩放级别和图片大小(高度和宽度)来生成不同的地图图片。

一、添加ImageryService的Web服务引用

  微软发布的地图图像服务地址是:http://dev.virtualearth.net/webservices/v1/imageryservice/ImageryService.svc,在项目中通过该地址添加Web服务引用后就可以使用地图图像服务中的方法进行

        

  如上图示成功添加地图图像服务(ImageryService)后就可以使用该服务所提供的功能了,可以添加Web服务引用向导过程中生成的WCF客户端配置查看到Silverlight访问该服务的客户端完整配置信息,如下代码:


<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IImageryService" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None">
                        <transport>
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://dev.virtualearth.net/webservices/v1/imageryservice/imageryservice.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IImageryService"
                contract="ImageryService.IImageryService" name="BasicHttpBinding_IImageryService" />
        </client>
    </system.serviceModel>
</configuration>

二、Silverlight界面布局设计

  在Silverlight的界面上提供三个TextBox用于录入经度、纬度和缩放级别值,通过按钮请求调用ImageryService服务接口。


<Grid x:Name="LayoutRoot">
<m:Map CredentialsProvider="AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU" x:Name="map"></m:Map>
    <Border BorderBrush="Gray" BorderThickness="3,3,3,3" 
            Margin="3,3,3,3" HorizontalAlignment="Right" 
            Opacity="0.78"  Height="160" Background="#A82D2D2D"
            VerticalAlignment="Top" CornerRadius="5,5,5,5">
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal" Margin="3,3,3,3">
                <TextBlock Text="经度:"></TextBlock>
                <TextBox x:Name="tbLongitude" Width="130"></TextBox>
                <TextBlock Text="纬度:"></TextBlock>
                <TextBox x:Name="tbLatitude" Width="130"></TextBox>
                <TextBlock Text="缩放级别:"></TextBlock>
                <TextBox x:Name="tbZoomLevel" Width="30"></TextBox>
                <Button x:Name="btnImageMetadata" Click="btnImageMetadata_Click" Content="获取图片映射地址" Margin="3"></Button>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Margin="3,3,3,3">
                <TextBlock Text="映射地址:"></TextBlock>
                <TextBox x:Name="tbMetadataResult" Width="500"></TextBox>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Margin="3,3,3,3">
                <TextBlock Text="图片高度:"></TextBlock>
                <TextBox x:Name="tbHeight" Width="150"></TextBox>
                <TextBlock Text="图片宽度:"></TextBlock>
                <TextBox x:Name="tbWidth" Width="150"></TextBox>
            </StackPanel>
        </StackPanel>
    </Border>
</Grid>

 三、调用ImageryService服务获取地图元数据

  地图图像服务(ImageryService)提供了接口实现通过地图位置经度和纬度以及地图缩放级别获取对应于地图图片系统(Tile System)的地图数据的详细信息,包括地图图片对应的Tile映射地址,图片的高度和宽度,请求图片的时间等一些列参数值,通过前面的操作以及成功添加了对ImageryService的Web服务引用,接下来只需要简单的调用服务接口就可以获取到这些数据。


private void btnImageMetadata_Click(object sender, RoutedEventArgs e)
{
    //构造服务请求对象
    var request = new ImageryMetadataRequest();
    request.Credentials = new Microsoft.Maps.MapControl.Credentials();
    request.Credentials.ApplicationId = "AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU";     //设置地理位置经度、纬度和地图缩放级别,从界面控件收集值
    var location = new Location(double.Parse(this.tbLatitude.Text), double.Parse(this.tbLongitude.Text));
    request.Options = new ImageryMetadataOptions();
    request.Options.Location = location;
    request.Options.ZoomLevel = int.Parse(this.tbZoomLevel.Text);
    request.Style = MapStyle.AerialWithLabels;     //构造ImageryService客户端代理对象实例
    var client = new ImageryServiceClient();
    client.GetImageryMetadataCompleted += (o, args) =>  //处理请求的响应接口
        {
            if (args.Error == null)
            {
                var response = args.Result;
                this.tbMetadataResult.Text = response.Results[0].ImageUri.ToString();
                this.tbHeight.Text = response.Results[0].ImageSize.Height.ToString();
                this.tbWidth.Text = response.Results[0].ImageSize.Width.ToString();
            }
        };     //发起异步调用
    client.GetImageryMetadataAsync(request);
}         

  从上图可看出,通过指定的地理经度、纬度和地图缩放级别参数调用ImageryService服务接口,返回了一个地址“http://t0.tiles.virtualearth.net/tiles/h1320.jpeg?g=409&mkt={culture}&token={token}”,该地址就是地理位置(经度:97.1964042859709,纬度:37.5939128813461),地图缩放级别为:4所对应的地图图片系统(Tile System)的地图数据映射Url,通过在浏览器中执行该Url可查看该Url对应的具体图片效果,如下图示:

        

  上面获取到的是带地名的卫星地图,因为设置的样式是:request.Style = MapStyle.AerialWithLabels。可以通过MapStyle枚举设置不同的请求样式,比如要获取道路模式的地图则如下设置:

request.Style = MapStyle.Road;

  在次通过上面获取卫星地图的地理位置坐标经度和纬度值获取下来的Url为:http://t0.tiles.virtualearth.net/tiles/r1320.jpeg?g=409&mkt={culture}&shading=hill&token={token},其显示效果为下图所示:

          

四、调用ImageryService生成图片

  地图图片服务(ImageryService)也提供了服务接口反向实现通过指定地理位置坐标、地图缩放级别和图片大小(高度和宽度)来生成图片。这个服务接口最终将请求转向到一个HTTP处理程序,用来根据不同的参数值生成不同的图片数据,该HTTP处理程序的请求格式:“http://api.tiles.virtualearth.net/api/GetMap.ashx?c=纬度,经度&w=宽度&h=高度&b=h,mkt.en-US&z=4&token={token}”。

  比如我们需要以中国地区地图坐标为准,生成一张地图缩放级别为10,图片高度和宽度为512的一张图片,那么完整的http请求串就应该是这样的:http://api.tiles.virtualearth.net/api/GetMap.ashx?c=35.0521567883562,100.81816585252&w=512&h=512&b=h,mkt.en-US&z=4&token={token}

  当然绝大多数情况下我们是不知道这个处理程序的路径的,只有通过调试程序才能发现最终是将请求转向到了此处理程序去完成的生成图片功能。我们在做开发的时候其实只需要关注ImageryService这个WCF服务的调用就OK了。那么要实现生成图片我们可以通过ImageryService所提供的GetMapUri()方法实现,代码如下:


private void btnGetUrl_Click(object sender, RoutedEventArgs e)
{
    var request = new MapUriRequest(); 
    request.Credentials = new Microsoft.Maps.MapControl.Credentials();
    request.Credentials.ApplicationId = "AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU";     request.Center = new Location(35.0521567883562,100.81816585252);
    var opt = new MapUriOptions();
    opt.Style = MapStyle.AerialWithLabels;
    opt.ZoomLevel = 4;
    opt.ImageSize = new SizeOfint();
    opt.ImageSize.Height = (int)imgMap.Height;
    opt.ImageSize.Width = (int)imgMap.Width;     request.Options = opt;     var client = new ImageryServiceClient();
    client.GetMapUriCompleted += (o, args) =>
        {
            var response = args.Result;
            imgMap.Source = new BitmapImage(new Uri(response.Uri, UriKind.RelativeOrAbsolute));
        };
    client.GetMapUriAsync(request);
}

  上面代码段里使用了imgMap控件,这是在界面上放置的一个Image控件,通过按钮发起ImageryService的服务接口的调用,将返回的串序列为位图数据赋值给Image控件显示出来,其定义如下:

<Image x:Name="imgMap" Width="512" Height="512"></Image>

  通过上面的实现最终生成的图片效果如下图所示:

        

  如果您想了解更多关于Bing Maps地图服务的知识,请查询:

  MSDN:http://msdn.microsoft.com/en-us/library/cc980922.aspx

  Bing Maps开发站:http://www.microsoft.com/maps/developers/

  Bing Maps开发SDK:http://msdn.microsoft.com/en-us/library/dd877180.aspx

版权说明

本文属原创文章,欢迎转载且注明文章出处,其版权归作者和博客园共有。

作      者:Beniao                                   微软Bing Maps开发群:75662563

文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

 
 

Bing Maps进阶系列三:使用地图图像服务(ImageryService)的更多相关文章

  1. Bing Maps进阶系列四:路由功能服务(RouteService)

    Bing Maps进阶系列四:路由功能服务(RouteService) Bing Maps提供的路由功能服务(RouteService)可以实现多方位的计算地图上的路线指示,路径行程等功能,比如说实现 ...

  2. Bing Maps进阶系列一:初识Bing Maps地图服务

    Bing Maps进阶系列一:初识Bing Maps地图服务 Bing Maps提供了一组WCF的地图服务,使用这些服务我们可以方便的在自己的应用系统里实现地理位置搜索等相关功能.他们分别是地理编码服 ...

  3. Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps

    Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps 在Bing Maps开发中,由于各种应用功能的不同,更多的时候用户可能需要将自己的一部分图片数据作为地图 ...

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

    Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图 OSM(OpenStreetMap-开放街道地图)服务就是一种发布自己地图数据图片为服务的一种实现类型,开放街道 ...

  5. Bing Maps进阶系列二:使用GeocodeService进行地理位置检索

    Bing Maps进阶系列二:使用GeocodeService进行地理位置检索 在<Bing Maps进阶系列一:初识Bing Maps地图服务>里已经对GeocodeService的功能 ...

  6. Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身

    Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身 Bing Maps Silverlight Control所提供的功能导航是非常强大的,在设计上对扩展的支持非常好,提供了许多用 ...

  7. Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图

    Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方面的开 ...

  8. Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图

    Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方便的开发模 ...

  9. 【Silverlight】Bing Maps学习系列(三):如何控制地图

    [Silverlight]Bing Maps学习系列(三):如何控制地图 本篇主要介绍如何对地图的一些常用控制操作,包括地图加载模式.根据精度和纬度定位.变焦程度等. 一.动态设置地图加载模式 在本系 ...

随机推荐

  1. 【前端路由】Vue-router 中hash模式和history模式的区别

    咱们今天说说VUE路由的hash模式与history模式的区别,这个也是面试常问的问题,不要小看这道题其实问到这里的时候那个面试官应该是个大牛,开发经验丰富,这个题其实就是考验你的开发经验是否属实. ...

  2. Python之TCP编程

    参考原文 廖雪峰Python教程 客户端 我们知道每一条TCP的连接有2个端点,这两个端点叫做套接字socket.如果我们要进行基于TCP的通信必须先创建套接字.在Python中可以这样创建套接字so ...

  3. PAT 1141 PAT Ranking of Institutions

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  4. RabbitMQ-rabbitmqctl多机多节点和单机多节点集群搭建(五)

    准备 1.准备3台物理机 我这里通过本地机和2台虚拟模拟我是mac通过(Parallel Desktop 实现) 2.按照签名的liux安装步骤在3台机器都安装rabiitMq 3.将任意一节点的co ...

  5. HDU 4923 (贪心+证明)

    Room and Moor Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is ...

  6. 转载 - PowerDesigner(CDM—PDM—SQL脚本的转换流程)

    出处: http://jbeduhai.iteye.com/blog/338579 由于图片复制上去不显示,如想看内容及图片详情,请下载附件 PowerDesigner数据模型(CDM—PDM—SQL ...

  7. 利用python进行数据分析--(阅读笔记一)

    以此记录阅读和学习<利用Python进行数据分析>这本书中的觉得重要的点! 第一章:准备工作 1.一组新闻文章可以被处理为一张词频表,这张词频表可以用于情感分析. 2.大多数软件是由两部分 ...

  8. [bzoj4033][HAOI2015]树上染色_树形dp

    树上染色 bzoj-4033 HAOI-2015 题目大意:给定一棵n个点的树,让你在其中选出k个作为黑点,其余的是白点,收益为任意两个同色点之间距离的和.求最大收益. 注释:$1\le n\le 2 ...

  9. HDU——1267 下沙的沙子有几粒?

    下沙的沙子有几粒? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  10. zabbix全方位监控MySQL +cacti监控mysql

    http://www.linuxidc.com/Linux/2015-02/112690.htm http://john88wang.blog.51cto.com/2165294/1596272?ut ...