Bing Maps进阶系列四:路由功能服务(RouteService)
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
Bing Maps进阶系列四:路由功能服务(RouteService)的更多相关文章
- Bing Maps进阶系列一:初识Bing Maps地图服务
Bing Maps进阶系列一:初识Bing Maps地图服务 Bing Maps提供了一组WCF的地图服务,使用这些服务我们可以方便的在自己的应用系统里实现地理位置搜索等相关功能.他们分别是地理编码服 ...
- Bing Maps进阶系列三:使用地图图像服务(ImageryService)
Bing Maps进阶系列三:使用地图图像服务(ImageryService) 地图图像服务(ImageryService)提供了根据地理位置(经度和纬度)坐标和地图的缩放级别解析出对应于地图图片系统 ...
- Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身
Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身 Bing Maps Silverlight Control所提供的功能导航是非常强大的,在设计上对扩展的支持非常好,提供了许多用 ...
- Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图
Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图 OSM(OpenStreetMap-开放街道地图)服务就是一种发布自己地图数据图片为服务的一种实现类型,开放街道 ...
- Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图
Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方面的开 ...
- Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图
Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方便的开发模 ...
- Bing Maps进阶系列二:使用GeocodeService进行地理位置检索
Bing Maps进阶系列二:使用GeocodeService进行地理位置检索 在<Bing Maps进阶系列一:初识Bing Maps地图服务>里已经对GeocodeService的功能 ...
- Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps
Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps 在Bing Maps开发中,由于各种应用功能的不同,更多的时候用户可能需要将自己的一部分图片数据作为地图 ...
- 【Silverlight】Bing Maps学习系列(四):使用图钉层(Pushpin layer)及地图图层(MapLayer)(转)
[Silverlight]Bing Maps学习系列(四):使用图钉层(Pushpin layer)及地图图层(MapLayer) 如果我们需要在Bing Maps中加入一个小图钉标记,该如何实现了? ...
随机推荐
- vue组件---插槽
(1)插槽内容 Vue 实现了一套内容分发的 API,这套 API 的设计灵感源自 Web Components 规范草案,将 <slot> 元素作为承载分发内容的出口. 在父级组件里可以 ...
- 让元素div消失在视野中
让元素div消失在视野中1.position:absolute/relative/fixed + 方位 top/bottom/left/right: -9999px2.display:none3.vi ...
- UVA - 11214 Guarding the Chessboard(迭代加深搜索)
题目: 输入一个n*m的棋盘(n,m<10),某些格子有标记,用最少的皇后守卫(即占据或攻击)所有的标记的格子.输出皇后的个数. 思路: 一开始没有想到用迭代加深搜索,直接dfs结果还没写完就发 ...
- Humidex POJ - 3299 (数学)
题目大意 给定你三个变量中的两个输出剩下的那一个 题解 没有什么,就是把公式推出来即可,完全的数学题 代码 #include <iostream> #include <cmath&g ...
- [luogu4571 JSOI2009] 瓶子和燃料 (数论)
传送门 Solution 题目说的很迷,但可以发现两个瓶子互相倒最少是容积的gcd 那么题目就转化为求其中选k个瓶子gcd的最大值,这个可以分解因数,枚举因数得到 Code //By Menteur_ ...
- Linux学习笔记记录(补充)
- CCF201609-1 最大波动 java (100分)
试题编号: 201609-1 试题名称: 最大波动 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明正在利用股票的波动程度来研究股票.小明拿到了一只股票每天收盘时的价格,他 ...
- 微信小程序理解8大误区,你中招了吗?
2016年年底程序员话题中最火的是什么?莫过于微信小程序!小程序被炒得沸沸扬扬,再次证明一点,微信想让什么火,真的就能让什么火!这种能力真是全中国再也没有人有了,政府也没有.但是,小程序刚刚开始,你对 ...
- Spring MVC学习总结(8)——Swagger入门详解
前言 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.本文简单介绍了在项目中集成swagger的方法和一些常见问题.如果想深入分析项目源码,了解更多内容,见参考资料. S ...
- noip模拟赛 天天和不可描述
分析:直接就这么翻肯定是不行的,换一种想法:有括号就是把括号里的字符串倒着输出,如果在括号里又遇到了括号就继续倒着输出,相当于递归. 我们可以用递归直接做,也可以用一层循环搞定,每次从左括号跳到右括号 ...