// Boost.Geometry
-// Copyright (c) 2018 Oracle and/or its affiliates.
+// Copyright (c) 2018-2021 Oracle and/or its affiliates.
// Contributed and/or modified by Vissarion Fysikopoulos, on behalf of Oracle
// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
#include <boost/geometry/algorithms/dispatch/envelope.hpp>
+#include <boost/geometry/views/reversible_view.hpp>
+
namespace boost { namespace geometry
{
namespace detail { namespace envelope
{
+
+struct envelope_hole
+{
+ template <typename Range, typename Box, typename Strategies>
+ static inline void apply(Range const& range, Box& mbr, Strategies const& strategies)
+ {
+ // Reverse holes to avoid calculating the envelope for the outside
+ // in spherical and geographic coordinate systems
+ detail::clockwise_view
+ <
+ Range const,
+ geometry::point_order<Range>::value == counterclockwise
+ ? clockwise : counterclockwise
+ > view(range);
+ strategies.envelope(range, mbr).apply(view, mbr);
+ }
+};
+
struct envelope_polygon
{
template <typename Polygon, typename Box, typename Strategy>
if (geometry::is_empty(ext_ring))
{
+ // use dummy multi polygon to get the strategy because there is no multi ring concept
+ using strategy_t = decltype(strategy.envelope(detail::dummy_multi_polygon(),
+ detail::dummy_box()));
// if the exterior ring is empty, consider the interior rings
envelope_multi_range
<
- envelope_range
- >::apply(interior_rings(polygon), mbr, strategy);
+ envelope_hole
+ >::template apply<strategy_t>(interior_rings(polygon), mbr, strategy);
}
else
{