1(共 1)对本文的评价是有帮助 - 评价此主题

如何在 Windows Phone 8 中的地图中显示路线和方向

2013/12/5

适用于:仅限于 Windows Phone 8。

本主题介绍如何能够显示从手机的当前位置到 Windows Phone 8 地图中的指定位置的线路和方向。

考虑添加文本到语音转换输出的可能性。有关更多信息,请参见 Windows Phone 的文本到语音转换 (TTS)

获取手机的当前位置

  1. 在 Visual Studio Express 2012 for Windows Phone 中创建新的 Windows Phone 8 项目。

  2. MainPage.xaml.csMainPage 类中添加以下代码以获取手机的当前位置。此代码将手机当前的位置坐标添加到 MyCoordinates

    
    public partial class MainPage : PhoneApplicationPage
    {
       List<GeoCoordinate> MyCoordinates = new List<GeoCoordinate>();
       
       // Constructor.
       public MainPage()
       {
          InitializeComponent();
          this.GetCoordinates();
       }
    
       private async void GetCoordinates()
       {
          // Get the phone's current location.
          Geolocator MyGeolocator = new Geolocator();
          MyGeolocator.DesiredAccuracyInMeters = 5;
          Geoposition MyGeoPosition = null;
          try
          {
             MyGeoPosition = await MyGeolocator.GetGeopositionAsync(TimeSpan.FromMinutes(1), TimeSpan.FromSeconds(10));
          }
          catch (UnauthorizedAccessException)
          {
             MessageBox.Show("Location is disabled in phone settings");
          }
          catch (Exception ex)
          {
             // Something else happened while acquiring the location.
          }
          MyCoordinates.Add(new GeoCoordinate(MyGeoPosition.Coordinate.Latitude, MyGeoPosition.Coordinate.Longitude));
    
       }     
         }
    

显示从手机的当前位置到地图中某一位置的路线。

  1. MainPage.xaml 中,在名为 ContentPanel 的网格下添加 Map 控件,如以下代码所示。有关添加 Map 控件的更多信息,请参见如何将地图控件添加到 Windows Phone 8 中的页面中

    <maps:Map x:Name="MyMap" Grid.Row="1" Center="47.603848, -122.029953" ZoomLevel="11"/>
    
  2. MainPage.xaml.csMainPage 类中创建以下成员变量。

    
    RouteQuery MyQuery = null;
    GeocodeQuery Mygeocodequery = null;
    
  3. GetCoordinates() 方法中,添加以下代码。此代码将用户输入的目标地址设置为 SearchTerm 属性,然后将该地址转换为地理坐标。随后,地理坐标被设置为 GeocodeQuery.GeoCoordinate 属性。

    
    Mygeocodequery = new GeocodeQuery();
    Mygeocodequery.SearchTerm = "Seattle, WA";
    Mygeocodequery.GeoCoordinate = new GeoCoordinate(MyGeoPosition.Coordinate.Latitude, MyGeoPosition.Coordinate.Longitude);
    

    在该代码示例中,将手机当前位置的坐标作为搜索提示提供给查找目的地的查询。假设手机的当前位置为华盛顿雷德蒙德市,距指定目的地(华盛顿西雅图市)不远。

  4. 将名为 Mygeocodequery_QueryCompleted 的事件处理程序添加到 QueryCompleted 事件,并调用 QueryAsync 方法。此代码创建一个新的 RouteQuery 对象,并将当前指定目标的坐标存储在其 Waypoints 属性中。它还将名为 MyQuery_QueryCompleted 事件处理程序添加到 QueryCompleted 事件。

    
    Mygeocodequery.QueryCompleted += Mygeocodequery_QueryCompleted;
    Mygeocodequery.QueryAsync();
    
  5. Mygeocodequery_QueryCompleted 事件处理程序中,添加以下代码。

    
    void Mygeocodequery_QueryCompleted(object sender, QueryCompletedEventArgs<IList<MapLocation>> e)
    {
       if (e.Error == null)
       {
          MyQuery = new RouteQuery();
          MyCoordinates.Add(e.Result[0].GeoCoordinate);
          MyQuery.Waypoints = MyCoordinates;
          MyQuery.QueryCompleted += MyQuery_QueryCompleted;
          MyQuery.QueryAsync();
          Mygeocodequery.Dispose();
       }
    }
    
  6. MyQuery_QueryCompleted 事件处理程序中,添加以下代码。它将在地图上 MyCoordinates 中的两个地理坐标之间添加线路。

    
    void MyQuery_QueryCompleted(object sender, QueryCompletedEventArgs<Route> e)
    {
       if (e.Error == null)
       {
          Route MyRoute = e.Result;
          MapRoute MyMapRoute = new MapRoute(MyRoute);
          MyMap.AddRoute(MyMapRoute);
          MyQuery.Dispose();
       }
    }
    

显示从手机的当前位置到地图中某一位置的方向。

  1. MainPage.xaml 中,添加以下代码以在现有地图控件下创建 LongListSelector 控件。这将用于显示两个位置之间的方向。

    
    <phone:PhoneApplicationPage.Resources>
       <DataTemplate x:Key="RouteListTemplate">
          <TextBlock Text="{Binding}" FontSize="{StaticResource PhoneFontSizeMedium}" Margin="5,5,0,0"/>
       </DataTemplate>
    </phone:PhoneApplicationPage.Resources>
        
    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
       <Grid.RowDefinitions>
          <RowDefinition Height="auto"/>
          <RowDefinition Height="*"/>
          <RowDefinition Height="auto"/>
          <RowDefinition Height="*"/>
       </Grid.RowDefinitions>
       <TextBlock Text="Map Route" Grid.Row="0" FontSize="{StaticResource PhoneFontSizeLarge}" Margin="0,0,0,20"/>
       <maps:Map x:Name="MyMap" Grid.Row="1" Center="47.603848, -122.029953" ZoomLevel="11"/>
       <TextBlock Text="Route Directions" Grid.Row="2" FontSize="{StaticResource PhoneFontSizeLarge}" Margin="0,10,0,20"/>
       <phone:LongListSelector x:Name="RouteLLS" Grid.Row="3" Background="Transparent" ItemTemplate="{StaticResource RouteListTemplate}" LayoutMode="List" 
          IsGroupingEnabled="False"/>
    </Grid>
    
  2. MainPage.cs 中,将以下代码添加到 MyQuery_QueryCompleted 事件处理程序以显示两个位置之间的线路。

    
    void MyQuery_QueryCompleted(object sender, QueryCompletedEventArgs<Route> e)
    {
       if (e.Error == null)
       {
          Route MyRoute = e.Result;
          MapRoute MyMapRoute = new MapRoute(MyRoute);
          MyMap.AddRoute(MyMapRoute);
          List<string> RouteList = new List<string>();
          foreach (RouteLeg leg in MyRoute.Legs)
          {
             foreach (RouteManeuver maneuver in leg.Maneuvers)
             {
                RouteList.Add(maneuver.InstructionText);
             }
          }
    
          RouteLLS.ItemsSource = RouteList;
          MyQuery.Dispose();
       }
    }
    

    以下屏幕快照显示了本主题中所用示例的结果。

    Route and Directions in a Map control

本文是否对您有所帮助?
(1500 个剩余字符)
感谢您的反馈
显示:
© 2014 Microsoft. 版权所有。