转载自 http://beniao.cnblogs.com/作      者:Beniao         WebGIS开发群:75662563

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提供的方法的时候会出现异常。以下为正确的客户端配置:

<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的形式呈现出来,让人看着比较直观、清晰,其他扩展全的根据业务需求开发。

转载于:https://www.cnblogs.com/hijack/archive/2010/02/08/1665695.html

使用GeocodeService进行地理位置检索相关推荐

  1. 基于GeoHash算法的地理位置检索

    地理位置检索服务在日常生活中随处可见,小到共享单车.高德地图,大到飞行航线轨迹.上述服务中很多相关功能都可以通过GeoHash来实现,Lucene/Solr中也有应用到GeoHash,通过GeoHas ...

  2. 23.MongoDB地理位置检索

    MongoDB地理位置检索 一.查询当前坐标附近的目标 @Testpublic void queryNear(){//1.以当前位置的经纬度为圆点GeoJsonPoint point = new Ge ...

  3. 基于百度地图的电子围栏的实现之地理位置检索

    在上前面电子围栏实现的基础添加地理位置检索的功能,即用户打开电子围栏设置时,根据想定位的地理位置来进行检索并在地图上进行标注.首先得在页面中动态的添加一个检索框,js实现代码如下: function ...

  4. mongoDB地理位置检索

    查询附近 @Test public void testNear() {//构造坐标点GeoJsonPoint point = new GeoJsonPoint(116.404, 39.915);//构 ...

  5. 七(7)探花功能-MongoDB地理位置查询-附近的人

    课程总结 1.探花功能 业务需求 执行过程 2.MongoDB的地理位置查询 地理位置查询的应用场景 查询案例 3.搜附近 上报地理位置 使用MongoDB搜索附近 一. 探花左划右滑 探花功能是将推 ...

  6. 【批量地点检索-高德百度地图地理编码对比】

    批量地点检索 基于python地理位置描述转经纬度坐标 前提: 需要安装部署python环境 安装导入模块: import requests import json import math 发送请求 ...

  7. 分布式图数据库在贝壳的应用实践

    导读:你想知道百亿级图谱如何实现毫秒级查询吗?社区众多的图数据库中如何才能挑选到一款适合实际应用场景的图数据库呢?贝壳找房的行业图谱480亿量级的三元组究竟是如何存储的呢?本文将带你探索上述问题并从中 ...

  8. solr学习之(七)_学习solr的理由(solr的特点和应用领域)

    Solr是一个可伸缩性的.能够即时部署的.致力于信息检索的.可以处理海量信息的.以处理自然语言文本为中心的.检索结果按相关性排序的企业级搜索引擎. Solr处理的业务需求有以下4个特点: 1.无结构化 ...

  9. mysql 轨迹数据存储_基于Tablestore实现海量运动轨迹数据存储-阿里云开发者社区...

    前言 现在越来越多的人都开始关心自己的运动数据,比如每日的计步.跑步里程.骑行里程等.运动APP与运动类的穿戴设备借助传感器.地图.GPS定位等技术,收集好运动数据以后,通过与互联网社交功能结合,产生 ...

最新文章

  1. FuseSeg:用于自动驾驶领域的RGB和热成像数据融合网络
  2. 使用awk获得java进程号,获取进程号并赋值判断进程状态
  3. Java+eclipse的配置
  4. 运维利器-ClusterShell集群管理操作记录
  5. mysql select操作
  6. linux nfs时间不对,NFS挂载主机或不稳定的原因与解决方法
  7. Spark SQL之DataFrame概述
  8. 0414-复利计算再升级
  9. (vue基础试炼_05)简单组件之间的传值
  10. Android Sqlite 数据库版本更新
  11. 虽然保持了连续代码生产量但是仔细想想也没什么必要
  12. 浅谈ViewState原理
  13. 数学计算机sci,有哪些是数学类SCI
  14. 分享8年开发经验,浅谈程序员职业规划
  15. 【清纯可爱女孩win7主题】
  16. Python人脸笑脸识别【人工智能】【CNN】
  17. 如何创建 Ubuntu 信息亭(kiosk)
  18. openfoam前处理:并行计算decomposeParDict和setFieldsDict
  19. 仿网易LOFTER视差滚动列表
  20. 【机器人】关于工业机器人控制系统,这几方面内容你必须掌握;中国3C电子智造行业优秀的机器人供应商推荐...

热门文章

  1. C#连接sqlserver数据库
  2. TZOJ 4865 统计单词数(模拟字符串)
  3. 如何静态添加toolbar到datagrid
  4. VS 2012 如何发布 ASP.NET 网站到本地IIS
  5. 提高jQuery执行效率
  6. Comperhend the OP-sizeof deeply!
  7. unity3d UGUI Scroll View的使用
  8. 程序员每周该做的事情!
  9. Android 多媒体------相机
  10. python简单的web服务器