With all due respect I think you need to read the spec again. Below is a very nice example from a fairly reliable source that I believe clearly indicates that:

A.equals(B) -> A.contains(B), A.within(B)

Or simply that it is always the case that:

A.contains(A) and A.within(A)

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/opt/csbp4181.htm

Basically, neither within() nor contains() care about whether the boundaries of the geometries touch. Equals IS effectively redundant as you suggest, and that is perfectly reasonable as about half of the functions are "redundant" in the same way:

A.intersects(B) <=> !A.disjoint(B)
A.contains(B) <=> B.within(A)
etc.

I would imagine they are just there for completeness and clarity.

Regards,
Chris

Todd Jellett wrote:
Read the post Paul. I very aware of what the spec is and says.

Note that nowhere do I talk about Intersection(A,B). I'm talking about the inverse of disjoint(), intersects(), the Binary Predicate.

A.equals(B) = TRUE implies that A.intersects(B) = TRUE A.touches(B) = TRUE implies that A.intersects(B) = TRUE
A.contains(B) = TRUE implies that A.intersects(B) = TRUE
A.within(B) = TRUE implies that A.intersects(B) = TRUE
A.overlaps(B) = TRUE implies that A.intersects(B) = TRUE

on the other hand this *does not* work the same way for contains/within

A.equals(B) = TRUE *does not imply* that A.within(B) = TRUE A.touches(B) = TRUE *does not imply* that A.within(B) = TRUE
A.contains(B) = TRUE *does not imply* that A.within(B) = TRUE
A.disjoint(B) = TRUE *does not imply* that A.within(B) = TRUE

So I excluded the binary predicate intersects() to simplify my example (which you seem to have missed altogether).

My example has a simple 1-ring 5-point polygon that is a square. When this geometry is tested against itself by calling each of the binary predicates in turn, I observe that A.equals(B) = TRUE, A.contains(B) = TRUE *and* A.within(B) = TRUE. This is what I am questioning the validity of.

Nowhere, absolutely nowhere in the OGC SFSQL does it say that a single geometry (any two geometries for that matter) can be equal to each other, and at the same time have A be contained in itself (or another geometry B) *and* have A within itself (or another geometry B).

If this is how it is supposed to be then the equals() predicate is redundant and could be eliminated. (equal = contains && within).

Todd

Paul Ramsey wrote:
The OGC SFSQL document says that

A.Within(B) implies Insersection(A,B) == A

And Contains is just defined for commutative purposes against Within():

A.Within(B) implies B.Contains(A).

So, you might not like the semantics, but they are implemented as defined by the standards body.

Paul

Todd Jellett wrote:
It turns out that this is also the case for identical geometries!

If you take just GeomA and run all the listed binary predicates (below) against itself, you get exactly the same as below.

Running GeomA->GeomA I get:
Disjoint    False
Equal       True
Touch      False
Contain    True
Within      True
Overlap    False

Running a simple geometry against itself should return True for Equals *only*. It is ambiguous to be also contained and within.

Todd

_______________________________________________
geos-devel mailing list
geos-devel@geos.refractions.net
http://geos.refractions.net/mailman/listinfo/geos-devel

_______________________________________________
geos-devel mailing list
geos-devel@geos.refractions.net
http://geos.refractions.net/mailman/listinfo/geos-devel

Reply via email to