Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext
difference (with strategy)

Description

Calculate the difference of two geometries

The free function difference calculates the spatial set theoretic difference of two geometries.

Synopsis

template<typename Geometry1, typename Geometry2, typename Collection, typename Strategy>
void difference(Geometry1 const & geometry1, Geometry2 const & geometry2, Collection & output_collection,
                Strategy const & strategy)

Parameters

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

Header

Either

#include <boost/geometry.hpp>

Or

#include <boost/geometry/algorithms/difference.hpp>

Conformance

The function difference implements function Difference from the OGC Simple Feature Specification.

Behavior

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] Note

Check the Polygon Concept for the rules that polygon input for this algorithm should fulfill

Example

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.839424

difference_a

blue - green:
0: 0.525154
1: 0.015
2: 0.181136
3: 0.128798
4: 0.340083
5: 0.307778

difference_b
See also

PrevUpHomeNext