public double GetBearing(GeoMapPoint point) { var dLon = (point.Longitude - Longitude).ToRad(); var y = Math.Sin(dLon) * Math.Cos(point.Latitude.ToRad()); var x = Math.Cos(Latitude.ToRad()) * Math.Sin(point.Latitude.ToRad()) - Math.Sin(Latitude.ToRad()) * Math.Cos(point.Latitude.ToRad()) * Math.Cos(dLon); return(Math.Atan2(y, x).ToBearing()); }
public double GetDistanceInKm(GeoMapPoint point) { var dLat = (point.Latitude - Latitude).ToRad(); var dLon = (point.Longitude - Longitude).ToRad(); var a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(Latitude.ToRad()) * Math.Cos(point.Latitude.ToRad()) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2); var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)); return(EarthRadius * c); }
public string GetCardinalPoint(GeoMapPoint point) { var bearing = GetBearing(point); if (bearing >= 0 && bearing < 22.5) { return("N"); } if (bearing >= 22.5 && bearing < 67.5) { return("NE"); } if (bearing >= 67.5 && bearing < 112.5) { return("E"); } if (bearing >= 112.5 && bearing < 157.5) { return("SE"); } if (bearing >= 157.5 && bearing < 202.5) { return("S"); } if (bearing >= 202.5 && bearing < 247.5) { return("SW"); } if (bearing >= 247.5 && bearing < 292.5) { return("W"); } if (bearing >= 292.5 && bearing < 337.5) { return("NW"); } if (bearing >= 337.5 && bearing < 360.1) { return("N"); } return(string.Empty); }
/// <summary> /// Gets the distance in miles between two GeoMapPoint /// </summary> /// <param name="point">GeoMapPoint to calculate the distance</param> /// <returns>Distance between both map points</returns> public double GetDistanceInMiles(GeoMapPoint point) => GetDistanceInKm(point) * 0.62;