One of the most useful
OGC standards is their specification of the
Dimensionally-Extended 9 Intersection Model for spatial relationships. (To give credit where is it due, this was originally developed by
Egenhofer, Clementini and others). In its most general form this model is quite complex, so to make it usable for mortal programmers, a set of commonly-useful "named predicates" have been specified. These include obvious relationships such as
intersects,
disjoint,
touches,
equals, and
contains.
But are they really so obvious? In fact not - several of them have subtle aspects to their definition which are contrary to intuition.
In particular, "
contains" (and its converse "w
ithin") has an aspect of its definition which may produce unexpected behaviour. This quirk can be expressed as "
Polygons do not contain their boundary". More precisely, the definition of contains is:
Geometry A contains Geometry B iff no points of B lie in the exterior of A, and at least one point of the interior of B lies in the interior of AThat last clause causes the trap - because of it, a LineString which is completely contained in the boundary of a Polygon is
not considered to be contained in that Polygon!
This behaviour could easily trip up someone who is simply trying to find all LineStrings which have no points outside a given Polygon. In fact, this is probably the most common usage of
contains. For this reason it's useful to define another predicate called
covers, which has the intuitively expected semantics:
Geometry A covers Geometry B iff no points of B lie in the exterior of AIts converse coveredBy is also useful as well. It's a bit of a mystery why OGC did not define this predicate. In any case, Oracle Spatial does
provide this predicate. I have added it to
JTS as well.
There's a further bonus to defining the
covers predicate. It is much easier to optimize the common use case:
covers(Rectangle, Geometry)All that is necessary to determine this condition is to perform a simple bounding box comparison. This is not possible with
contains, because even if the bounding box of Geometry is covered by the Rectangle, a further expensive operation is required to test if the Geometry lies wholly in the boundary of the Rectangle (in which case the predicate fails).
Covers "simplifies" the defintion of contains by making it more general (inclusive). There's another possibility as well, which is to simplify in the direction of being less inclusive. This would produce a predicate which might be called
containsProperly, with the definition:
Geometry A containsProperly Geometry B iff all points of B lie in the interior of AInterestingly, some recent work I'm doing indicates that this predicate might play a very useful role - but that's a story for another post.
ReferencesDE-9IM: Clementini, Eliseo, Di Felice, and van Osstrom; "A Small Set of Formal Topological Relationships Suitable for End-User Interaction," D. Abel and B.C. Ooi (Ed.),
Advances in Spatial Database—Third International Symposium. SSD '93. LNCS 692. Pp. 277-295.
9 Intersection model: M. J. Egenhofer and J. Herring; "Categorizing binary topological relationships between regions, lines, and points in geographic databases,"
Tech. Report, Department of Surveying Engineering, University of Maine, Orono, ME 1991.