随着移动设备与互联网的连接日益紧密,开发者们开始开发利用这一优势的应用程序。网络服务是这些应用中最受欢迎的技术之一。本文将介绍如何在Windows Phone应用中集成Bing地图服务,实现路线规划和显示功能。
要开发Windows Phone应用,需要安装Visual Studio for Windows Phone Express或Visual Studio 2010。
本应用将使用Bing地图来展示地图上两点之间的路线,并显示其长度。由于将重点放在网络服务上,可能会发现以下资源对开始操作Bing地图很有帮助:
假设已经从工具箱中拖放地图控件到主页面,并插入了以下与ApplicationBar相关的代码:
接下来,需要添加一些using语句来使用地图功能:
using Microsoft.Phone.Controls;
using Microsoft.Phone.Controls.Maps;
using System.Device.Location;
然后,可以编写以下代码:
Pushpin pin1 = new Pushpin();
Pushpin pin2 = new Pushpin();
MapPolyline poly = new MapPolyline();
为了在地图上显示Polyline,需要进行一些初始化:
poly.Locations = new LocationCollection();
poly.Opacity = 1.0;
poly.StrokeThickness = 3;
SolidColorBrush mySolidColorBrush = new SolidColorBrush();
mySolidColorBrush.Color = Colors.Green;
poly.Stroke = mySolidColorBrush;
现在,将开始使用网络服务。首先,右键点击项目并选择添加服务引用:
在地址字段中,粘贴以下路线网络服务的引用:
http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/mex
然后点击“Go”,服务将显示在“Services”字段中,以证明引用正确。
点击OK按钮后,项目中将生成一些文件。现在,可以通过引用使用该分布式服务。
private void showRoute_click(object sender, EventArgs e)
{
ServiceReference1.RouteServiceClient proxy = new ServiceReference1.RouteServiceClient("BasicHttpBinding_IRouteService");
ServiceReference1.RouteRequest rr = new ServiceReference1.RouteRequest();
rr.Credentials = new ServiceReference1.Credentials();
rr.Credentials.ApplicationId = "Asa2x7ZzhYIHauji6TzIkcf3TIDznTgBaPKQehsyE4taOz19Mx4fP4lyihqbTj7D";
rr.Options = new ServiceReference1.RouteOptions();
rr.Options.RoutePathType = ServiceReference1.RoutePathType.Points;
ServiceReference1.Waypoint wp1 = new ServiceReference1.Waypoint();
ServiceReference1.Waypoint wp2 = new ServiceReference1.Waypoint();
wp1.Location = new ServiceReference1.Location();
wp1.Location.Latitude = SharedInformation.myLatitude;
wp1.Location.Longitude = SharedInformation.myLongitude;
wp1.Description = "";
wp2.Location = new ServiceReference1.Location();
wp2.Location.Latitude = SharedInformation.pinLat;
wp2.Location.Longitude = SharedInformation.pinLong;
wp2.Description = "";
rr.Waypoints = new System.Collections.ObjectModel.ObservableCollection();
rr.Waypoints.Add(wp1);
rr.Waypoints.Add(wp2);
proxy.CalculateRouteAsync(rr);
proxy.CalculateRouteCompleted += new EventHandler(proxy_CalculateRouteCompleted);
}
在Windows Phone中调用网络服务是异步的,这就是为什么方法名的末尾添加了"Async"。这样可以避免界面线程被阻塞。
IntelliSense可以帮助显示从网络服务调用的不同方法及其完整签名。
网络服务返回的结果通过proxy_CalculateRouteCompleted方法的第二个参数返回,当从服务收到响应时,该方法将被执行。这个结果是一个点列表,它们将连接起来,使用polyline绘制需要显示的路线。
public void proxy_CalculateRouteCompleted(object obj, ServiceReference1.CalculateRouteCompletedEventArgs e)
{
try
{
foreach (ServiceReference1.Location location in e.Result.Result.RoutePath.Points)
{
poly.Locations.Add(new GeoCoordinate(location.Latitude, location.Longitude));
}
map1.Children.Add(poly);
pin2.Content = "It's " + e.Result.Result.Summary.Distance.ToString() + " Km far away!";
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
使用try catch块是因为服务可能会返回一些异常,例如点距离任何道路太远。