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

  在《Bing Maps进阶系列一:初识Bing Maps地图服务》里已经对GeocodeService的功能进行了简单的描述说明,本篇将会详细的介绍如何使用GeocodeService进行地理位置检索和反向检索的实现。

一、添加GeocodeService的Web服务引用

  地理编码服务(GeocodeService)是以WCF技术发布的一个Web服务,地图编码服务提供了以一个有效的物理地址在地图上匹配其对应的地图地址(既地理经度和纬度坐标)和以地理经度和纬度坐标进行反向匹配物理地址路径的功能。要使用该服务需添加该服务(http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc)的Web服务引用,如下图:

        

  

  从上图可以清晰的看出,该服务提供了两个方法,一个是根据地名检索所对应的地理经度和纬度坐标的,另一个方法实现反向检索地名的功能。通过添加Web服务引用向导IDE工具会为我们自动生成Web服务引用的代理对象等,这些知识点数据Web Service或WCF相关的,这里不详细介绍。

 二、GeocodeService的结构分析

  我们可以通过查看GeocodeService的客户端代理对象类图知道,客户端的调用只支持异步调用方式,如下图:

        

  地点检索和反向地理坐标检索都只支持客户端异步调用,添加Web服务引用后可通过生成的WCF客户端配置文件查看到客户端调用WCF的相关配置,这里需要注意一点,自动生成的配置有两个服务端点的地址配置,需要人为将其中一个"custom"配置删除,或者在调用GeocodeService提供的方法的时候会出现异常。以下为正确的客户端配置:

  1.  
  2. <configuration>
  3.     <system.serviceModel>
  4.         <bindings>
  5.             <basicHttpBinding>
  6.                 <binding name="BasicHttpBinding_IGeocodeService" maxBufferSize="2147483647"
  7.                     maxReceivedMessageSize="2147483647">
  8.                     <security mode="None">
  9.                         <transport>
  10.                             <extendedProtectionPolicy policyEnforcement="Never" />
  11.                         </transport>
  12.                     </security>
  13.                 </binding>
  14.             </basicHttpBinding>
  15.         </bindings>
  16.         <client>
  17.             <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc"
  18.                 binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGeocodeService"
  19.                 contract="GeocodeService.IGeocodeService" name="BasicHttpBinding_IGeocodeService" />
  20.         </client>
  21.     </system.serviceModel>
  22. </configuration>

三、调用GeocodeService服务

  首先将界面布局设计下,通过一个TextBox来输入地点名称,一个Button来发起服务调用请求并将检索过后的结果(地名对应的地理位置经度和纬度)显示在另外两个TextBox里。界面布局大致如下:

  1.  
  2. 代码
  3.  
  4. <Grid x:Name="LayoutRoot" Width="500" Height="400">
  5.     <m:Map CredentialsProvider="AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU" x:Name="map"></m:Map>
  6.     <StackPanel VerticalAlignment="Top" HorizontalAlignment="Right" Background="Gray" Opacity="0.78" Orientation="Vertical" Margin="2,23,2,2">
  7.         <StackPanel Orientation="Horizontal">
  8.             <TextBlock Text="地名:" Margin="0,5,0,5"></TextBlock>
  9.             <TextBox x:Name="tbName" Width="233"></TextBox>
  10.             <Button x:Name="btnQuery" Content="搜索" Click="btnQuery_Click" Width="80" Height="30"></Button>
  11.         </StackPanel>
  12.         <StackPanel Orientation="Horizontal">
  13.             <TextBlock Text="经度:"></TextBlock>
  14.             <TextBox x:Name="tbLongitude" Width="110"></TextBox>
  15.             <TextBlock Text="纬度:"></TextBlock>
  16.             <TextBox x:Name="tbLatitude" Width="110"></TextBox>
  17.             <Button x:Name="btnQueryReverse" Content="反向搜索" Click="btnQueryReverse_Click" Width="60" Height="30"></Button>
  18.         </StackPanel>
  19.     </StackPanel>
  20. </Grid>

        

  有了上面的界面结构,接下来看看如何实现的根据地名检索所对应的地理位置经度和纬度,这就需要调用GeocodeService所提供的Geocode()方法了。

  1.  
  2. 代码
  3.  
  4. private void btnQuery_Click(object sender, RoutedEventArgs e)
  5. {
  6.     //实例化GeocodeService客户端对象
  7.     GeocodeServiceClient client = new GeocodeServiceClient();
  8.     client.GeocodeCompleted += new EventHandler<GeocodeCompletedEventArgs>(OnGeocodeCompleted);
  9.  
  10.     //创建一个Geocode检索请求
  11.     GeocodeRequest request = new GeocodeRequest();
  12.     request.Credentials = new Credentials();
  13.     request.Credentials.ApplicationId = "AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU";
  14.  
  15.     //设置检索条件
  16.     request.Query = this.tbName.Text.Trim();
  17.  
  18.     //异步调用Geocode服务方法
  19.     client.GeocodeAsync(request);
  20. }

  通过指定的GeocodeCompleted的回调函数来完成调用服务请求的响应结果,这里我将请求的结果地理位置获取到后直接将地图定位到该位置。

  1.  
  2. private void OnGeocodeCompleted(object sender, GeocodeCompletedEventArgs e)
  3. {
  4.     if (e.Error == null)
  5.     {
  6.         GeocodeResponse response = e.Result;
  7.         double latitude = response.Results[0].Locations[0].Latitude;
  8.         double longitude = response.Results[0].Locations[0].Longitude;
  9.  
  10.         //显示检索地点的地理位置坐标经度和纬度
  11.         this.tbLatitude.Text = latitude.ToString();
  12.         this.tbLongitude.Text = longitude.ToString();
  13.  
  14.         //将地图定位到该地理位置并设置地图缩放级别到4级
  15.         map.SetView(new Location(latitude, longitude), 4);
  16.     }
  17. }

          

  

  如上图输入“china”进行检索,通过GeocodeService服务检索出了china所对应的地理位置的经度和纬度坐标,在程序中将地图定位到了该坐标的4级地图,最终效果就如上图所示。

  GeocodeService也提供了反向检索,既根据地理位置的经度和纬度进行反向检索地名,服务中的ReverseGeocode()方法便是用来实现这一功能的。

  1.  
  2. private void btnQueryReverse_Click(object sender, RoutedEventArgs e)
  3. {
  4.     GeocodeServiceClient client = new GeocodeServiceClient();
  5.     client.ReverseGeocodeCompleted+=new EventHandler<ReverseGeocodeCompletedEventArgs>(OnReverseGeocodeCompleted);
  6.  
  7.     ReverseGeocodeRequest request = new ReverseGeocodeRequest();
  8.     request.Credentials = new Credentials();
  9.     request.Credentials.ApplicationId = "AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU";
  10.     request.Location = new Location(36.5540000796318,104.055999666452);
  11.     client.ReverseGeocodeAsync(request);
  12. }
  13.  
  14. private void OnReverseGeocodeCompleted(object sender, ReverseGeocodeCompletedEventArgs e)
  15. {
  16.     if (e.Error == null)
  17.     {
  18.         if (e.Result.Results.Count > 0)
  19.         {
  20.             GeocodeResponse response = e.Result;
  21.             this.tbName.Text = response.Results[0].DisplayName;
  22.         }
  23.         else
  24.             MessageBox.Show("没有检索到该地理位置所对应的地点");
  25.     }
  26. }

  PS:貌似Bing Maps的GeocodeService有问题,难道是MS的数据有问题??通过地名检索出的地理位置坐标反向检索回去居然没有数据返回。 

  其实说简单点GeocodeService所提供的两个方法就是一个实现根据地名检索对应的地理位置经度和纬度坐标,一个实现根据地理位置的经度和纬度坐标反向检索地名。这在外网GIS应用中是非常有用的,企业内网的业务支撑系统这一功能到不是很有用,通常企业业务系统的业务扩展开发中应用到地图最多的就是地图的呈现,比如将一些网络组织图以GIS的形式呈现出来,让人看着比较直观、清晰,其他扩展全的根据业务需求开发。

  想了解更多关于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

  在线DEMO:http://usfromdhaka.com/shamrat231/t56/

版权说明

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

作      者:Beniao                                  WebGIS开发群:75662563

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

 
 

Bing Maps进阶系列二:使用GeocodeService进行地理位置检索的更多相关文章

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

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

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

    Bing Maps进阶系列三:使用地图图像服务(ImageryService) 地图图像服务(ImageryService)提供了根据地理位置(经度和纬度)坐标和地图的缩放级别解析出对应于地图图片系统 ...

  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进阶系列七:Bing Maps功能导航菜单华丽的变身

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

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

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

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

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

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

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

  9. 【Silverlight】Bing Maps学习系列(二):通过Bing Maps Silverlight Control如何显示地图(转)

    [Silverlight]Bing Maps学习系列(二):通过Bing Maps Silverlight Control如何显示地图 如本系列第一篇你所介绍的,开发基于Silverlight的Bin ...

随机推荐

  1. 01JavaScript使用

    JavaScript使用 1.内容写入 HTML <P onmouseover="alert('欢迎您学习JavaScript!')">鼠标移过来</P> ...

  2. 数据库——DBUtils和连接池

    第一章 DBUtils如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils.DBUtils就是JDBC的简 ...

  3. TWaver动画之雷达扫描效果

    UI和功能是好的产品的两个重要因素,很多产品往往只注重功能上的设计,而忽略了UI.在这个“看脸”的时代,就算产品的功能很强大,如果UI跟不上步伐,你的产品都会在客户心中大打折扣.做安全和监控的项目中经 ...

  4. Script:shell脚本生成随机字符串

    #!/bin/bash # bash generate random alphanumeric string # # bash generate random character alphanumer ...

  5. P4817 [USACO15DEC]Fruit Feast 水果盛宴

    P4817 [USACO15DEC]Fruit Feast 水果盛宴 现在Bessie的饱食度为 00 ,她每吃一个橙子,饱食度就会增加 AA :每吃一个柠檬,饱食度就会增加 BB .Bessie还有 ...

  6. 作业 3-5 switch语句的应用

    /*输入五级制成绩(A-E),输出相应的百分制成绩(0-100)区间*/ #include<stdio.h> int main(void) { char ch;/*定义一个字符*/ pri ...

  7. Python学习:ModuleNotFoundError: No module named 'pygal.i18n' 的解决方法

    最近在学<Python编程:从入门到实践>,16.2小结中 from pygal.i18n import COUNTRIES 获取两个字母的国别码,我用的pygal的版本是2.4.0(终端 ...

  8. Vue.Draggable实现拖拽效果(快速使用)

    1.下载包:npm install vuedraggable 配置:package.json "dependencies": { "element-ui": & ...

  9. [bzoj1044][HAOI2008][木棍分割] (二分+贪心+dp+队列优化)

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  10. 最短网络 Agri-Net

    题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其 ...