在位置发生变化时在Windows Phone 8地图上绘制路线?

lha*_*han 2 navigation maps windows-phone windows-phone-8

场景:

我希望用户看到地图及其当前位置.然后,如果他们点击"开始",导航将开始,他们将看到他们的"路线"在他们的位置变化时被绘制到地图上,类似于一些健身应用程序如何工作以映射您的跑步/步行.目标是在用户的位置发生变化时实时执行此操作.

选项:

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

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

这是我正在使用的代码:

XAML:

<maps:Map x:Name="MainMap" />
<Button x:Name="btnStart" Content="Start"/>
<Button x:Name="btnStop" Content="Stop" IsEnabled="False"/>
Run Code Online (Sandbox Code Playgroud)

代码隐藏:

全局变量:

GeoCoordinateWatcher watcher;
List<GeoCoordinate> listCoordinates;
GeoCoordinate lastCoordinate;
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

最后,RouteQueryCompleted():

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

怎么了:

当我开始驾驶时似乎工作了一秒钟,画了一条短线,我的起始位置是,然后大约10秒钟,一条线被随机地画在附近的一条街上(可能相当于3或4个街区长)然后在一条小路上的另一个街区(虽然整个时间我甚至都没有开过一个街区,更不用说转弯了!).这非常离奇,绝对不准确.我可以上传截图,以便在需要时更好地说明.

任何人都可以在我的代码中看到我做错了什么,或者有更好的方法来实现这一目标吗?我不确定这是否是最好的方式,但我无法找到任何其他建议.

lha*_*han 5

我最终MapPolyLine用来在最后一个GeoCoordinate和新一个之间画一条线.

MapPolyline line = new MapPolyline();
line.StrokeColor = Colors.Blue;
line.StrokeThickness = 15;
line.Path.Add(lastCoordinate);
line.Path.Add(pos);
MainMap.MapElements.Add(line);
Run Code Online (Sandbox Code Playgroud)