Hi Adam,

On 24-9-2013 15:13, Adam Wulkiewicz wrote:
Mateusz Loskot wrote:
On 24 September 2013 13:44, Barend Gehrels <barend@xs4all.nl> wrote:
On 24-9-2013 1:22, Adam Wulkiewicz wrote:
I'm playing with the implementation of missing boolean operations.
Currently I'm implementing within(Poly, Poly).

Great!
Indeed!

I figured out that I'll check if there is some point of the first polygon
within the second one using detail::within::point_in_polygon and then check
if the first polygon's exterior ring doesn't overlap the second polygon
rings. I can't use detail::disjoint::disjoint_linear because this will
return false for polygons which boundries overlap. And within() should
return true also for those cases. I thought I'll use
boost::geometry::get_turns, the same like it's used in the implementation of
the touches() algorithm. Basically I need to detect if the boundries crosses
or just touches itself. Is it possible to use get_turns this way?

Yes. One detail, in case you are not aware of this: within should return
false even if the whole polygon is more or less inside, touching only the
border from the inside. So there should be no intersections at all.
I'd also point to PostGIS documentation (OGC specification may be a
bit tricky to grasp it all),
where the within/contains relations is well explained and visualised

http://postgis.net/docs/manual-2.0/ST_Within.html
http://postgis.net/docs/manual-2.0/ST_Contains.html

See important notes about boundary.


So am I bad at interpretation of the standard?

Probably I was bad... Thanks for the wiki-page, I did not know of its existance.

E.g. here:
OpenGIS® Implementation Standard for Geographic information - Simple feature access - Part 1: Common architecture, page 38 (even the picture)
or here:
http://en.wikipedia.org/wiki/DE-9IM
Within is defined as an operation which return true if there is at least one point of the interior of the first geometry in the interior of the second one and the interior and boundry of the first geometry isn't in the exterior of the second geometry. But boundries may overlap. It just must have at least one point in the interior of the second geometry. Covered by musn't, may be 'wholly contained' in the boundry.

This is new for me. I always thought that within was fully inside, I did not look it up this morning. But maybe this is only for point-in-polygon...

I see also there: (1) a is within b, a lies in the interior of b.
And also (contains): (2) b is within a. Geometry b lies in the interior of a. Another definition: "a 'contains' 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 a"

contains is reversal of within.

But indeed, (2) says there may be someting on the boundary.

More here:
http://lin-ear-th-inking.blogspot.nl/2007/06/subtleties-of-ogc-covers-spatial.html



And e.g. here:

http://postgis.net/docs/manual-2.0/ST_Within.html

states: It is a given that if ST_Within(A,B) is true and ST_Within(B,A) is true, then the two geometries are considered spatially equal.

If within() returns true only if boundries don't overlap, how those both functions may return true at the same time?
Another thing is that this can't work for 0-sized degenerated polygons because there won't be any interior.

Is my reasoning wrong at some point?


No, you are completely right.

Thanks, Barend