#include <iostream>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/extensions/algorithms/dissolve.hpp>
#include <boost/geometry/extensions/multi/algorithms/dissolve.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp>
#include <boost/geometry/extensions/gis/io/wkt/wkt.hpp>
static std::string javier_dissolve[2] =
{"MULTIPOLYGON(((560 -400, 600 -400, 600 -440, 560 -440, 560 -400)), ((480 -400, 520 -400, 520 -440, 480 -440, 480 -400)), ((600 -320, 640 -320, 640 -360, 600 -360, 600 -320)), ((520 -400, 560 -400, 560 -440, 520 -440, 520 -400)))",
"MULTIPOLYGON(((0 0, 2000 0, 2000 -2000, 0 -2000, 0 0), (560 -400, 560 -440, 600 -440, 600 -400, 560 -400), (480 -400, 480 -440, 520 -440, 520 -400, 480 -400), (600 -320, 600 -360, 640 -360, 640 -320, 600 -320), (520 -400, 520 -440, 560 -440, 560 -400, 520 -400)))"};
int main()
{
typedef boost::geometry::model::polygon
<
boost::geometry::model::d2::point_xy<double>
> polygon;
typedef boost::geometry::model::multi_polygon<polygon> mp;
mp raw_green, raw_blue, green, blue, output;
boost::geometry::read_wkt(javier_dissolve[0], raw_green);
boost::geometry::read_wkt(javier_dissolve[1], raw_blue);
boost::geometry::dissolve(raw_green, green);
boost::geometry::dissolve(raw_blue, blue);
boost::geometry::difference(green, blue, output);
boost::geometry::unique(output);
std::cout
<< boost::geometry::area(output)
<< " " << boost::geometry::wkt(output)
<< std::endl;
return 0;
}