【问题标题】:Windows Phone 8.1 - Issue with calculating covered distanceWindows Phone 8.1 - 计算覆盖距离的问题
【发布时间】:2015-05-19 03:54:43
【问题描述】:

我正在编写一个实时计算覆盖距离的应用程序。我这样做是通过将我的实际位置与前一个位置进行比较并计算它们之间的距离(使用 Haversine 公式)并总结一切。这给了我一些结果,距离越来越远,一切似乎都在起作用。但问题在于准确性。我在一条约 15 公里长的路线上多次测试了这个应用程序,并且覆盖的距离总是比我的汽车计数器显示的要大。差异总是不同的——从 500 米到 2 公里不等。

这是我的地理定位器对象:

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 公里感到不高兴。

【问题讨论】:

    标签: c# geolocation windows-phone-8.1


    【解决方案1】:

    通过DesiredAccuracy = PositionAccuracy.High,您已经建议 Windows Phone 操作系统寻找最高精度。

    我认为你应该改变你的测距逻辑,看看它是否有效。

    按照以下答案中的建议使用GeoCoordinate.GetDistanceTo

    https://stackoverflow.com/a/6366657/744616

    【讨论】:

    • 很遗憾,我无法在 Windows Phone 8.1 中使用 GeoCoordinate 类。但我会尝试使用其中一个答案中的方法。感谢您的链接。
    • @Michal_Drwal 为什么不能使用 GeoCoordinate.GetDistanceTo?
    • 我不知道——当我输入这个类时,我唯一能做的就是“为 GeoCoordinate 生成类”。我想它不适用于 WP 8.1 RT 应用程序。
    • 你是否使用过System.Device.Location命名空间。它在建议的命名空间下定义。
    • “命名空间‘System’中不存在类型或命名空间名称‘Device’(您是否缺少程序集引用?)”这就是我得到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2018-02-13
    • 1970-01-01
    • 2015-11-13
    • 2023-03-26
    相关资源
    最近更新 更多