【问题标题】:Draw route on Windows Phone 8 map as position changes?随着位置的变化,在 Windows Phone 8 地图上绘制路线?
【发布时间】:2013-09-06 01:25:05
【问题描述】:

场景:

我希望用户查看地图及其当前位置。然后,如果他们点击“开始”,导航将开始,他们会看到他们的“路线”随着位置的变化而绘制在地图上,类似于一些健身应用程序的工作方式,这些应用程序会绘制出你的跑步/步行地图。目标是随着用户位置的变化实时执行此操作。

选项:

在我看来,有两种选择:1)使用RouteQueryMap.AddRoute从起始位置到下一个位置(当位置改变时),跟踪last 位置,并始终从该位置绘制一个新的MapRoute 到新位置,或者 2) 将用户的当前位置显示为随着位置变化而移动的点,然后可能在他们按“停止”,为他们的每个位置画一个MapRoute,以显示他们的完整路线。

我真的更喜欢选项 #1,因为用户可以看到他们的路线进展等。

这是我正在使用的代码:

XAML:

<maps:Map x:Name="MainMap" />
<Button x:Name="btnStart" Content="Start"/>
<Button x:Name="btnStop" Content="Stop" IsEnabled="False"/>

代码隐藏:

全局变量:

GeoCoordinateWatcher watcher;
List<GeoCoordinate> listCoordinates;
GeoCoordinate lastCoordinate;

btnStart.Tap():

private void btnStart_Tap(object sender, GestureEventArgs e)
{
   if (watcher == null)
   {
      watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
      watcher.MovementThreshold = 20;
      watcher.StatusChanged += watcher_StatusChanged;
      watcher.PositionChanged += watcher_PositionChanged;
   }
   watcher.Start();
}

watcher.StatusChanged():

private void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
{
   switch (e.Status)
   {
      case GeoPositionStatus.Initializing:
         btnStart.IsEnabled = false;
         btnStop.IsEnabled = true;
         break;

      case GeoPositionStatus.NoData:
         lblStatus.Text = "location data is not available.";
         break;

      case GeoPositionStatus.Ready:
         lblStatus.Text = "location data is available.";
         break;
   }
}

watcher.PositionChanged():

void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
   if (listCoordinates == null)
   {
      // first time through:
      listCoordinates = new List<GeoCoordinate>();
      listCoordinates.Add(e.Position.Location);
      lastCoordinate = e.Position.Location;
      return;
   } 
   else 
   {
      listCoordinates.Add(e.Position.Location);
      DrawRoute(e.Position.Location);
      lastCoordinate = e.Position.Location;
   }
}

DrawRoute 函数:

private void DrawRoute(GeoCoordinate newPosition)//
{
   RouteQuery query = new RouteQuery()
   {
      TravelMode = TravelMode.Driving,
      Waypoints = new List<GeoCoordinate>() { MainMap.Center, newPosition }
   };
   query.QueryCompleted += RouteQueryCompleted;
   query.QueryAsync();
   MainMap.Center = newPosition;
   lastCoordinate = newPosition;
}

最后,RouteQueryCompleted():

void RouteQueryCompleted(object sender, QueryCompletedEventArgs<Route> e)
{
   mapRoute = new MapRoute(e.Result);
   MainMap.AddRoute(mapRoute);
}

会发生什么:

当我开始开车时,它似乎工作了一秒钟,在我的起始位置画了一条短线,但大约 10 秒后,一条线随机画在附近的街道上(可能相当于 3 或 4 个街区)长)然后在一条小路上再下一个街区(虽然我一直没有开过一个街区,更不用说转弯了!)。这很奇怪,而且绝对不准确。如果需要,我可以上传屏幕截图以更好地说明。

谁能看到我在我的代码中做错了什么,或者有更好的方法来完成这个吗?我不确定这是否是最好的方法,但我找不到任何其他建议的例子。

【问题讨论】:

    标签: windows-phone-8 navigation maps windows-phone


    【解决方案1】:

    我最终使用MapPolyLine 在最后一个GeoCoordinate 和新的GeoCoordinate 之间画了一条线。

    MapPolyline line = new MapPolyline();
    line.StrokeColor = Colors.Blue;
    line.StrokeThickness = 15;
    line.Path.Add(lastCoordinate);
    line.Path.Add(pos);
    MainMap.MapElements.Add(line);
    

    【讨论】:

      【解决方案2】:

      我不确定您为什么要使用 RouteQuery 来完成您的任务。通常,当您希望地图 sdk 在给定一组坐标的情况下为您确定路线时,您可以使用它。但是,在您的情况下,您始终可以通过 PositionChanged 事件知道您在哪里。移动时直接在地图上绘制会更容易。

      类似的东西

      void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) {
        Plot(e.Position.Location);
      }
      
      void Plot(GeoCoordinate pos) {
        var ellipse = new Ellipse();
        ellipse.Fill = new SolidColorBrush(System.Windows.Media.Colors.Blue);
        ellipse.Height = 15;
        ellipse.Width = 15;
        ellipse.Opacity = 25;
      
        var mapOverlay = new MapOverlay();
        mapOverlay.Content = ellipse;
        mapOverlay.PositionOrigin = new System.Windows.Point(0.5, 0.5);
        mapOverlay.GeoCoordinate = pos;
      
        var mapLayer = new MapLayer();
        mapLayer.Add(mapOverlay);
      
        MainMap.Layers.Add(mapLayer);
      }
      

      【讨论】:

      • 感谢您的回答。这更像是我上面的选项 2,但不是移动沿其当前位置移动的单个点,这不会为沿用户行进路线的每个位置(随着它的变化)绘制一个点吗?它看起来会更加专业 - 我的意见 - 如果它是一条坚实的连接线。你知道这是否可能吗?
      • 使用上面的代码,你实际上会得到一条你行进的路径。点的高度/宽度设置为 15,以便绘制的点实际上看起来像一条真实的线。你可以试试看。
      • 哦 - 我以为他们会很接近,但还没有尝试过。我会尽力让你知道!再次感谢。
      • 这确实有效,但前提是您已足够缩小。放大显示单个点,它们之间有空间。我现在打算这样做,但理想情况下,我仍然更喜欢实心的 line(无论缩放级别如何)。再次感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多