+return ((2.f * atan2(sqrt(a), sqrt(1.f - a))) * EARTH_RADIUS);
+}
+
+/**
+ * Calculate course from lat1,lon1 to lat2,lon2
+ *
+ */
+gdouble
+calculate_course_rad(gdouble lat1, gdouble lon1, gdouble lat2, gdouble lon2)
+{
+gdouble c,dlon,x,y;
+
+lat1*=(M_PIl / 180.f);
+lon1*=(M_PIl / 180.f);
+lat2*=(M_PIl / 180.f);
+lon2*=(M_PIl / 180.f);
+
+dlon=lon2-lon1;
+y=sin(dlon)*cos(lat2);
+x=cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(dlon);
+c=atan2(y,x);
+
+return c;
+}
+
+gdouble
+calculate_course(gdouble lat1, gdouble lon1, gdouble lat2, gdouble lon2)
+{
+gdouble c;
+
+c=calculate_course_rad(lat1, lon1, lat2, lon2);
+
+c*=180.f/M_PIl;
+c=c+360 % 360;
+return c;
+}
+
+void
+deg_format(DegFormat degformat, gdouble coor, gchar * scoor, gchar neg_char, gchar pos_char)
+{
+gdouble min;
+gdouble acoor=fabs(coor);
+
+switch (degformat) {
+ case DDPDDDDD:
+ g_sprintf(scoor, "%.5f°", coor);
+ break;
+ case DDPDDDDD_NSEW:
+ g_sprintf(scoor, "%.5f° %c", acoor, coor < 0.f ? neg_char : pos_char);
+ break;
+ case DD_MMPMMM:
+ g_sprintf(scoor, "%d°%06.3f'", (int)coor, (acoor - (int)acoor) * 60.0);
+ break;
+ case DD_MMPMMM_NSEW:
+ g_sprintf(scoor, "%d°%06.3f' %c", (int)acoor, (acoor - (int)acoor) * 60.0, coor < 0.f ? neg_char : pos_char);
+ break;
+ case DD_MM_SSPS:
+ min = (acoor - (int)acoor) * 60.0;
+ g_sprintf(scoor, "%d°%02d'%04.1f\"", (int)coor, (int)min, ((min - (int)min) * 60.0));
+ break;
+ case DD_MM_SSPS_NSEW:
+ min = (acoor - (int)acoor) * 60.0;
+ g_sprintf(scoor, "%d°%02d'%04.1f\" %c", (int)acoor, (int)min, ((min - (int)min) * 60.0), coor < 0.f ? neg_char : pos_char);
+ break;
+ default:
+ g_return_if_reached();
+ break;
+}