C library for Geodesics  1.49
Geodesic routines implemented in C
Charles F. F. Karney (charl.nosp@m.es@k.nosp@m.arney.nosp@m..com)

The documentation for other versions is available at https://geographiclib.sourceforge.io/m.nn/C for versions numbers m.nn ≥ 1.28.


This is a C implementation of the geodesic algorithms from GeographicLib. This is a self-contained library (requiring only the standard C math library) which makes it easy to do geodesic computations for an ellipsoid of revolution in a C program. It is included with version 4.9.0 of proj.4 and later. It uses ANSI C as described in B. W. Kernigan and D. M. Ritchie, The C Programming Language, 2nd Ed. (Prentice Hall, 1988), and so should compile correctly with just about any C compiler. However, the C99 math functions are used if they are available.

Downloading the source

The C library is part of GeographicLib which available for download at

as either a compressed tar file (tar.gz) or a zip file. After unpacking the source, the C library can be found in the directory legacy/C. The library consists of two files geodesic.c and geodesic.h.

The library is also included as part of proj.4 starting with version 4.9.0, where it is used as the computational backend for geod(1). Instructions for how to use the library via proj.4 are given below.

Licensed under the MIT/X11 License; see LICENSE.txt.

Library documentation

Here is the application programming interface for the library (this is just the documentation for the header file, geodesic.h). See also the documentation on the structures geod_geodesic, geod_geodesicline, and geod_polygon.

Sample programs

Also included are 3 small test programs:

Here, for example, is inverse.c

* @file inverse.c
* @brief A test program for geod_inverse()
#include <stdio.h>
#include "geodesic.h"
#if defined(_MSC_VER)
/* Squelch warnings about scanf */
# pragma warning (disable: 4996)
* A simple program to solve the inverse geodesic problem.
* This program reads in lines with lat1, lon1, lat2, lon2 and prints out lines
* with azi1, azi2, s12 (for the WGS84 ellipsoid).
int main() {
double a = 6378137, f = 1/298.257223563; /* WGS84 */
double lat1, lon1, azi1, lat2, lon2, azi2, s12;
struct geod_geodesic g;
geod_init(&g, a, f);
while (scanf("%lf %lf %lf %lf", &lat1, &lon1, &lat2, &lon2) == 4) {
geod_inverse(&g, lat1, lon1, lat2, lon2, &s12, &azi1, &azi2);
printf("%.15f %.15f %.10f\n", azi1, azi2, s12);
return 0;

To compile, link, and run this, you would typically use

cc -o inverse inverse.c geodesic.c -lm
echo 30 0 29.5 179.5 | ./inverse 

These sample programs can also be built with the supplied cmake file, CMakeLists.txt, as follows

mkdir BUILD
cmake ..
make test
echo 30 0 29.5 179.5 | ./inverse 

Alternatively, if you have proj.4 installed, you can compile and link with

cc -c inverse.c
cc -o inverse inverse.o -lproj
echo 30 0 29.5 179.5 | ./inverse 

If proj.4 is installed, e.g., in /usr/local, you might have to use

cc -c -I/usr/local/include inverse.c
cc -o inverse inverse.o -lproj -L/usr/local/lib -Wl,-rpath=/usr/local/lib
echo 30 0 29.5 179.5 | ./inverse 

Using the library

External links

Change log