Windows phone 8 位置改变时在Windows Phone 8地图上绘制路线?

Windows phone 8 位置改变时在Windows Phone 8地图上绘制路线?,windows-phone-8,navigation,maps,windows-phone,Windows Phone 8,Navigation,Maps,Windows Phone,场景: 我想让用户看到地图和他们的当前位置。然后,如果他们单击“开始”,导航将开始,他们将看到他们的“路线”随着位置的变化绘制在地图上,类似于一些健身应用程序绘制跑步/步行路线的工作方式。目标是随着用户位置的变化实时执行此操作 选项: 在我看来,有两种选择:1)使用RouteQuery和Map。添加路线从起始位置到下一个位置(位置改变时),跟踪上一个位置,并始终从该位置到新位置绘制新的MapRoute,或者2)将用户的当前位置显示为一个随着位置变化而移动的点,然后当他们按“停止”时,为每个位置绘

场景:

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

选项:

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

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

下面是我正在使用的代码:

XAML:

watcher.StatusChanged():

watcher.PositionChanged():

void watcher\u位置已更改(对象发送器,地理位置更改Deventargs e)
{
如果(listCoordinates==null)
{
//首次通过:
listCoordinates=新列表();
列表坐标。添加(如位置、位置);
lastCoordinate=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;
}
private void DrawRoute(地理坐标新位置)//
{
RouteQuery=新建RouteQuery()
{
TravelMode=TravelMode.驾驶,
航路点=新列表(){MainMap.Center,newPosition}
};
query.QueryCompleted+=RouteQueryCompleted;
query.QueryAsync();
MainMap.Center=newPosition;
Last坐标=新位置;
}
最后,RouteQueryCompleted()

void RouteQueryCompleted(对象发送方,QueryCompletedEventArgs e)
{
mapRoute=新的mapRoute(如结果);
MainMap.AddRoute(mapRoute);
}
发生了什么:

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


有没有人能看到我在代码中做错了什么,或者有没有更好的方法来实现这一点?我不确定这是否是最好的方法,但我找不到任何相反的例子

我不知道您为什么要使用
RouteQuery
执行任务。通常,当您希望map sdk在给定一组坐标的情况下为您确定路线时,可以使用此选项。然而,在您的情况下,通过
PositionChanged
事件,您总是知道自己在哪里。移动时直接在地图上绘图会更容易

像这样的

void watcher\u位置已更改(对象发送器,地理位置更改Deventargs e){
绘图(如位置、位置);
}
空心图(地理坐标位置){
var椭圆=新椭圆();
ellipse.Fill=新的SolidColorBrush(System.Windows.Media.Colors.Blue);
椭圆。高度=15;
椭圆。宽度=15;
椭圆,不透明度=25;
var mappoverlay=新的mappoverlay();
内容=椭圆;
mapOverlay.PositionOrigin=新系统.Windows.Point(0.5,0.5);
mapOverlay.GeoCoordinate=pos;
var mapLayer=新的mapLayer();
添加(mapOverlay);
MainMap.Layers.Add(mapLayer);
}

最后,我使用
MapPolyLine
在上一个
地理坐标
和新坐标之间画了一条线

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

谢谢你的回答。这更像我上面的选项2,但不是移动一个沿着当前位置移动的点,而是沿着用户行进的路线为每个位置(随着位置的变化)绘制一个点吗?我的观点是,如果这是一条坚实的、相互关联的线路,它看起来会更加专业。你知道这是否可行吗?通过上面的代码,你会得到一条你所走的路线。点的高度/宽度设置为15,这样打印的点实际上看起来像一条实线。你可以试试看。哦,我以为他们会很近,但还没试过。我会尽力让你知道的!再次感谢。这确实有效,但前提是你足够放大。放大显示各个点之间的间距。我现在要用这个,但理想情况下,我还是更喜欢实心的线条(无论缩放级别如何)。再次感谢!
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();
}
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;
   }
}
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;
   }
}
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;
}
void RouteQueryCompleted(object sender, QueryCompletedEventArgs<Route> e)
{
   mapRoute = new MapRoute(e.Result);
   MainMap.AddRoute(mapRoute);
}
MapPolyline line = new MapPolyline();
line.StrokeColor = Colors.Blue;
line.StrokeThickness = 15;
line.Path.Add(lastCoordinate);
line.Path.Add(pos);
MainMap.MapElements.Add(line);