簡體   English   中英

Windows Phone 8.1-計算覆蓋距離的問題

[英]Windows Phone 8.1 - Issue with calculating covered distance

我正在編寫一個可實時計算覆蓋距離的應用程序。 我這樣做是通過將我的實際位置與上一個位置進行比較,並計算它們之間的距離(使用Haversine公式),並對所有內容進行匯總。 這給了我一些結果,距離越來越近,一切似乎都在起作用。 但是問題在於准確性。 我在大約15公里長的路線上測試了此應用多次,覆蓋的距離始終大於我的汽車櫃台所說的距離。 區別總是在-從500m到2km。

這是我的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公式計算得出的double(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公里感到不滿意。

通過執行DesiredAccuracy = PositionAccuracy.High您已經建議Windows Phone OS尋求最高的准確性。

我認為您應該更改測距邏輯,看看是否可行。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM