Package org.locationtech.jts.operation
Class IsSimpleOp
java.lang.Object
org.locationtech.jts.operation.IsSimpleOp
Tests whether a
Geometry
is simple.
In general, the SFS specification of simplicity
follows the rule:
- A Geometry is simple if and only if the only self-intersections are at boundary points.
Simplicity is defined for each Geometry
type as follows:
- Polygonal geometries are simple by definition, so
isSimple
trivially returns true. (Note: this means that isSimple cannot be used to test for (invalid) self-intersections in Polygons. In order to check if a Polygonal geometry has self-intersections, useGeometry.isValid()
). - Linear geometries are simple iff they do not self-intersect at interior points
(i.e. points other than boundary points).
This is equivalent to saying that no two linear components satisfy the SFS
Geometry.touches(Geometry)
predicate. - Zero-dimensional (point) geometries are simple if and only if they have no repeated points.
- Empty geometries are always simple, by definition
Lineal
geometries the evaluation of simplicity
can be customized by supplying a BoundaryNodeRule
to define how boundary points are determined.
The default is the SFS-standard BoundaryNodeRule.MOD2_BOUNDARY_RULE
.
Note that under the Mod-2 rule, closed LineStrings (rings)
will never satisfy the touches predicate at their endpoints, since these are
interior points, not boundary points.
If it is required to test whether a set of LineString
s touch
only at their endpoints, use IsSimpleOp
with BoundaryNodeRule.ENDPOINT_BOUNDARY_RULE
.
For example, this can be used to validate that a set of lines form a topologically valid
linear network.- Version:
- 1.7
- See Also:
-
Nested Class Summary
Nested Classes -
Field Summary
Fields -
Constructor Summary
ConstructorsConstructorDescriptionDeprecated.use IsSimpleOp(Geometry)IsSimpleOp
(Geometry geom) Creates a simplicity checker using the default SFS Mod-2 Boundary Node RuleIsSimpleOp
(Geometry geom, BoundaryNodeRule boundaryNodeRule) Creates a simplicity checker using a givenBoundaryNodeRule
-
Method Summary
Modifier and TypeMethodDescriptionprivate void
addEndpoint
(Map endPoints, Coordinate p, boolean isClosed) Add an endpoint to the map, creating an entry for it if none existsprivate boolean
computeSimple
(Geometry geom) Gets a coordinate for the location where the geometry fails to be simple.private boolean
Tests that no edge intersection is the endpoint of a closed line.private boolean
For all edges, check if there are any intersections which are NOT at an endpoint.boolean
isSimple()
Tests whether the geometry is simple.boolean
isSimple
(LineString geom) Deprecated.use isSimple()boolean
isSimple
(MultiLineString geom) Deprecated.use isSimple()boolean
isSimple
(MultiPoint mp) Deprecated.use isSimple()private boolean
Semantics for GeometryCollection is simple iff all components are simple.private boolean
private boolean
private boolean
isSimplePolygonal
(Geometry geom) Computes simplicity for polygonal geometries.
-
Field Details
-
inputGeom
-
isClosedEndpointsInInterior
private boolean isClosedEndpointsInInterior -
nonSimpleLocation
-
-
Constructor Details
-
IsSimpleOp
public IsSimpleOp()Deprecated.use IsSimpleOp(Geometry)Creates a simplicity checker using the default SFS Mod-2 Boundary Node Rule -
IsSimpleOp
Creates a simplicity checker using the default SFS Mod-2 Boundary Node Rule- Parameters:
geom
- the geometry to test
-
IsSimpleOp
Creates a simplicity checker using a givenBoundaryNodeRule
- Parameters:
geom
- the geometry to testboundaryNodeRule
- the rule to use.
-
-
Method Details
-
isSimple
public boolean isSimple()Tests whether the geometry is simple.- Returns:
- true if the geometry is simple
-
computeSimple
-
getNonSimpleLocation
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 or null if the geometry is simple
-
isSimple
Deprecated.use isSimple()Reports whether aLineString
is simple.- Parameters:
geom
- the lineal geometry to test- Returns:
- true if the geometry is simple
-
isSimple
Deprecated.use isSimple()Reports whether aMultiLineString
geometry is simple.- Parameters:
geom
- the lineal geometry to test- Returns:
- true if the geometry is simple
-
isSimple
Deprecated.use isSimple()A MultiPoint is simple iff it has no repeated points -
isSimpleMultiPoint
-
isSimplePolygonal
Computes simplicity for polygonal geometries. Polygonal geometries are simple if and only if all of their component rings are simple.- Parameters:
geom
- a Polygonal geometry- Returns:
- true if the geometry is simple
-
isSimpleGeometryCollection
Semantics for GeometryCollection is simple iff all components are simple.- Parameters:
geom
-- Returns:
- true if the geometry is simple
-
isSimpleLinearGeometry
-
hasNonEndpointIntersection
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. -
hasClosedEndpointIntersection
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. -
addEndpoint
Add an endpoint to the map, creating an entry for it if none exists
-