diff --git a/include/boost/geometry/policies/robustness/get_rescale_policy.hpp b/include/boost/geometry/policies/robustness/get_rescale_policy.hpp index 51e969152..32306f686 100644 --- a/include/boost/geometry/policies/robustness/get_rescale_policy.hpp +++ b/include/boost/geometry/policies/robustness/get_rescale_policy.hpp @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -87,6 +88,11 @@ static inline void init_rescale_policy(Geometry const& geometry, RobustPoint& min_robust_point, Factor& factor) { + if (geometry::is_empty(geometry)) + { + return; + } + // Get bounding boxes model::box env = geometry::return_envelope >(geometry); @@ -100,10 +106,36 @@ static inline void init_rescale_policy(Geometry1 const& geometry1, RobustPoint& min_robust_point, Factor& factor) { - // Get bounding boxes - model::box env = geometry::return_envelope >(geometry1); - model::box env2 = geometry::return_envelope >(geometry2); - geometry::expand(env, env2); + // Get bounding boxes (when at least one of the geometries is not empty) + bool const is_empty1 = geometry::is_empty(geometry1); + bool const is_empty2 = geometry::is_empty(geometry2); + if (is_empty1 && is_empty2) + { + return; + } + + model::box env; + if (is_empty1) + { + geometry::envelope(geometry2, env); + } + else if (is_empty2) + { + geometry::envelope(geometry1, env); + } + else + { + // The following approach (envelope + expand) may not give the + // optimal MBR when then two geometries are in the spherical + // equatorial or geographic coordinate systems. + // TODO: implement envelope for two (or possibly more geometries) + geometry::envelope(geometry1, env); + model::box env2 = geometry::return_envelope + < + model::box + >(geometry2); + geometry::expand(env, env2); + } scale_box_to_integer_range(env, min_point, min_robust_point, factor); }