public double BearingTo(Position target) { double lat1 = this.Latitude.FracDegrees.DtoR(); double long1 = this.Longitude.FracDegrees.DtoR(); double lat2 = target.Latitude.FracDegrees.DtoR(); double long2 = target.Longitude.FracDegrees.DtoR(); double bearing = Math.Atan2(Math.Sin(long2 - long1) * Math.Cos(lat2), (Math.Cos(lat1) * Math.Sin(lat2)) - (Math.Sin(lat1) * Math.Cos(lat2) * Math.Cos(long2 - long1))); bearing = bearing.RtoD(); bearing = (bearing + 360.0) % 360; return bearing; }
private static double ArcInRadians(Position pos1, Position pos2) { double latArc = (pos1.Latitude.FracDegrees - pos2.Latitude.FracDegrees).DtoR(); double longArc = (pos1.Longitude.FracDegrees - pos2.Longitude.FracDegrees).DtoR(); double latH = Math.Sin(latArc * 0.5); latH *= latH; double longH = Math.Sin(longArc * 0.5); longH *= longH; double tmp = Math.Cos(pos1.Latitude.FracDegrees.DtoR()) * Math.Cos(pos2.Latitude.FracDegrees.DtoR()); return 2.0 * Math.Asin(Math.Sqrt(latH + tmp * longH)); }
public static double DistanceInMeters(Position pos1, Position pos2) { return MEAN_EARTH_RADIUS_IN_METERS * ArcInRadians(pos1, pos2); }
public double DistanceInMetersTo(Position target) { return GreatCircleArc.DistanceInMeters(this, target); }