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

  Bing Maps提供的路由功能服务(RouteService)可以实现多方位的计算地图上的路线指示,路径行程等功能,比如说实现驾驶路线和地点,旅游航线等。可以通过该服务的地址(http://dev.virtualearth.net/WebServices/v1/RouteService/RouteService.svc)添加该服务的Web服务引用。

        

  路由功能服务提供了两个方法,分别是CalculateRoute()和CalculateRoutesFormMajorRoads(),其实现的功能分别如下:

  1、CalculateRoute:计算路径并返回指定的路径行程,以及路径的其他相关路径数据(包括道路名称,行程方法等等)。

  2、CalculateRoutesFormMajorRoads:计算指定地理位置点或路径方向,以及附近的道路信息。

  为了更加清楚的介绍路由功能服务的接口使用方法,下面将通过一个实例来介绍路由服务接口的详细应用。需要实现从成都到重庆的路由检索,然后标记处从成都到重庆的路程行程图和中途经度地市的行程点。

  通过前面对路由功能服务(RouteService)添加了服务引用,Silverlight客户端就会自动生成该服务的客户端代理对象,在实现上面所提出的实例需求前先对RouteServiceClient进行一下封装,并指定了调用接口完成后事件处理函数:client_CalculateRouteCompleted。如下代码块:


private RouteServiceClient client;
public RouteServiceClient Client
{
    get 
    {
        if (client == null)
        {
            bool uriScheme = !Application.Current.IsRunningOutOfBrowser && HtmlPage.Document.DocumentUri.Scheme.Equals(Uri.UriSchemeHttps);
            BasicHttpBinding binding = new BasicHttpBinding(uriScheme ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None);
            binding.MaxReceivedMessageSize = int.MaxValue;
            binding.MaxBufferSize = int.MaxValue;
            UriBuilder uri = new UriBuilder("http://dev.virtualearth.net/webservices/v1/RouteService/RouteService.svc");             if (uriScheme)
            {
                uri.Scheme = Uri.UriSchemeHttps;
                uri.Port = -1;
            }             client=new RouteServiceClient(binding,new EndpointAddress(uri.Uri));
            //调用完成后的事件处理函数
            client.CalculateRouteCompleted +=new EventHandler<CalculateRouteCompletedEventArgs>(client_CalculateRouteCompleted);
        } 
        return client;
    }
}

  路由检索接口的调用非常简单,要想检索出那几个地点之间的路径行程只需要将地点所对应地理位置坐标(经度和纬度)传递给路由请求对象就可以了。详细如下代码块:


private void btnCalculateRoute_Click(object sender, RoutedEventArgs e)
{
    var request = new RouteRequest();
    request.Credentials = new Credentials();
    request.Credentials.ApplicationId = "AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU";     //设置开始、结束坐标点
    var waypoints = new System.Collections.ObjectModel.ObservableCollection<Waypoint>
    {
        new Waypoint(){Description="成都",Location=new Location(){Latitude=30.6666587469201,Longitude=104.062021177233}},
        new Waypoint(){Description="重庆",Location=new Location(){Latitude=29.5076372217973,Longitude=106.489384971208}},
    };
    request.Waypoints = waypoints;
    request.ExecutionOptions = new ExecutionOptions();
    request.ExecutionOptions.SuppressFaults = true;
    request.Options = new RouteOptions();
    request.Options.RoutePathType = RoutePathType.Points;     Client.CalculateRouteAsync(request);
}

  如上代码块中定义,通过构造好了成都和重庆的两点地理坐标给路由请求对象(RouteRequest)的路径途经点(Waypoint),然后调用路由功能服务接口方法实现路径行程线检索。最终接口的返回值就交给了上面RouteServiceClient中封装过程中指定的结果处理事件函数去处理了,这里需要分析清楚几点。

  1、在接口请求完成事件处理函数里能够获取到请求响应结果(RouteResponse),包括状态,规则,路径点等一系列结果参数。

  2、可以通过规则检测或获取两点或多个路程点之间的路径点数量。

  3、知道路径点(既经过点的地理位置坐标),可以通过在地图上绘制不估计值线条表示出路线图。

  4、可以在路径点上通过某种特殊的符号标记为路径是通过了该路径点的,比如用圆形、三角形或者一张有特殊意义的图片等。

  5、总结上面四点得出结论,通过调用路径检索接口得到路径点坐标后,通过在地图上绘制路径线路图,并在路径点上通过圆形标记。

  通过上面的分析,几乎已经将下面要做的事情用汉语描述清楚了,下面代码块则是实现上面五点的程序代码:


private void client_CalculateRouteCompleted(object sender, CalculateRouteCompletedEventArgs e)
{
    RouteResponse routeResponse = e.Result;
    try
    {
        if (e.Result.ResponseSummary.StatusCode != ResponseStatusCode.Success)
        {
            MessageBox.Show("错误的路由状态");
        }
        else if (e.Result.Result.Legs.Count == 0)
        {
            MessageBox.Show("没找到路由规则");
        }
        else
        {
            //初始化路线线路点坐标及其他属性
            MapPolyline line = new MapPolyline();
            line.Locations = new LocationCollection();
            line.Stroke = new SolidColorBrush(Colors.Blue);
            line.Opacity = 0.66;
            line.StrokeThickness = 5;             foreach (var point in e.Result.Result.RoutePath.Points)
            {
                line.Locations.Add(new Location(point.Latitude, point.Longitude));
            }
            RouteLayer.Children.Add(line);             //记录开始点和结束点
            LocationRect rect = new LocationRect(line.Locations[0], line.Locations[line.Locations.Count - 1]);             //遍历处理服务调用接口中的路程行程点,将各个行程点上绘制一个红色圆形标记
            foreach (var item in e.Result.Result.Legs[0].Itinerary)
            {
                Ellipse ellipse = new Ellipse() { Width = 10, Height = 10, Fill = new SolidColorBrush(Colors.Red), Opacity = 0.66, Tag = item };
                Location location = new Location(item.Location.Latitude, item.Location.Longitude);
                MapLayer.SetPosition(ellipse, location);
                MapLayer.SetPositionOrigin(ellipse, PositionOrigin.Center);                 RouteLayer.Children.Add(ellipse);
            }
            map.SetView(rect);
        }
    }
    catch (Exception)
    {
        MessageBox.Show("路由解析过程中出现异常");
    }
}

程序代码里使用到的RouteLayer是在地图控件里加入了一个MapLaye图层,r专门用来呈现的路径行程图和路径标记,直接使用Bing Maps Silverlight Control提供的MapLayer,如下代码块:

<m:Map CredentialsProvider="Bing Maps 开发 Key" x:Name="map">
    <m:MapLayer x:Name="RouteLayer"></m:MapLayer>
</m:Map>

  编译运行最终的效果如下图所示:

        

  如果您想了解更多关于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进阶系列四:路由功能服务(RouteService)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 【Silverlight】Bing Maps学习系列(四):使用图钉层(Pushpin layer)及地图图层(MapLayer)(转)

    [Silverlight]Bing Maps学习系列(四):使用图钉层(Pushpin layer)及地图图层(MapLayer) 如果我们需要在Bing Maps中加入一个小图钉标记,该如何实现了? ...

随机推荐

  1. DeepCloneObjects 和 DeepClone

    ARX AcDbDatabase 中的方法 deepCloneObjects() 和 wblock() 区别以及和 AcDbObject 方法 clone() 和 deepClone() 的关系 Ac ...

  2. 创建一个 Vue 的实例

    每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue 实例开始的: var vm = new Vue({         // 选项 }) 选项:el.data.methods el: 类型: ...

  3. python队列的实现

    队列是一种抽象数据结构,具有以下特点: (1)具有先进先出的特性(FIFO) (2)拥有两种基本操作,即加入和删除,而且使用front和rear两个指针来分别指向队列的前端和末尾. 队列的基本操作 c ...

  4. A5. JVM 如何判断GC对象

    [概述] 在堆里面存放着 Java 世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还 “存活” 着,哪些已经 “死去”(即不可能再被任何途径使用的对象). ...

  5. 在TWaver的Tree节点上画线

    论坛上有同学提出如何在tree上画引导线,之前我们Flex已经实现此功能,现在最新版的HTML5也将添加此功能.先看看效果:详细的使用方法可以参考我们开发手册中可视化视图组件#Tree引导线一章,下面 ...

  6. Vue.js 观察者(watch)

    Vue.js 观察者(watch) watch 属性用于监视 vue 实例上的数据变动,并相应的改变其他变量的值. 用法 实例 1 <!DOCTYPE html> <html> ...

  7. Luogu P3797 妖梦斩木棒

    解题思路 用线段树做这个就不用说了吧,但是要维护的东西确实很神奇.在每一个节点上都维护一个$lbkt$,表示这个区间上最靠左的右括号的位置:一个$rbkt$,表示这个区间上最靠右的左括号的位置.还有一 ...

  8. mysql5.7报Access denied for xxx@localhost 的解决

    使用root用户登录mysql数据库若如下报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor ...

  9. Linux学习笔记记录(六)

  10. Django DTL模板语法中的过滤器

    template_filter_demo 过滤器相关: 一.形式:小写{{ name | lower }} 二.串联:先转义文本到HTML,再转换每行到 <p> 标签{{ my_text| ...