/// <summary> /// Calculates the distance between 2 GPS coordinates using Haversine formula (http://en.wikipedia.org/wiki/Haversine_formula) /// This method is overloaded and this version uses string as input for GPS coordinates /// Note: This calculated method ignores the change in elevation /// </summary> /// <param name="lat1S">Latitude of first GPS coordinate as a string</param> /// <param name="lon1S">Longitude of first GPS coordinate as a string</param> /// <param name="lat2S">Latitude of second GPS coordinate as a string</param> /// <param name="lon2S">Longitude of second GPS coordinate as a string</param> /// <param name="distanceUnit">Measurement unit km/Miles</param> /// <returns>Calculated distance</returns> public static Double getCoordDistance(String lat1S, String lon1S, String lat2S, String lon2S, calculatorDistanceUnits distanceUnit) { Double lat1 = Double.Parse(lat1S, CultureInfo.InvariantCulture); Double lon1 = Double.Parse(lon1S, CultureInfo.InvariantCulture); Double lat2 = Double.Parse(lat2S, CultureInfo.InvariantCulture); Double lon2 = Double.Parse(lon2S, CultureInfo.InvariantCulture); return getCoordDistance(lat1, lon1, lat2, lon2, distanceUnit); }
/// <summary> /// Calculates the distance between 2 GPS coordinates using Haversine formula (http://en.wikipedia.org/wiki/Haversine_formula) /// This method is overloaded and this version uses Double as input for GPS coordinates /// Note: This calculated method ignores the change in elevation /// </summary> /// <param name="lat1">Latitude of first GPS coordinate as Double</param> /// <param name="lon1">Longitude of first GPS coordinate as Double</param> /// <param name="lat2">Latitude of second GPS coordinate as Double</param> /// <param name="lon2">Longitude of second GPS coordinate as Double</param> /// <param name="distanceUnit">Measurement unit km/Miles</param> /// <returns>Calculated distance</returns> public static Double getCoordDistance(Double lat1, Double lon1, Double lat2, Double lon2, calculatorDistanceUnits distanceUnit) { /* * dlon = lon2 - lon1 * dlat = lat2 - lat1 * a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2 * c = 2 * atan2(sqrt(a), sqrt(1-a)) * d = R * c */ Double dist = 0; Double radius; // Set the radius to either km or Miles if (calculatorDistanceUnits.Kilometers == distanceUnit) radius = earthRadiusInKM; else radius = earthRadiusInMiles; // Step-1: dlon = lon2 - lon1 Double dlon = toRadian((Double)(lon2 - lon1)); //Decimal.Subtract(lon2, lon1); // Step-2: dlat = lat2 - lat1 Double dlat = toRadian((Double)(lat2 - lat1)); //Decimal.Subtract(lon2, lon1); // Step-3: a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2 Double a = Math.Pow(Math.Sin(dlat / 2), 2) + Math.Pow(Math.Sin(dlon / 2), 2) * Math.Cos(toRadian(lat1)) * Math.Cos(toRadian(lat2)); // Step-4: c = 2 * atan2(sqrt(a), sqrt(1-a)) Double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)); // Step-5: d = R * C dist = radius * c; return dist; }