路由功能服務提供了兩個方法,分别是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,如需轉載請自行聯系原作者