在《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提供的方法的时候会出现异常。以下为正确的客户端配置:
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IGeocodeService" 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/geocodeservice/GeocodeService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGeocodeService"
                contract="GeocodeService.IGeocodeService" name="BasicHttpBinding_IGeocodeService" />
        </client>
    </system.serviceModel>
</configuration>
 
 
三、调用GeocodeService服务
首先将界面布局设计下,通过一个TextBox来输入地点名称,一个Button来发起服务调用请求并将检索过后的结果(地名对应的地理位置经度和纬度)显示在另外两个TextBox里。界面布局大致如下:
代码

<Grid x:Name="LayoutRoot" Width="500" Height="400">
    <m:Map CredentialsProvider="AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU" x:Name="map"></m:Map>
    <StackPanel VerticalAlignment="Top" HorizontalAlignment="Right" Background="Gray" Opacity="0.78" Orientation="Vertical" Margin="2,23,2,2">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="地名:" Margin="0,5,0,5"></TextBlock>
            <TextBox x:Name="tbName" Width="233"></TextBox>
            <Button x:Name="btnQuery" Content="搜索" Click="btnQuery_Click" Width="80" Height="30"></Button>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="经度:"></TextBlock>
            <TextBox x:Name="tbLongitude" Width="110"></TextBox>
            <TextBlock Text="纬度:"></TextBlock>
            <TextBox x:Name="tbLatitude" Width="110"></TextBox>
            <Button x:Name="btnQueryReverse" Content="反向搜索" Click="btnQueryReverse_Click" Width="60" Height="30"></Button>
        </StackPanel>
    </StackPanel>
</Grid>

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

private void btnQuery_Click(object sender, RoutedEventArgs e)
{
    //实例化GeocodeService客户端对象
    GeocodeServiceClient client = new GeocodeServiceClient();
    client.GeocodeCompleted += new EventHandler<GeocodeCompletedEventArgs>(OnGeocodeCompleted);

//创建一个Geocode检索请求
    GeocodeRequest request = new GeocodeRequest();
    request.Credentials = new Credentials();
    request.Credentials.ApplicationId = "AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU";

//设置检索条件
    request.Query = this.tbName.Text.Trim();

//异步调用Geocode服务方法
    client.GeocodeAsync(request);
}

 
 
通过指定的GeocodeCompleted的回调函数来完成调用服务请求的响应结果,这里我将请求的结果地理位置获取到后直接将地图定位到该位置。
private void OnGeocodeCompleted(object sender, GeocodeCompletedEventArgs e)
{
    if (e.Error == null)
    {
        GeocodeResponse response = e.Result;
        double latitude = response.Results[0].Locations[0].Latitude;
        double longitude = response.Results[0].Locations[0].Longitude;

//显示检索地点的地理位置坐标经度和纬度
        this.tbLatitude.Text = latitude.ToString();
        this.tbLongitude.Text = longitude.ToString();

//将地图定位到该地理位置并设置地图缩放级别到4级
        map.SetView(new Location(latitude, longitude), 4);
    }
}

 
 
  
如上图输入“china”进行检索,通过GeocodeService服务检索出了china所对应的地理位置的经度和纬度坐标,在程序中将地图定位到了该坐标的4级地图,最终效果就如上图所示。
GeocodeService也提供了反向检索,既根据地理位置的经度和纬度进行反向检索地名,服务中的ReverseGeocode()方法便是用来实现这一功能的。
private void btnQueryReverse_Click(object sender, RoutedEventArgs e)
{
    GeocodeServiceClient client = new GeocodeServiceClient();
    client.ReverseGeocodeCompleted+=new EventHandler<ReverseGeocodeCompletedEventArgs>(OnReverseGeocodeCompleted);

ReverseGeocodeRequest request = new ReverseGeocodeRequest();
    request.Credentials = new Credentials();
    request.Credentials.ApplicationId = "AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU";
    request.Location = new Location(36.5540000796318,104.055999666452);
    client.ReverseGeocodeAsync(request);
}

private void OnReverseGeocodeCompleted(object sender, ReverseGeocodeCompletedEventArgs e)
{
    if (e.Error == null)
    {
        if (e.Result.Results.Count > 0)
        {
            GeocodeResponse response = e.Result;
            this.tbName.Text = response.Results[0].DisplayName;
        }
        else
            MessageBox.Show("没有检索到该地理位置所对应的地点");
    }
}

 
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

转载于:https://blog.51cto.com/beniao/283335

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

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

    OSM(OpenStreetMap-开放街道地图)服务就是一种发布自己地图数据图片为服务的一种实现类型,开放街道地图成立动机在于希望能创造并且提供可以被自由地使用的地理资料(像街道地图)给每个想使用的 ...

  2. 使用GeocodeService进行地理位置检索

    转载自 http://beniao.cnblogs.com/作      者:Beniao         WebGIS开发群:75662563 Bing Maps进阶系列二:使用GeocodeSer ...

  3. 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)

    [Silverlight]Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System) 目前包括微软必应地图在内的几乎所有在线电子地图(如:Google Maps等)都 ...

  4. Wireshark入门与进阶系列(二)

    摘自http://blog.csdn.net/howeverpf/article/details/40743705 Wireshark入门与进阶系列(二) "君子生非异也,善假于物也&quo ...

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

    如本系列第一篇你所介绍的,开发基于Silverlight的Bing Maps除了开发环境还需要一个开发Key,这个Key是用来做什么的呢?Silverlight控件在做地图呈现的时候它是一个必不可少的 ...

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

    本篇主要介绍如何对地图的一些常用控制操作,包括地图加载模式.根据精度和纬度定位.变焦程度等. 一.动态设置地图加载模式 在本系列二中介绍了地图加载模式,可以给地图控件设置一种模式的地图加载模式,呈现数 ...

  7. matlab 积分进阶教程,最适合小白的matlab教程系列_进阶系列二之微积分

    微积分篇 更多文章参考 符号变量 极限问题 求导数 求导数----偏导数 积分--符号解 积分数值解 多重积分 级数求和 泰勒级数展开 常微分方程 更多文章参考 最适合小白的matlab教程系列_基础 ...

  8. 最适合小白的matlab教程系列_进阶系列二之微积分

    微积分篇 更多文章参考 符号变量 极限问题 求导数 求导数----偏导数 积分--符号解 积分数值解 多重积分 级数求和 泰勒级数展开 常微分方程 更多文章参考 最适合小白的matlab教程系列_基础 ...

  9. 【Silverlight】Bing Maps学习系列(九):自定义功能导航条(Custom NavigationBar)

    微软Bing Maps Silverlight Control实现了最基本的地图呈现功能,其功能其他是非常的强大,可以支持很多的扩展功能开发,本文通过自定义功能导航菜单为例介绍基于Bing Maps ...

  10. 最适合小白的matlab教程系列_进阶系列二之多项式

    多项式 一维插值 二维插值 计算多项式 *计算多项式* 计算多项式乘除法 多项式求导 多项式求积分 多项式曲线拟合 一维插值 命名格式vq=interp1(x,v,xq) x:原始数据(自变量)n维向 ...

最新文章

  1. CentOS 安装FTP
  2. 《数据竞赛白皮书·下篇》发布,开源办好一场数据竞赛的实践方法论
  3. java判断直到_3. JavaSE-位运算及判断循环程序结构的讲解
  4. 优秀的中文分词第三方库——jieba
  5. Angular里interpolation text节点的创建逻辑,单步调试
  6. PHP2002,php - 错误:SQLSTATE [HY000] [2002]没有这样的文件或目录 - SO中文参考 - www.soinside.com...
  7. 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)(转)
  8. 于明:移动支付将代替电子支付?
  9. mysql 杂记(二)
  10. epoll原理_彻底搞懂epoll高效运行的原理
  11. 【unity记录】导入标准资源包(Standard Assets)
  12. 最新Spring Boot实战项目(权限后台管理系统)详解
  13. Lync 2010升级到2013之部署企业语音!
  14. ZOOM一直显示登录失败,出现Zoom登录失败:100000503,zoom登录失败错误代码1044
  15. 那些堪称神器的PPT制作小工具
  16. FinalData 数据恢复
  17. 【数学相关、逻辑推理】
  18. 佳能R5/R6断电H.265/HEVC编码DAT视频损坏怎么修复
  19. pet缩聚流程图_PET生产工艺流程.ppt
  20. 【mysql】日期和时间函数

热门文章

  1. python用for循环求平均分_Python中for循环的一些非常规操作
  2. Linux RTC驱动模型分析之rtc-proc.c
  3. OpenGL ES 3.0学习实践
  4. 请求发送者与接收者解耦——命令模式(四)
  5. android arm linux下使用内存转储crash工具分析 kernel system dump问题
  6. 51Nod - 1051(思维)
  7. mysql自助完成翻页代码_MySql实现翻页查询功能
  8. 文件复制 详解(C++)
  9. 跳台阶问题详解---动态规划
  10. 安恒赛php_安恒四月赛部分Writeup