GEOS  3.9.1dev
Public Member Functions | Private Member Functions | Private Attributes | List of all members
geos::operation::IsSimpleOp Class Reference

Tests whether a Geometry is simple. More...

#include <IsSimpleOp.h>

Collaboration diagram for geos::operation::IsSimpleOp:
[legend]

Public Member Functions

 IsSimpleOp ()
 Creates a simplicity checker using the default SFS Mod-2 Boundary Node Rule. More...
 
 IsSimpleOp (const geom::Geometry &geom)
 Creates a simplicity checker using the default SFS Mod-2 Boundary Node Rule. More...
 
 IsSimpleOp (const geom::Geometry &geom, const algorithm::BoundaryNodeRule &boundaryNodeRule)
 Creates a simplicity checker using a given algorithm::BoundaryNodeRule. More...
 
bool isSimple ()
 Tests whether the geometry is simple. More...
 
const geom::CoordinategetNonSimpleLocation () const
 Gets a coordinate for the location where the geometry fails to be simple (i.e. where it has a non-boundary self-intersection). More...
 
bool isSimple (const geom::LineString *geom)
 Reports whether a geom::LineString is simple. More...
 
bool isSimple (const geom::MultiLineString *geom)
 Reports whether a geom::MultiLineString is simple. More...
 
bool isSimple (const geom::MultiPoint *mp)
 A MultiPoint is simple iff it has no repeated points. More...
 
bool isSimpleLinearGeometry (const geom::Geometry *geom)
 

Private Member Functions

bool hasNonEndpointIntersection (geomgraph::GeometryGraph &graph)
 
bool hasClosedEndpointIntersection (geomgraph::GeometryGraph &graph)
 
bool computeSimple (const geom::Geometry *geom)
 
bool isSimplePolygonal (const geom::Geometry *geom)
 
bool isSimpleGeometryCollection (const geom::GeometryCollection *col)
 
void addEndpoint (std::map< const geom::Coordinate *, EndpointInfo *, geom::CoordinateLessThen > &endPoints, const geom::Coordinate *p, bool isClosed)
 
bool isSimpleMultiPoint (const geom::MultiPoint &mp)
 

Private Attributes

bool isClosedEndpointsInInterior
 
const geom::Geometrygeom
 
std::unique_ptr< geom::CoordinatenonSimpleLocation
 

Detailed Description

Tests whether a Geometry is simple.

In general, the SFS specification of simplicity follows the rule:

This definition relies on the definition of boundary points. The SFS uses the Mod-2 rule to determine which points are on the boundary of lineal geometries, but this class supports using other BoundaryNodeRules as well.

Simplicity is defined for each Geometry subclass as follows:

See also
algorithm::BoundaryNodeRule

Definition at line 96 of file IsSimpleOp.h.

Constructor & Destructor Documentation

geos::operation::IsSimpleOp::IsSimpleOp ( )

Creates a simplicity checker using the default SFS Mod-2 Boundary Node Rule.

Deprecated:
use IsSimpleOp(Geometry)
geos::operation::IsSimpleOp::IsSimpleOp ( const geom::Geometry geom)

Creates a simplicity checker using the default SFS Mod-2 Boundary Node Rule.

Parameters
geomThe geometry to test. Will store a reference: keep it alive.
geos::operation::IsSimpleOp::IsSimpleOp ( const geom::Geometry geom,
const algorithm::BoundaryNodeRule boundaryNodeRule 
)

Creates a simplicity checker using a given algorithm::BoundaryNodeRule.

Parameters
geomthe geometry to test
boundaryNodeRulethe rule to use.

Member Function Documentation

void geos::operation::IsSimpleOp::addEndpoint ( std::map< const geom::Coordinate *, EndpointInfo *, geom::CoordinateLessThen > &  endPoints,
const geom::Coordinate p,
bool  isClosed 
)
private

Add an endpoint to the map, creating an entry for it if none exists

bool geos::operation::IsSimpleOp::computeSimple ( const geom::Geometry geom)
private
const geom::Coordinate* geos::operation::IsSimpleOp::getNonSimpleLocation ( ) const
inline

Gets a coordinate for the location where the geometry fails to be simple (i.e. where it has a non-boundary self-intersection).

isSimple must be called before this method is called.

Returns
a coordinate for the location of the non-boundary self-intersection. Ownership retained.
the null coordinate if the geometry is simple

Definition at line 145 of file IsSimpleOp.h.

bool geos::operation::IsSimpleOp::hasClosedEndpointIntersection ( geomgraph::GeometryGraph graph)
private

Tests that no edge intersection is the endpoint of a closed line. This ensures that closed lines are not touched at their endpoint, which is an interior point according to the Mod-2 rule To check this we compute the degree of each endpoint. The degree of endpoints of closed lines must be exactly 2.

bool geos::operation::IsSimpleOp::hasNonEndpointIntersection ( geomgraph::GeometryGraph graph)
private

For all edges, check if there are any intersections which are NOT at an endpoint. The Geometry is not simple if there are intersections not at endpoints.

bool geos::operation::IsSimpleOp::isSimple ( )

Tests whether the geometry is simple.

Returns
true if the geometry is simple
bool geos::operation::IsSimpleOp::isSimple ( const geom::LineString geom)

Reports whether a geom::LineString is simple.

Parameters
geomthe lineal geometry to test
Returns
true if the geometry is simple
Deprecated:
use isSimple()
bool geos::operation::IsSimpleOp::isSimple ( const geom::MultiLineString geom)

Reports whether a geom::MultiLineString is simple.

Parameters
geomthe lineal geometry to test
Returns
true if the geometry is simple
Deprecated:
use isSimple()
bool geos::operation::IsSimpleOp::isSimple ( const geom::MultiPoint mp)

A MultiPoint is simple iff it has no repeated points.

Deprecated:
use isSimple()
bool geos::operation::IsSimpleOp::isSimpleGeometryCollection ( const geom::GeometryCollection col)
private
bool geos::operation::IsSimpleOp::isSimpleLinearGeometry ( const geom::Geometry geom)
bool geos::operation::IsSimpleOp::isSimpleMultiPoint ( const geom::MultiPoint mp)
private
bool geos::operation::IsSimpleOp::isSimplePolygonal ( const geom::Geometry geom)
private

Member Data Documentation

const geom::Geometry* geos::operation::IsSimpleOp::geom
private

Definition at line 214 of file IsSimpleOp.h.

bool geos::operation::IsSimpleOp::isClosedEndpointsInInterior
private

Definition at line 210 of file IsSimpleOp.h.

std::unique_ptr<geom::Coordinate> geos::operation::IsSimpleOp::nonSimpleLocation
private

Definition at line 216 of file IsSimpleOp.h.


The documentation for this class was generated from the following file: