/
usr
/
include
/
boost
/
geometry
/
strategies
/
geographic
/
/usr/include/boost/geometry/strategies/geographic
mkdir
upload
Name
Size
Mode
Actions
area.hpp
6933
0644
edit
dl
rm
azimuth.hpp
4021
0644
edit
dl
rm
buffer_point_circle.hpp
4189
0644
edit
dl
rm
densify.hpp
4004
0644
edit
dl
rm
disjoint_segment_box.hpp
4043
0644
edit
dl
rm
distance.hpp
6294
0644
edit
dl
rm
distance_andoyer.hpp
3829
0644
edit
dl
rm
distance_cross_track.hpp
34524
0644
edit
dl
rm
distance_cross_track_box_box.hpp
7147
0644
edit
dl
rm
distance_cross_track_point_box.hpp
6780
0644
edit
dl
rm
distance_karney.hpp
2985
0644
edit
dl
rm
distance_segment_box.hpp
10100
0644
edit
dl
rm
distance_thomas.hpp
3354
0644
edit
dl
rm
distance_vincenty.hpp
3547
0644
edit
dl
rm
envelope.hpp
3348
0644
edit
dl
rm
envelope_segment.hpp
3795
0644
edit
dl
rm
expand_segment.hpp
2915
0644
edit
dl
rm
index.hpp
7450
0644
edit
dl
rm
intersection.hpp
37874
0644
edit
dl
rm
intersection_elliptic.hpp
6899
0644
edit
dl
rm
io.hpp
2285
0644
edit
dl
rm
line_interpolate.hpp
3710
0644
edit
dl
rm
mapping_ssf.hpp
5625
0644
edit
dl
rm
parameters.hpp
5467
0644
edit
dl
rm
point_in_poly_winding.hpp
2122
0644
edit
dl
rm
point_order.hpp
3107
0644
edit
dl
rm
side.hpp
4609
0644
edit
dl
rm
side_andoyer.hpp
1501
0644
edit
dl
rm
side_thomas.hpp
1493
0644
edit
dl
rm
side_vincenty.hpp
1509
0644
edit
dl
rm
Edit:
/usr/include/boost/geometry/strategies/geographic/area.hpp
(6933B)
// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2017 Adam Wulkiewicz, Lodz, Poland. // Copyright (c) 2016-2018 Oracle and/or its affiliates. // Contributed and/or modified by Vissarion Fisikopoulos, on behalf of Oracle // 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_AREA_HPP #define BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_AREA_HPP #include <boost/geometry/srs/spheroid.hpp> #include <boost/geometry/formulas/area_formulas.hpp> #include <boost/geometry/formulas/authalic_radius_sqr.hpp> #include <boost/geometry/formulas/eccentricity_sqr.hpp> #include <boost/geometry/strategies/area.hpp> #include <boost/geometry/strategies/geographic/parameters.hpp> namespace boost { namespace geometry { namespace strategy { namespace area { /*! \brief Geographic area calculation \ingroup strategies \details Geographic area calculation by trapezoidal rule plus integral approximation that gives the ellipsoidal correction \tparam FormulaPolicy Formula used to calculate azimuths \tparam SeriesOrder The order of approximation of the geodesic integral \tparam Spheroid The spheroid model \tparam CalculationType \tparam_calculation \author See - Danielsen JS, The area under the geodesic. Surv Rev 30(232): 61–66, 1989 - Charles F.F Karney, Algorithms for geodesics, 2011 https://arxiv.org/pdf/1109.4448.pdf \qbk{ [heading See also] \* [link geometry.reference.algorithms.area.area_2_with_strategy area (with strategy)] \* [link geometry.reference.srs.srs_spheroid srs::spheroid] } */ template < typename FormulaPolicy = strategy::andoyer, std::size_t SeriesOrder = strategy::default_order<FormulaPolicy>::value, typename Spheroid = srs::spheroid<double>, typename CalculationType = void > class geographic { // Switch between two kinds of approximation(series in eps and n v.s.series in k ^ 2 and e'^2) static const bool ExpandEpsN = true; // LongSegment Enables special handling of long segments static const bool LongSegment = false; //Select default types in case they are not set public: template <typename Geometry> struct result_type : strategy::area::detail::result_type < Geometry, CalculationType > {}; protected : struct spheroid_constants { typedef typename boost::mpl::if_c < boost::is_void<CalculationType>::value, typename geometry::radius_type<Spheroid>::type, CalculationType >::type calc_t; Spheroid m_spheroid; calc_t const m_a2; // squared equatorial radius calc_t const m_e2; // squared eccentricity calc_t const m_ep2; // squared second eccentricity calc_t const m_ep; // second eccentricity calc_t const m_c2; // squared authalic radius inline spheroid_constants(Spheroid const& spheroid) : m_spheroid(spheroid) , m_a2(math::sqr(get_radius<0>(spheroid))) , m_e2(formula::eccentricity_sqr<calc_t>(spheroid)) , m_ep2(m_e2 / (calc_t(1.0) - m_e2)) , m_ep(math::sqrt(m_ep2)) , m_c2(formula_dispatch::authalic_radius_sqr < calc_t, Spheroid, srs_spheroid_tag >::apply(m_a2, m_e2)) {} }; public: template <typename Geometry> class state { friend class geographic; typedef typename result_type<Geometry>::type return_type; public: inline state() : m_excess_sum(0) , m_correction_sum(0) , m_crosses_prime_meridian(0) {} private: inline return_type area(spheroid_constants const& spheroid_const) const { return_type result; return_type sum = spheroid_const.m_c2 * m_excess_sum + spheroid_const.m_e2 * spheroid_const.m_a2 * m_correction_sum; // If encircles some pole if (m_crosses_prime_meridian % 2 == 1) { std::size_t times_crosses_prime_meridian = 1 + (m_crosses_prime_meridian / 2); result = return_type(2.0) * geometry::math::pi<return_type>() * spheroid_const.m_c2 * return_type(times_crosses_prime_meridian) - geometry::math::abs(sum); if (geometry::math::sign<return_type>(sum) == 1) { result = - result; } } else { result = sum; } return result; } return_type m_excess_sum; return_type m_correction_sum; // Keep track if encircles some pole std::size_t m_crosses_prime_meridian; }; public : explicit inline geographic(Spheroid const& spheroid = Spheroid()) : m_spheroid_constants(spheroid) {} template <typename PointOfSegment, typename Geometry> inline void apply(PointOfSegment const& p1, PointOfSegment const& p2, state<Geometry>& st) const { if (! geometry::math::equals(get<0>(p1), get<0>(p2))) { typedef geometry::formula::area_formulas < typename result_type<Geometry>::type, SeriesOrder, ExpandEpsN > area_formulas; typename area_formulas::return_type_ellipsoidal result = area_formulas::template ellipsoidal<FormulaPolicy::template inverse> (p1, p2, m_spheroid_constants); st.m_excess_sum += result.spherical_term; st.m_correction_sum += result.ellipsoidal_term; // Keep track whenever a segment crosses the prime meridian if (area_formulas::crosses_prime_meridian(p1, p2)) { st.m_crosses_prime_meridian++; } } } template <typename Geometry> inline typename result_type<Geometry>::type result(state<Geometry> const& st) const { return st.area(m_spheroid_constants); } private: spheroid_constants m_spheroid_constants; }; #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS namespace services { template <> struct default_strategy<geographic_tag> { typedef strategy::area::geographic<> type; }; #endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS } }} // namespace strategy::area }} // namespace boost::geometry #endif // BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_AREA_HPP
Save
cmd:
run