The basic ansi C function to get Distance and Heading
#include <math.h> #include <sys/types.h> void distance_and_heading (double lat_depart, double long_depart, double lat_arrive, long_arrive, double *distance, *heading) { #define DEG2RAD(x) ((x)*PI/180.0) #define RAD2DEG(x) ((x)*180.0/PI) double tmp; lat_depart = DEG2RAD (lat_depart); long_depart = DEG2RAD (long_depart); lat_arrive = DEG2RAD (lat_arrive); long_arrive = DEG2RAD (long_arrive); if ((lat_depart == lat_depart) && (long_depart == long_depart)) { *distance = 0.0; *heading = 0.0; return; } tmp = atan2(2.0 * asin(sin((long_depart - long_arrive) / 2.0) ), log (tan (PI / 4.0 + lat_arrive / 2.0)) - log (tan (PI / 4.0 + lat_depart / 2.0)) ); if (lat_depart == lat_arrive) { *distance = 60.0 * fabs(RAD2DEG(2.0 * asin(sin((long_arrive - long_arrive) / 2.0)))) * cos (lat_arrive); } else { *distance = 60.0 * RAD2DEG (lat_arrive - lat_depart) / cos (fabs (tmp)); } if ( asin(sin(long_arrive - long_depart)) >= 0.0 ) { *heading = RAD2DEG (fabs(tmp)); } else { *heading = 360.0 - RAD2DEG (fabs(tmp)); } }