...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
Checks if a geometry is valid (in the OGC sense)
template<typename Geometry, typename Strategy> bool is_valid(Geometry const & geometry, validity_failure_type & failure, Strategy const & strategy)
Type 
Concept 
Name 
Description 

Geometry const & 
Any type fulfilling a Geometry Concept 
geometry 
A model of the specified concept 
validity_failure_type & 
failure 
An enumeration value indicating that the geometry is valid or not, and if not valid indicating the reason why 

Strategy const & 
Any type fulfilling a Is_valid Strategy Concept 
strategy 
The strategy which will be used for is_valid calculations 
Returns true if the geometry is valid (in the OGC sense); furthermore, the following geometries are considered valid: multigeometries with no elements, linear geometries containing spikes, areal geometries with duplicate (consecutive) points
Either
#include <boost/geometry.hpp>
Or
#include <boost/geometry/algorithms/is_valid.hpp>
The function is_valid is not defined by OGC.
Geometry 
Status 

Point 

Segment 

Box 

Linestring 

Ring 

Polygon 

MultiPoint 

MultiLinestring 

MultiPolygon 

Variant 

Constanttime for points, segments, boxes and multipoints
Linear for linestrings and multilinestrings
Linearithmic for rings
Currently, worstcase quadratic for polygons and multipolygons
Checks whether a geometry is valid and, if not valid, checks if it could be fixed by bg::correct; if so bg::correct is called on the geometry
#include <iostream> #include <boost/geometry.hpp> #include <boost/geometry/geometries/point_xy.hpp> #include <boost/geometry/geometries/polygon.hpp> int main() { typedef boost::geometry::model::d2::point_xy<double> point_type; typedef boost::geometry::model::polygon<point_type> polygon_type; polygon_type poly; boost::geometry::read_wkt("POLYGON((0 0,0 10,10 10,10 0),(0 0,9 2,9 1,0 0),(0 0,2 9,1 9,0 0))", poly); std::cout << "original geometry: " << boost::geometry::dsv(poly) << std::endl; boost::geometry::validity_failure_type failure; bool valid = boost::geometry::is_valid(poly, failure); // if the invalidity is only due to lack of closing points and/or wrongly oriented rings, then bg::correct can fix it bool could_be_fixed = (failure == boost::geometry::failure_not_closed  failure == boost::geometry::failure_wrong_orientation); std::cout << "is valid? " << (valid ? "yes" : "no") << std::endl; if (! valid) { std::cout << "can boost::geometry::correct remedy invalidity? " << (could_be_fixed ? "possibly yes" : "no") << std::endl; if (could_be_fixed) { boost::geometry::correct(poly); std::cout << "after correction: " << (boost::geometry::is_valid(poly) ? "valid" : "still invalid") << std::endl; std::cout << "corrected geometry: " << boost::geometry::dsv(poly) << std::endl; } } return 0; }
Output:
original geometry: (((0, 0), (0, 10), (10, 10), (10, 0)), ((0, 0), (9, 2), (9, 1), (0, 0)), ((0, 0), (2, 9), (1, 9), (0, 0))) is valid? no can boost::geometry::correct remedy invalidity? possibly yes after correction: valid corrected geometry: (((0, 0), (0, 10), (10, 10), (10, 0), (0, 0)), ((0, 0), (9, 1), (9, 2), (0, 0)), ((0, 0), (2, 9), (1, 9), (0, 0)))