Boost
C++ Libraries
...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
This is an older version of Boost and was released in 2022. The current version is 1.89.0.
Calculate the difference of two geometries
The free function difference calculates the spatial set theoretic difference of two geometries.
template<typename Geometry1, typename Geometry2, typename Collection, typename Strategy> void difference(Geometry1 const & geometry1, Geometry2 const & geometry2, Collection & output_collection, Strategy const & strategy)
|
Type |
Concept |
Name |
Description |
|---|---|---|---|
|
Geometry1 const & |
Any type fulfilling a Geometry Concept |
geometry1 |
A model of the specified concept |
|
Geometry2 const & |
Any type fulfilling a Geometry Concept |
geometry2 |
A model of the specified concept |
|
Collection & |
output collection, either a multi-geometry, or a std::vector<Geometry> / std::deque<Geometry> etc |
output_collection |
the output collection |
|
Strategy const & |
Any type fulfilling a Difference Strategy Concept |
strategy |
The strategy which will be used for difference calculations |
Either
#include <boost/geometry.hpp>
Or
#include <boost/geometry/algorithms/difference.hpp>
The function difference implements function Difference from the OGC Simple Feature Specification.
|
Case |
Behavior |
|---|---|
|
areal (e.g. polygon) |
All combinations of: box, ring, polygon, multi_polygon |
|
linear (e.g. linestring) / areal (e.g. polygon) |
A combinations of a (multi) linestring with a (multi) polygon results in a collection of linestrings |
|
linear (e.g. linestring) |
All combinations of: linestring, multi_linestring; results in a collection of linestrings |
|
pointlike (e.g. point) |
All combinations of: point, multi_point; results in a collection of points |
|
Other geometries |
Not yet supported in this version |
|
Spherical |
Not yet supported in this version |
|
Three dimensional |
Not yet supported in this version |
![]() |
Note |
|---|---|
Check the Polygon Concept for the rules that polygon input for this algorithm should fulfill |
Shows how to subtract one polygon from another polygon
#include <iostream> #include <list> #include <boost/geometry.hpp> #include <boost/geometry/geometries/point_xy.hpp> #include <boost/geometry/geometries/polygon.hpp> #include <boost/foreach.hpp> int main() { typedef boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > polygon; polygon green, blue; boost::geometry::read_wkt( "POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2,4.1 3,5.3 2.6,5.4 1.2,4.9 0.8,2.9 0.7,2 1.3)" "(4.0 2.0, 4.2 1.4, 4.8 1.9, 4.4 2.2, 4.0 2.0))", green); boost::geometry::read_wkt( "POLYGON((4.0 -0.5 , 3.5 1.0 , 2.0 1.5 , 3.5 2.0 , 4.0 3.5 , 4.5 2.0 , 6.0 1.5 , 4.5 1.0 , 4.0 -0.5))", blue); std::list<polygon> output; boost::geometry::difference(green, blue, output); int i = 0; std::cout << "green - blue:" << std::endl; BOOST_FOREACH(polygon const& p, output) { std::cout << i++ << ": " << boost::geometry::area(p) << std::endl; } output.clear(); boost::geometry::difference(blue, green, output); i = 0; std::cout << "blue - green:" << std::endl; BOOST_FOREACH(polygon const& p, output) { std::cout << i++ << ": " << boost::geometry::area(p) << std::endl; } return 0; }
Output:
green - blue: 0: 0.02375 1: 0.542951 2: 0.0149697 3: 0.226855 4: 0.839424blue - green: 0: 0.525154 1: 0.015 2: 0.181136 3: 0.128798 4: 0.340083 5: 0.307778
![]()