c# windows-phone-8 windows-phone-8.1 .net-4.5

c# - Cómo obtener distancia entre dos ubicaciones en Windows Phone 8.1



windows-phone-8 windows-phone-8.1 (1)

En Windows Phone 8 parece haber un método

GeoCoordinate.GetDistanceTo()

para calcular distancias entre dos ubicaciones. (Incluso si no se encuentra la página de referencia para el método).

Pero, ¿dónde está el equivalente en todo el espacio de nombres de Geolocalización de Windows Phone 8.1 ?

No puedo encontrar un método para calcular la distancia entre dos ubicaciones.

¿Cómo calcular la distancia entre dos ubicaciones en WP8.1?


GeoCoordinate.GetDistanceTo() se encuentra en el espacio de nombres System.Device.Location . Pero las aplicaciones de Windows 8.1 (aplicaciones en tiempo de ejecución) usan Windows.Devices.Geolocation namespace donde el método GetDistanceTo() no está presente.

Para que pueda calcular la distancia usted mismo usando la fórmula Haversine . Aquí está la página wikipedia de Haversine , puedes conocer la fórmula desde allí.

Puede usar el siguiente código C # que usa la fórmula Haversine para calcular la distancia entre dos coordenadas.

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