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

问题描述:

在 Windows Phone 8 中似乎有方法

In Windows Phone 8 there seems to be method

   GeoCoordinate.GetDistanceTo()

用于计算两个位置之间的距离.(即使 未找到该方法的参考页.)

for calculating distances between two locations. (Even if the reference page for the method is not found.)

但是在整个Windows Phone 8.1 地理定位命名空间?

我根本找不到计算两个位置之间距离的方法.

I can't find a method to calculate distance between two locations at all.

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

How to calculate distance between two locations in WP8.1?

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

GeoCoordinate.GetDistanceTo() is found in System.Device.Location namespace. But windows 8.1 (Runtime apps) apps use Windows.Devices.Geolocation namespace where GetDistanceTo() method is not present.

因此您可以使用Haversine 公式自己计算距离.这是维基百科Haversine页面,您可以从那里了解公式.

So you can calculate the distance yourself by using the Haversine formula. Here is the wikipedia Haversine page, you can know about the formula from there.

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

You can use the below C# code which uses Haversine formula to calculate the distance between two coordinates.

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;  
    }  
}