情境:
我希望用户看到地图及其当前位置。然后,如果他们点击“开始”,导航将开始,他们将看到他们的“路线”在他们的位置变化时被绘制到地图上,类似于一些健身应用程序如何工作以映射您的跑步/步行。目标是在用户的位置发生变化时实时执行此操作。
选项:
我看到它的方式有两种选择:1)从起始位置到下一个位置(当位置发生变化时)使用RouteQuery
和Map.AddRoute
,跟踪< em> 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个街区)然后沿着一条小路上的另一个街区(虽然整个时间我甚至没有开过一个街区,更不用说转弯!)。这非常离奇,绝对不准确。我可以上传截图,以便在需要时更好地说明。
任何人都可以在我的代码中看到我做错了什么,或者有更好的方法来实现这一目标吗?我不确定这是否是最好的方式,但我无法找到任何其他建议。
答案 0 :(得分: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);
之间画一条线。
{{1}}
答案 1 :(得分: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);
}