Dashboard > GeoTools 2.5 Users Guide > ... > 03 JTS Topology Suite > 02 Geometry Relationships
GeoTools 2.5 Users Guide
02 Geometry Relationships
Added by jgarnett , last edited by jgarnett on Dec 16, 2007  (view change)
Labels: 
(None)

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?"

Related

  • []

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

This is a really common mistake - I have been been using JTS for years and I still make this mistake once a month.

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 );

Alternative - 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 have no points in common.

return geometryA.touches( geometry2 );

Crosses

The geometries have no points in common.

return geometryA.crosses( geometry2 );

Within

The geometries have no points in common.

return geometryA.within( geometry2 );

Contains

The geometries have no points in common.

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)

DE-9IM Matrix for two Geometies

IntersectionMatrix m = a.relate(b);

Site running on a free Atlassian Confluence Open Source Project License granted to The Codehaus. Evaluate Confluence today.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.6.2 Build:#919 Nov 26, 2007) - Bug/feature request - Contact Administrators