| // Boost.Geometry |
| |
| // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. |
| |
| // This file was modified by Oracle on 2014. |
| // Modifications copyright (c) 2014 Oracle and/or its affiliates. |
| |
| // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle |
| |
| // Use, modification and distribution is subject to the Boost Software License, |
| // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| |
| #ifndef BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_VINCENTY_HPP |
| #define BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_VINCENTY_HPP |
| |
| |
| #include <boost/geometry/core/coordinate_type.hpp> |
| #include <boost/geometry/core/radian_access.hpp> |
| |
| #include <boost/geometry/strategies/distance.hpp> |
| |
| #include <boost/geometry/util/promote_floating_point.hpp> |
| #include <boost/geometry/util/select_calculation_type.hpp> |
| |
| #include <boost/geometry/algorithms/detail/vincenty_inverse.hpp> |
| |
| namespace boost { namespace geometry |
| { |
| |
| namespace strategy { namespace distance |
| { |
| |
| /*! |
| \brief Distance calculation formulae on latlong coordinates, after Vincenty, 1975 |
| \ingroup distance |
| \tparam Spheroid The reference spheroid model |
| \tparam CalculationType \tparam_calculation |
| \author See |
| - http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf |
| - http://www.icsm.gov.au/gda/gdav2.3.pdf |
| \author Adapted from various implementations to get it close to the original document |
| - http://www.movable-type.co.uk/scripts/LatLongVincenty.html |
| - http://exogen.case.edu/projects/geopy/source/geopy.distance.html |
| - http://futureboy.homeip.net/fsp/colorize.fsp?fileName=navigation.frink |
| |
| */ |
| template |
| < |
| typename Spheroid, |
| typename CalculationType = void |
| > |
| class vincenty |
| { |
| public : |
| template <typename Point1, typename Point2> |
| struct calculation_type |
| : promote_floating_point |
| < |
| typename select_calculation_type |
| < |
| Point1, |
| Point2, |
| CalculationType |
| >::type |
| > |
| {}; |
| |
| typedef Spheroid model_type; |
| |
| inline vincenty() |
| : m_spheroid() |
| {} |
| |
| explicit inline vincenty(Spheroid const& spheroid) |
| : m_spheroid(spheroid) |
| {} |
| |
| template <typename Point1, typename Point2> |
| inline typename calculation_type<Point1, Point2>::type |
| apply(Point1 const& point1, Point2 const& point2) const |
| { |
| return geometry::detail::vincenty_inverse |
| < |
| typename calculation_type<Point1, Point2>::type |
| >(get_as_radian<0>(point1), |
| get_as_radian<1>(point1), |
| get_as_radian<0>(point2), |
| get_as_radian<1>(point2), |
| m_spheroid).distance(); |
| } |
| |
| inline Spheroid const& model() const |
| { |
| return m_spheroid; |
| } |
| |
| private : |
| Spheroid m_spheroid; |
| }; |
| |
| #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS |
| namespace services |
| { |
| |
| template <typename Spheroid, typename CalculationType> |
| struct tag<vincenty<Spheroid, CalculationType> > |
| { |
| typedef strategy_tag_distance_point_point type; |
| }; |
| |
| |
| template <typename Spheroid, typename CalculationType, typename P1, typename P2> |
| struct return_type<vincenty<Spheroid, CalculationType>, P1, P2> |
| : vincenty<Spheroid, CalculationType>::template calculation_type<P1, P2> |
| {}; |
| |
| |
| template <typename Spheroid, typename CalculationType> |
| struct comparable_type<vincenty<Spheroid, CalculationType> > |
| { |
| typedef vincenty<Spheroid, CalculationType> type; |
| }; |
| |
| |
| template <typename Spheroid, typename CalculationType> |
| struct get_comparable<vincenty<Spheroid, CalculationType> > |
| { |
| static inline vincenty<Spheroid, CalculationType> apply(vincenty<Spheroid, CalculationType> const& input) |
| { |
| return input; |
| } |
| }; |
| |
| template <typename Spheroid, typename CalculationType, typename P1, typename P2> |
| struct result_from_distance<vincenty<Spheroid, CalculationType>, P1, P2 > |
| { |
| template <typename T> |
| static inline typename return_type<vincenty<Spheroid, CalculationType>, P1, P2>::type |
| apply(vincenty<Spheroid, CalculationType> const& , T const& value) |
| { |
| return value; |
| } |
| }; |
| |
| |
| } // namespace services |
| #endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS |
| |
| |
| // We might add a vincenty-like strategy also for point-segment distance, but to calculate the projected point is not trivial |
| |
| |
| |
| }} // namespace strategy::distance |
| |
| |
| }} // namespace boost::geometry |
| |
| |
| #endif // BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_VINCENTY_HPP |