using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Teso_API.Models { /// /// The distance type to return the results in. /// public enum DistanceType { Miles, Kilometers }; /// /// Specifies a Latitude / Longitude point. /// public struct Position { public double Latitude; public double Longitude; } public class HaversineClass { /// /// Returns the distance in miles or kilometers of any two /// latitude / longitude points. /// /// /// /// /// 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; } /// /// Convert to Radians. /// /// /// private double toRadian(double val) { return (Math.PI / 180) * val; } } }