如何使用GPS在Windows手机中的两个位置之间准确跟踪距离?

时间:2013-06-22 09:19:10

标签: c# .net windows-phone-7 windows-phone-8 bing-maps

我正在开发位置跟踪应用。应用程序在开头显示当前位置,之后显示的值不正确,代码如下所示。它在地图上绘制一条线(动画线),跟踪我们的位置,并显示错误的路径。虽然设备处于不变的位置,但它显示的是错误的值。我错过了什么吗?

 //code        

         public partial class Walk : PhoneApplicationPage
            {            
              private GeoCoordinateWatcher _watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
                private MapPolyline _line;
                private DispatcherTimer _timer = new DispatcherTimer();
                private long _startTime;       

                public Walk()
                {
                    InitializeComponent();

                    _line = new MapPolyline();
                    _line.StrokeColor = Colors.Red;
                    _line.StrokeThickness = 5;
                    Map.MapElements.Add(_line);

                    _watcher.Start();

                    _timer.Start();
                    _startTime = System.Environment.TickCount;

                    _watcher.PositionChanged += Watcher_PositionChanged;

                    _timer.Interval = TimeSpan.FromSeconds(1);
                    _timer.Tick += Timer_Tick;
                }

        private void Timer_Tick(object sender, EventArgs e)
                {
                    TimeSpan runTime = TimeSpan.FromMilliseconds(System.Environment.TickCount - _startTime);
                    timeLabel.Text = runTime.ToString(@"hh\:mm\:ss");
                }


         private double _kilometres;



                private long _previousPositionChangeTick;


                private void Watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
                {

                    var coord = new GeoCoordinate(e.Position.Location.Latitude, e.Position.Location.Longitude);

                    if (_line.Path.Count > 0)
                    {                
                        var previousPoint = _line.Path.Last();
                        var distance = coord.GetDistanceTo(previousPoint);
                        var millisPerKilometer = (1000.0 / distance) * (System.Environment.TickCount - _previousPositionChangeTick);
                        _kilometres += distance / 1000.0;               
                        paceLabel.Text = TimeSpan.FromMilliseconds(millisPerKilometer).ToString(@"mm\:ss");
                        distanceLabel.Text = string.Format("{0:f2} km", _kilometres);
                        caloriesLabel.Text = string.Format("{0:f0}", _kilometres * 65);

                        PositionHandler handler = new PositionHandler();
                        var heading = handler.CalculateBearing(new Position(previousPoint), new Position(coord));
                        Map.SetView(coord, Map.ZoomLevel, heading, MapAnimationKind.Parabolic);

              }
              else
              {
                Map.Center = coord;
              }

              _line.Path.Add(coord);
              _previousPositionChangeTick = System.Environment.TickCount;
            }          

            }  }
        }

1 个答案:

答案 0 :(得分:2)

原始位置几十米内的“错误值”是不是?如果是这样,你可能会看到的只是GPS的不准确性。

GPS不是100%准确。即使您的设备没有移动,设备的GPS 认为的位置也可能会发生变化。实际上,您计算的位置可能根本不是基于真正的GPS,而是基于Wi-Fi或附近的手机信号塔(A-GPS),两者都不太准确。

有关详细信息,请参阅this StackOverflow thread。出于调试目的,我建议在用户界面的某处显示HorizontalAccuracy以查看GPS漂移是否符合预期。