GeographicLib  1.49
Change log
Back to Support for high precision arithmetic. Up to Contents.

List of versions in reverse chronological order together with a brief list of changes. (Note: Old versions of the library use a year-month style of numbering. Now, the library uses a major and minor version number.) Recent versions of GeographicLib are available at https://sourceforge.net/projects/geographiclib/files/distrib/. Older versions are in https://sourceforge.net/projects/geographiclib/files/distrib/archive/.

The corresponding documentation for these versions is obtained by clicking on the “Version m.nn” links below. Some of the links in the documentation of older versions may be out of date (in particular the links for the source code will not work if the code has been migrated to the archive subdirectory). All the releases are available as tags “rm.nn” in the the "release" branch of the git repository for GeographicLib.

  • Version 1.49 (released 2017-10-05)
    • Add the Enhanced Magnetic Model 2017, emm2017. This is valid for 2000 thru the end of 2021.
    • Avoid potential problems with the order of initializations in DMS, GARS, Geohash, Georef, MGRS, OSGB, SphericalEngine; this only would have been an issue if GeographicLib objects were instantiated globally. Now no GeographicLib initialization code should be run prior to the entry of main().
    • To support the previous fix, add an overload, Utility::lookup(const char* s, char c).
    • NearestNeighbor::Search throws an error if pts is the wrong size (instead of merely returning no results).
    • Use complex arithmetic for Clenshaw sums in TransverseMercator and tranmerc_{fwd,inv}.m.
    • Changes in cmake support:
      • fix compiler flags for GEOGRAPHICLIB_PRECISION = 4;
      • add CONVERT_WARNINGS_TO_ERRORS option (default OFF), if ON then compiler warnings are treated as errors.
    • Fix warnings about implicit conversions of doubles to bools in C++, C, and JavaScript packages.
    • Binary installers for Windows now use Visual Studio 14 2015.
  • Version 1.48 (released 2017-04-09)
  • Version 1.47 (released 2017-02-15)
    • Add NearestNeighbor class.
    • Improve accuracy of area calculation (fixing a flaw introduced in version 1.46); fix applied in Geodesic, GeodesicExact, and the implementations in C, Fortran, Java, JavaScript, Python, MATLAB, and Maxima.
    • Generalize NormalGravity to allow oblate and prolate ellipsoids. As a consequence a new form of constructor, NormalGravity::NormalGravity, has been introduced and the old form is now deprecated (and because the signatures of the two constructors are similar, the compiler will warn about the use of the old one).
    • Changes in Math class:
    • Add Utility::trim() and Utility::val<T>(); Utility::num<T>() is now deprecated.
    • Changes in cmake support:
      • remove support of PACKAGE_PATH and INSTALL_PATH in cmake configuration;
      • fix to FindGeographicLib.cmake to make it work on Debian systems;
      • use $<TARGET_PDB_FILE:tgt> (cmake version ≥ 3.1);
      • use NAMESPACE for exported targets;
      • geographiclib-config.cmake exports GEOGRAPHICLIB_DATA, GEOGRAPHICLIB_PRECISION, and GeographicLib_HIGHPREC_LIBRARIES.
    • Add pkg-config support for cmake and autoconf builds.
    • Minor fixes:
      • fix the order of declarations in C library, incorporating the patches in version 1.46.1;
      • fix the packaging of the Python library, incorporating the patches in version 1.46.3;
      • restrict junit dependency in the Java package to testing scope (thanks to Mick Killianey);
      • various behind-the-scenes fixes to EllipticFunction;
      • fix documentation and default install location for Windows binary installers;
      • fix clang compiler warnings in GeodesicExactC4 and TransverseMercator.
  • Version 1.46 (released 2016-02-15)
    • The following BUGS have been fixed:
      • the -w flag to Planimeter(1) was being ignored;
      • in the Java package, the wrong longitude was being returned with direct geodesic calculation with a negative distance when starting point was at a pole (this bug was introduced in version 1.44);
      • in the JavaScript package, PolygonArea.TestEdge contained a misspelling of a variable name and other typos (problem found by threepointone).
    • INCOMPATIBLE CHANGES:
      • make the -w flag (to swap the default order of latitude and longitude) a toggle for all Utility programs;
      • the -a option to GeodSolve(1) now toggles (instead of sets) arc mode;
      • swap order coslon and sinlon arguments in CircularEngine class.
    • Remove deprecated functionality:
      • remove gradient calculation from the Geoid class and GeoidEval(1) (this was inaccurate and of dubious utility);
      • remove reciprocal flattening functions, InverseFlattening in many classes and Constants::WGS84_r(); stop treating flattening > 1 as the reciprocal flattening in constructors;
      • remove DMS::Decode(string), DMS::DecodeFraction, EllipticFunction:m, EllipticFunction:m1, Math::extradigits, Math::AngNormalize2, PolygonArea::TestCompute;
      • stop treating LONG_NOWRAP as an alias for LONG_UNROLL in Geodesic (and related classes) and Rhumb;
      • stop treating full/schmidt as aliases for FULL/SCHMIDT in SphericalEngine (and related classes);
      • remove qmake project file src/GeographicLib.pro because QtCreator can handle cmake projects now;
      • remove deprecated Visual Studio 2005 project and solution files.
    • Changes to GeodesicLine and GeodesicLineExact classes; these changes (1) simplify the process of computing waypoints on a geodesic given two endpoints and (2) allow a GeodesicLine to be defined which is consistent with the solution of the inverse problem (in particular Geodesic::InverseLine the specification of south-going lines which pass the poles in a westerly direction by setting sin α1 = −0):
    • Other changes to the geodesic routines:
      • more accurate solution of the inverse problem when longitude difference is close to 180° (also in C, Fortran, Java, JavaScript, Python, MATLAB, and Maxima packages);
      • more accurate calculation of lon2 in the inverse calculation with LONG_UNROLL (also in Java, JavaScript, Python packages).
    • Changes to GeodSolve(1) utility:
      • the -I and -D options now specify geodesic line calculation via the standard inverse or direct geodesic problems;
      • rename -l flag to -L to parallel the new -I and -D flags (-l is is retained for backward compatibility but is deprecated), and similarly for RhumbSolve(1);
      • the -F flag (in conjunction with the -I or -D flags) specifies that distances read on standard input are fractions of s13 or a13;
      • the -a option now toggles arc mode (noted above);
      • the -w option now toggles longitude first mode (noted above).
    • Changes to Math class:
      • Math::copysign added;
      • add overloaded version of Math::AngDiff which returns the error in the difference. This allows a more accurate treatment of inverse geodesic problem when lon12 is close to 180°;
      • Math::AngRound now converts tiny negative numbers to −0 (instead of +0), however −0 is still converted to +0.
    • Add -S and -T options to GeoConvert(1).
    • Add Sphinx documentation for Python package.
    • Samples of wrapping the C++ library, so it's accessible in other languages, are given in wrapper/C, wrapper/python, and wrapper/matlab.
    • Binary installers for Windows now use Visual Studio 12 2013.
    • Remove top-level pom.xml from release (it was specific to SRI).
    • A reminder: because of the JavaScript changes introduced in version 1.45, you should remove the following installation directories from your system:
      • Windows: ${CMAKE_INSTALL_PREFIX}/doc/scripts
      • Others: ${CMAKE_INSTALL_PREFIX}/share/doc/GeographicLib/scripts
  • Version 1.45 (released 2015-09-30)
    • Fix BUG in solution of inverse geodesic caused by misbehavior of some versions of Visual Studio on Windows (fmod(−0.0, 360.0) returns +0.0 instead of −0.0) and Octave (sind(−0.0) returns +0.0 instead of −0.0). These bugs were exposed because max(−0.0, +0.0) returns −0.0 for some languages.
    • Geodesic::Inverse now correctly returns NaNs if one of the latitudes is a NaN.
    • Changes to JavaScript package:
      • thanks to help from Yurij Mikhalevich, it is a now a node package that can be installed with npm;
      • make install now installs the node package in lib/node_modules/geographiclib;
      • add unit tests using mocha;
      • add documentation via JSDoc;
      • fix bug Geodesic.GenInverse (this bug, introduced in version 1.44, resulted in the wrong azimuth being reported for points at the pole).
    • Changes to Java package:
      • add implementation of ellipsoidal Gnomonic projection (courtesy of Sebastian Mattheis);
      • add unit tests using JUnit;
      • Math.toRadians and Math.toDegrees are used instead of GeoMath.degree (which is now removed), as a result…
      • Java version 1.2 (released 1998-12) or later is now required.
    • Changes to Python package:
      • add unit tests using the unittest framework;
      • fixed bug in normalization of the area.
    • Changes to MATLAB package:
      • fix array size mismatch in geoddistance by avoiding calls to subfunctions with zero-length arrays;
      • fix tranmerc_{fwd,inv} so that they work with arrays and mixed array/scalar arguments;
      • work around Octave problem which causes mgrs_fwd to return garbage with prec = 10 or 11;
      • add geographiclib_test.m to run a test suite.
    • Behavior of substituting 1/f for f if f > 1 is now deprecated. This behavior has been removed from the JavaScript, C, and Python implementations (it was never documented). Maxima, MATLAB, and Fortran implementations never included this behavior.
    • Other changes:
      • fix bug, introduced in version 1.42, in the C++ implementation to the computation of area which causes NaNs to be returned in the case of a sphere;
      • fixed bug, introduced in version 1.44, in the detection of C++11 math functions in configure.ac;
      • throw error on non-convergence in Gnomonic::Reverse if GEOGRAPHICLIB_PRECISION > 3;
      • add geod_polygon_clear to C library;
      • turn illegal latitudes into NaNs for Fortran library;
      • add test suites for the C and Fortran libraries.
  • Version 1.44 (released 2015-08-14)
    • Various changes to improve accuracy, e.g., by minimizing round-off errors:
      • Add Math::sincosd, Math::sind, Math::cosd which take their arguments in degrees. These functions do exact range reduction and thus they obey exactly the elementary properties of the trigonometric functions, e.g., sin 9° = cos 81° = − sin 123456789°.
      • Math::AngNormalize now works for any angles, instead of angles in the range [−540°, 540°); the function Math::AngNormalize2 is now deprecated.
      • This means that there is now no restriction on longitudes and azimuths; any values can be used.
      • Improve the accuracy of Math::atan2d.
      • DMS::Decode avoids unnecessary round-off errors; thus 7:33:36 and 7.56 result in identical values. DMS::Encode rounds ties to even. These changes have also been made to DMS.js.
      • More accurate rounding in MGRS::Reverse and mgrs_inv.m; this change only makes a difference at sub-meter precisions.
      • With MGRS::Forward and mgrs_fwd.m, ensure that digits in lower precision results match those at higher precision; as a result, strings of trailing 9s are less likely to be generated. This change only makes a difference at sub-meter precisions.
      • Replace the series for A2 in the Geodesic class with one with smaller truncation errors.
      • Geodesic::Inverse sets s12 to zero for coincident points at pole (instead of returning a tiny quantity).
      • Math::LatFix returns its argument if it is in [−90°, 90°]; if not, it returns NaN.
      • Using Math::LatFix, routines which don't check their arguments now interpret a latitude outside the legal range of [−90°, 90°] as a NaN; such routines will return NaNs instead of finite but incorrect results; caution: code that (dangerously) relied on the "reasonable" results being returned for values of the latitude outside the allowed range will now malfunction.
    • All the Utility programs accept the -w option to swap the latitude-longitude order on input and output (and where appropriate on the command-line arguments). CartConvert now accepts the -p option to set the precision; now all of the utilities except GeoidEval accept -p.
    • Add classes for GARS, the Global Area Reference System, and for Georef, the World Geographic Reference System.
    • Changes to DMS::Decode and DMS.js:
      • tighten up the rules:
        • 30:70.0 and 30:60 are illegal (minutes and second must be strictly less than 60), however
        • 30:60.0 and 30:60. are legal (floating point 60 is OK, since it might have been generated by rounding 59.99…);
      • generalize a+b concept, introduced in version 1.42, to any number of pieces; thus 8+0:40-0:0:10 is interpreted as 8:39:50.
    • Documentation fixes:
      • update man pages to refer to GeoConvert(1) on handling of geographic coordinates;
      • document limitations of the series used for TransverseMercator;
      • hide the documentation of the computation of the gradient of the geoid height (now deprecated) in the Geoid class;
      • warn about the possible misinterpretation of 7.0E+1 by DMS::Decode;
      • swaplatlong optional argument of DMS::DecodeLatLon and various functions in the GeoCoords class is now called longfirst;
      • require Doxygen 1.8.7 or later.
    • More systematic treatment of version numbers:
      • Python: __init__.py defines __version__ and __version_info__;
      • JavaScript:
      • Fortran: add geover subroutine to return version numbers;
      • Maxima: geodesic.mac defines geod_version;
      • CGI scripts: these report the version numbers of the utilities.
    • BUG FIXES:
      • NormalGravity now works properly for a sphere (omega = f = J2 = 0), instead of returning NaNs (problem found by htallon);
      • CassiniSoldner::Forward and cassini_fwd.m now returns the correct azimuth for points at the pole.
    • MATLAB-specific fixes:
      • mgrs_fwd now treats treats prec > 11 as prec = 11;
      • illegal letter combinations are now correctly detected by mgrs_inv;
      • fixed bug where mgrs_inv returned the wrong results for prec = 0 strings and center = 0;
      • mgrs_inv now decodes prec = 11 strings properly;
      • routines now return array results with the right shape;
      • routines now properly handle mixed scalar and array arguments.
    • Add Accumulator<T>::operator*=(T y).
    • Geohash