博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bing Maps进阶系列四:路由功能服务(RouteService)
阅读量:6337 次
发布时间:2019-06-22

本文共 4545 字,大约阅读时间需要 15 分钟。

 Bing Maps提供的路由功能服务(RouteService)可以实现多方位的计算地图上的路线指示,路径行程等功能,比如说实现驾驶路线和地点,旅游航线等。可以通过该服务的地址( )添加该服务的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
>
 
   编译运行最终的效果如下图所示:
        
 
 
本文转自 beniao 51CTO博客,原文链接:http://blog.51cto.com/beniao/285195,如需转载请自行联系原作者
你可能感兴趣的文章
【福利大放送】不止是Android,Github超高影响力开源大放送,学习开发必备教科书...
查看>>
SQL语句
查看>>
Struts2中带参数的结果集
查看>>
关于json与protobuf的材料
查看>>
tree -L n
查看>>
C语言 · 明明的随机数
查看>>
Java关键字final、static使用总结
查看>>
PHPWIND和DISCUZ什么区别?
查看>>
servlet监听器
查看>>
android电池(四):电池 电量计(MAX17040)驱动分析篇【转】
查看>>
开源OSS.Social微信项目进阶介绍
查看>>
vim详解
查看>>
sql查询与修改数据库逻辑文件名,移动数据库存储路径
查看>>
dpkg命令的用法
查看>>
Kibana安装(图文详解)(多节点的ELK集群安装在一个节点就好)
查看>>
算法笔记_118:算法集训之结果填空题集二(Java)
查看>>
Win10系列:UWP界面布局基础12
查看>>
蓝牙(CoreBluetooth)-概述
查看>>
使用delphi 10.2 开发linux 上的Daemon
查看>>
LA 5009 (HDU 3714) Error Curves (三分)
查看>>