`
holoblog
  • 浏览: 1259423 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:19460
文章分类
社区版块
存档分类
最新评论

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。如下代码块:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->privateRouteServiceClientclient;
public
RouteServiceClientClient
{
get

{
if(client==null
)
{
booluriScheme=!Application.Current.IsRunningOutOfBrowser&&
HtmlPage.Document.DocumentUri.Scheme.Equals(Uri.UriSchemeHttps);
BasicHttpBindingbinding
=newBasicHttpBinding(uriScheme?
BasicHttpSecurityMode.Transport:BasicHttpSecurityMode.None);
binding.MaxReceivedMessageSize
=int
.MaxValue;
binding.MaxBufferSize
=int
.MaxValue;
UriBuilderuri
=newUriBuilder("http://dev.virtualearth.net/webservices/v1/RouteService/RouteService.svc"
);

if
(uriScheme)
{
uri.Scheme
=
Uri.UriSchemeHttps;
uri.Port
=-1
;
}

client
=newRouteServiceClient(binding,new
EndpointAddress(uri.Uri));
//调用完成后的事件处理函数

client.CalculateRouteCompleted+=newEventHandler<CalculateRouteCompletedEventArgs>(client_CalculateRouteCompleted);
}
return
client;
}
}

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

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->privatevoidbtnCalculateRoute_Click(objectsender,RoutedEventArgse)
{
varrequest
=new
RouteRequest();
request.Credentials
=new
Credentials();
request.Credentials.ApplicationId
="AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU"
;


//设置开始、结束坐标点

varwaypoints=newSystem.Collections.ObjectModel.ObservableCollection<Waypoint>
{
newWaypoint(){Description="成都",Location=newLocation(){Latitude=30.6666587469201,Longitude=104.062021177233}},
newWaypoint(){Description="重庆",Location=newLocation(){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、总结上面四点得出结论,通过调用路径检索接口得到路径点坐标后,通过在地图上绘制路径线路图,并在路径点上通过圆形标记。

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

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->privatevoidclient_CalculateRouteCompleted(objectsender,CalculateRouteCompletedEventArgse)
{
RouteResponserouteResponse
=
e.Result;
try

{
if(e.Result.ResponseSummary.StatusCode!=ResponseStatusCode.Success)
{
MessageBox.Show(
"错误的路由状态"
);
}
elseif(e.Result.Result.Legs.Count==0
)
{
MessageBox.Show(
"没找到路由规则"
);
}
else

{
//初始化路线线路点坐标及其他属性
MapPolylineline=newMapPolyline();
line.Locations
=new
LocationCollection();
line.Stroke
=new
SolidColorBrush(Colors.Blue);
line.Opacity
=0.66
;
line.StrokeThickness
=5
;

foreach(varpointin
e.Result.Result.RoutePath.Points)
{
line.Locations.Add(
new
Location(point.Latitude,point.Longitude));
}
RouteLayer.Children.Add(line);

//记录开始点和结束点

LocationRectrect=newLocationRect(line.Locations[0],line.Locations[line.Locations.Count-1]);

//遍历处理服务调用接口中的路程行程点,将各个行程点上绘制一个红色圆形标记

foreach(varitemine.Result.Result.Legs[0].Itinerary)
{
Ellipseellipse
=newEllipse(){Width=10,Height=10,Fill=newSolidColorBrush(Colors.Red),Opacity=0.66,Tag=
item};
Locationlocation
=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,如下代码块:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><m:MapCredentialsProvider="BingMaps开发Key"x:Name="map">
<m:MapLayerx: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

分享到:
评论

相关推荐

    bingmaps 开发实际例子

    在IT行业中,Bing Maps是一项强大的地图服务,由微软提供,它允许开发者集成地图功能到他们的应用程序中。在本案例中,我们将深入探讨如何利用Silverlight这一已退役但曾广泛用于构建富客户端应用的技术来操作Bing ...

    在wpf中使用bing地图控件

    此外,Bing Maps控件还支持路由计算和导航功能。通过调用`RouteService`类的相关方法,你可以计算两个或多个地点之间的最佳路径,并在地图上显示出来。 在实际开发中,可能还需要处理地图的点击事件、缩放事件等,...

    routeservice:内部服务路由的实现

    内部服务路由的实现 问题 对于一个业务接口服务它可以有多个实现类。对于使用者来说,需要指定它所使用的是哪一个实现。比如一个接口: 接口定义 interface DemoService{ void printStr(String str); } @Service(...

    arcgis-dynamic-segmentation-widget:此小部件提供了一个按钮,可与 Sterling Quinn 在 Esri 期间开发的 ArcGIS Server 动态分段服务器对象扩展配合使用

    动态分段小部件 警告:实验性的 此小部件提供了一个按钮,可以与 Esri 的 Sterling Quinn 开发的一起使用。 源代码可以在下载。 用法 在您的 ArcGIS Server ... routeService : routeService , layerId : 0 , tole

    mycat路由解析开发指南1

    在Mycat分布式数据库中间件中,路由解析是核心功能之一,它决定了SQL语句如何被正确地分发到后端的数据节点。本指南将详细介绍Mycat路由解析的过程,特别是针对DruidMysqlRouteStrategy的AST(抽象语法树)解析流程...

    Mycat从入门到精通之Mycat架构+Catlet分析.pptx

    - **RouteService**:路由服务提供了一种机制来根据SQL语句中的关键字或其他条件决定SQL语句应该发送到哪些数据库实例。 - **RouteStrategy**:不同的路由策略实现了对SQL语句的不同处理方式,如基于主键的路由、...

    mycat路由解析之Druid开发指南.docx

    1. **入口**:所有的路由解析均从`RouteService`类的`route`方法开始。 2. **HintHandler与RouteStrategy**:根据是否存在`hint`决定是使用`HintHandler`还是`RouteStrategy`进行路由解析。 - **HintHandler**:...

    angular学习之ngRoute路由机制

    3. **$routeService服务**:这个服务主要用于获取当前激活的路由信息,包括路由的配置对象、参数等。在控制器中,我们可以通过注入`$routeParams`来访问URL上的参数。 设置ngRoute的基本步骤如下: 1. 引入`...

    routeserviceAPI

    目标是创建一个服务,该服务可以使用与Google Maps API相同的输入和输出对地址进行地理编码,创建距离矩阵并在两个点之间进行路由。 建于 入门 要启动并运行本地副本,请遵循以下简单步骤。 安装 克隆仓库git clone...

    ArcGIS Runtime SDK for .NET(WPF)加载瓦片地图demo源码

    ArcGIS Runtime SDK for .NET提供了丰富的API,支持地图的显示、空间分析、地理编码、路由等功能。它允许开发者在本地或离线环境下创建GIS应用程序,支持多种编程语言,包括C#和VB.NET。WPF版本则专门针对Windows...

    百度地图 API 参考类

    - **RouteService**:提供路径规划服务,支持驾车、步行等多种出行方式。 #### 具体知识点解析 1. **Map** - **构造函数**:创建一个新的`Map`实例,初始化时可设置地图的中心位置和初始缩放级别。 ```...

    day27_综合案例31

    在JavaWeb开发中,综合案例"day27_综合案例31"主要关注的是旅游线路查询和线路详情功能的实现,这是两个关键的学习目标。下面将详细介绍这两个功能的实现过程及其涉及的技术点。 首先,我们来看线路查询功能。这...

    day27_综合案例3_docx1

    服务层的`RouteService`负责实际的数据库操作,通过`routeDao`接口查询总记录数,并根据参数构造`PageBean`对象,包含了当前页码、每页大小、总记录数以及数据集。 总结起来,这个综合案例主要讲解了如何在JavaWeb...

    day28_综合案例4_docx1

    这个案例主要涉及了四个关键部分:线路收藏的分析、判断是否收藏的后台处理、判断是否收藏的前端实现以及收藏次数的动态展示。 1.1 旅游线路收藏_分析 这部分主要讨论了如何设计和实现旅游线路收藏功能。首先,我们...

    Java Web项目之物流配货项目源码.zip

    例如,可能会有一个`OrderController`类处理与订单相关的请求,`RouteService`类进行路径优化,以及`CargoTracker`类用于货物跟踪。 在技术栈方面,该项目可能使用了以下技术: 1. **Servlet和JSP**:作为基础的...

Global site tag (gtag.js) - Google Analytics