我正在编写一个实时计算覆盖距离的应用。我通过将我的实际位置与前一个位置进行比较并计算它们之间的距离(使用Haversine公式)并将所有内容相加来做到这一点。这给了我一些结果,距离越来越大似乎一切正常。但问题在于准确性。我在一条长约15公里的路线上测试了这个应用程序,覆盖的距离总是大于我的车的计数器。差异总是不同 - 从500米到甚至2公里。
这是我的Geolocator对象:
Geolocator gl = new Geolocator() {
DesiredAccuracy = PositionAccuracy.High, MovementThreshold = 20, ReportInterval = 50
};
在构造函数中,我声明当位置改变时," OnPositionChanged"应该触发方法以及查找我的实际位置的方法:
gl.PositionChanged += OnPositionChanged;
setMyLocation();
这是" OnPositionChanged()"方法:
async private void OnPositionChanged(Geolocator sender, PositionChangedEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
setMyLocation();
});
}
这是setMyLocation()方法:
private async void setMyLocation()
{
try
{
p = new Position();
location = await gl.GetGeopositionAsync(TimeSpan.FromMinutes(5), TimeSpan.FromSeconds(5));
p.Latitude = location.Coordinate.Point.Position.Latitude;
p.Longitude = location.Coordinate.Point.Position.Longitude;
obla = location.Coordinate.Point.Position.Latitude;
oblo = location.Coordinate.Point.Position.Longitude;
if (prev_location.Latitude == 0)
{
prev_location = p;
}
positions.Add(new BasicGeoposition() {
Latitude = location.Coordinate.Latitude,
Longitude = location.Coordinate.Longitude
});
myMap.Children.Remove(myCircle);
myCircle = new Ellipse();
myCircle.Fill = new SolidColorBrush(Colors.Green);
myCircle.Height = 17;
myCircle.Width = 17;
myCircle.Opacity = 50;
myMap.Children.Add(myCircle);
MapControl.SetLocation(myCircle, location.Coordinate.Point);
MapControl.SetNormalizedAnchorPoint(myCircle, new Point(0, 0));
routeKM += (Distance(p, prev_location));
Distance_txt.Text = routeKM.ToString("f2") + " km";
prev_location = p;
}
catch
{
}
}
这是我用Haversine公式计算的双倍(routeKM):
public double Distance(Position pos1, Position pos2)
{
var R = 6371d; // Radius of the earth in km
var dLat = Deg2Rad(pos2.Latitude - pos1.Latitude); // deg2rad below
var dLon = Deg2Rad(pos2.Longitude - pos1.Longitude);
var a = Math.Sin(dLat / 2d) * Math.Sin(dLat / 2d) +
Math.Cos(Deg2Rad(pos1.Latitude)) * Math.Cos(Deg2Rad(pos2.Latitude)) *
Math.Sin(dLon / 2d) * Math.Sin(dLon / 2d);
var c = 2d * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1d - a));
var d = R * c; // Distance in km
return d;
}
double Deg2Rad(double deg)
{
return deg * (Math.PI / 180d);
}
所以我的问题是:如何提高准确性?我的车的柜台甚至比我的应用程序还要低2公里,我感到很高兴。
答案 0 :(得分:0)
通过DesiredAccuracy = PositionAccuracy.High
,你已经建议Windows Phone OS寻找最高的准确性。
我认为你应该改变你的距离发现逻辑,看它是否有效。
按照以下答案中的建议使用GeoCoordinate.GetDistanceTo
。