Geometry Relationships

One of the major points of having Geometry represented as an object is to be able to establish relationships to answer questions like “Are two geometries touching each other?” [] Equals ^^^^^^

You can use JTS to check if two objects are equal:

GeometryFactory geometryFactory = FactoryFinder.getGeometryFactory( null );

WKTReader reader = new WKTReader( geometryFactory );
LineString geometry = (LineString) reader.read("LINESTRING(0 0, 2 0, 5 0)");
LineString geometry = (LineString) reader.read("LINESTRING(5 0, 0 0)");

return geometry.equals( (Geometry) geometry2 );

Please note that equals is not a quick easy check as you might expect - but a real full on spatial comparison of what the data structures mean. The above code example will return true as the two line strings define exactly the same shape.

Force yourself to learn the habit of putting that (Geometry) cast in there; only habit can avoid the mistake of getting confused with Object equals.

This method will fail if called on an invalid geometry.

  • Common Mistake - Getting confused with Object Equals

    Here is an example of this common mistake:

    return geometry.equals( other ); // will use Object.equals( obj ) which is the same as the == operator
    

    Here is the correction:

    return geometry.equals( (Geometry) other );
    
  • Equals Exact Relationship

    You can check if two geometries are exactly equal; right down to the coordinate level:

    return geometry.equalsExact( (Geometry) geometry2 );
    

    This method is faster than equals(geometry) and is closer to what normal Java programs assume for a data object equals method implementation. We are checking the internal structure; rather than the meaning.

    The equalsExact method is able to function on invalid geometries.

  • Alternative - Identity Operator

    Normal Java identity operator also has its place; don’t forget about it:

    return geometry == geometry2;
    

Disjoint

The geometries have no points in common.:

return geometry.disjoint( geometry2 );

Intersects

The geometries have at least one point in common.:

return geometry.intersects( geometry2 );

This will test if any point on the boundary or within a geometry is part of the boundary or within a second geometry.

  • Alternative - not disjoint

    This is the opposite of disjoint:

    return !geometryA.disjoint( geometry2 );
    

Touches

The geometries only touch edges and do not overlap in any way:

return geometryA.touches( geometry2 );

Crosses

The geometries do more than touch, they actually overlap edges:

return geometryA.crosses( geometry2 );

Within

One geometry is completely within another (no touching edges):

return geometryA.within( geometry2 );

Contains

One geometry contains another:

return geometryA.contains( geometry2 );

Overlaps

The geometries have some points in common; but not all points in common (so if one geometry is inside the other overlaps would be false). The overlapping section must be the same kind of shape as the two geometries; so two polygons that touch on a point are not considered to be overlapping.:

return geometryA.overlaps( geometry2 );

The definition of the overlaps relationship is a little bit different than that used in common English (normally you would assume that a geometry contained inside another geometry is “overlapping”; to test for that situation use Intersects)

Relates

Computes the “DE-9IM Matrix” for two Geometries allowing you to study exactly how they interact with each other.:

IntersectionMatrix m = a.relate(b);

The IntersectionMatrix allows you to separately test how the interior, exterior and edges of two geometries interact. All the above operations can be viewed as a summary of this IntersectionMatrix.