如何在Windows Phone 8.1中获取两个位置之间的距离

时间:2015-02-17 19:10:52

标签: c# windows-phone-8 windows-phone-8.1 .net-4.5

在Windows Phone 8中似乎有方法

   GeoCoordinate.GetDistanceTo()

用于计算两个位置之间的距离。 (即使找不到该方法的the reference page。)

但整个Windows Phone 8.1 Geolocation namespace中的等价物在哪里?

我无法找到一种方法来计算两个位置之间的距离。

如何计算WP8.1中两个位置之间的距离?

1 个答案:

答案 0 :(得分:8)

GeoCoordinate.GetDistanceTo()命名空间中找到

System.Device.Location。但是Windows 8.1(运行时应用程序)应用程序使用Windows.Devices.Geolocation命名空间,其中GetDistanceTo()方法不存在。

因此,您可以使用 Haversine公式来自行计算距离。这是wikipedia Haversine page,您可以从那里了解公式。

您可以使用以下C#代码,该代码使用Haversine公式计算两个坐标之间的距离。

using System;  
namespace HaversineFormula  
{  
/// <summary>  
/// The distance type to return the results in.  
/// </summary>  
public enum DistanceType { Miles, Kilometers };  
/// <summary>  
/// Specifies a Latitude / Longitude point.  
/// </summary>  
public struct Position  
{  
    public double Latitude;  
    public double Longitude;  
}  
class Haversine  
{  
    /// <summary>  
    /// Returns the distance in miles or kilometers of any two  
    /// latitude / longitude points.  
    /// </summary>  
    public double Distance(Position pos1, Position pos2, DistanceType type)  
    {  
        double R = (type == DistanceType.Miles) ? 3960 : 6371;  
        double dLat = this.toRadian(pos2.Latitude - pos1.Latitude);  
        double dLon = this.toRadian(pos2.Longitude - pos1.Longitude);  
        double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +  
            Math.Cos(this.toRadian(pos1.Latitude)) * Math.Cos(this.toRadian(pos2.Latitude)) *  
            Math.Sin(dLon / 2) * Math.Sin(dLon / 2);  
        double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)));  
        double d = R * c;  
        return d;  
    }  
    /// <summary>  
    /// Convert to Radians.  
    /// </summary>  
    private double toRadian(double val)  
    {  
        return (Math.PI / 180) * val;  
    }  
}