// Boost.Geometry // Copyright (c) 2019, Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // Licensed under the Boost Software License version 1.0. // http://www.boost.org/users/license.html #ifndef BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_POINT_ORDER_HPP #define BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_POINT_ORDER_HPP #include #include #include #include #include #include #include namespace boost { namespace geometry { namespace strategy { namespace point_order { template < typename FormulaPolicy = strategy::andoyer, typename Spheroid = srs::spheroid, typename CalculationType = void > struct geographic { typedef azimuth_tag version_tag; template struct result_type { typedef typename geometry::select_calculation_type_alt < CalculationType, Geometry >::type type; }; geographic() {} explicit geographic(Spheroid const& spheroid) : m_spheroid(spheroid) {} template inline bool apply(Point const& p1, Point const& p2, typename result_type::type & azi, typename result_type::type & razi) const { typedef typename result_type::type calc_t; if (equals_point_point(p1, p2)) { return false; } formula::result_inverse res = FormulaPolicy::template inverse < calc_t, false, true, true, false, false >::apply(geometry::get_as_radian<0>(p1), geometry::get_as_radian<1>(p1), geometry::get_as_radian<0>(p2), geometry::get_as_radian<1>(p2), m_spheroid); azi = res.azimuth; razi = res.reverse_azimuth; return true; } template inline typename result_type::type apply(Point const& /*p0*/, Point const& /*p1*/, Point const& /*p2*/, typename result_type::type const& azi1, typename result_type::type const& azi2) const { // TODO: support poles return math::longitude_distance_signed(azi1, azi2); } private: template static bool equals_point_point(Point const& p0, Point const& p1) { return strategy::within::spherical_point_point::apply(p0, p1); } Spheroid m_spheroid; }; namespace services { template <> struct default_strategy { typedef geographic<> type; }; } // namespace services }} // namespace strategy::point_order }} // namespace boost::geometry #endif // BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_POINT_ORDER_HPP