Windows Phone 应用开发:使用Bing地图服务

随着移动设备与互联网的连接日益紧密,开发者们开始开发利用这一优势的应用程序。网络服务是这些应用中最受欢迎的技术之一。本文将介绍如何在Windows Phone应用中集成Bing地图服务,实现路线规划和显示功能。

开发环境要求

要开发Windows Phone应用,需要安装Visual Studio for Windows Phone Express或Visual Studio 2010。

应用概述

本应用将使用Bing地图来展示地图上两点之间的路线,并显示其长度。由于将重点放在网络服务上,可能会发现以下资源对开始操作Bing地图很有帮助:

  • Bing Maps
  • Bing Maps v2

应用界面设计

假设已经从工具箱中拖放地图控件到主页面,并插入了以下与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块是因为服务可能会返回一些异常,例如点距离任何道路太远。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485