[geos-devel] Re: [postgis-users] ST_Contains doesn't work?

Martin Davis mbdavis at refractions.net
Fri Jan 25 11:38:40 EST 2008


The original code is correct as it stands.   Your fix works because it 
just removes a potential optimization.

The fix that Ben posted is the correct one (and has been implemented in 
JTS as well).

KXK wrote:
> Paul & Ben J.
>
>
> I found a quick solution for this "Contains" problem.
>
> These 3 lines below should be deleted to fix this bug.
>
> source/geom/Geomtry.cpp
>
> bool
> Geometry::contains(const Geometry *g) const
> {
> .
> .
> .
> 	if (isRectangle()) {
> 		return predicate::RectangleContains::contains((Polygon&)*this, *g);
> 	}
> // Delete from here
> 	if (g->isRectangle()) {
> 		return predicate::RectangleContains::contains((const Polygon&)*g, *this);
> 	}
> // Delete until here
> .
> .
> }
>
>
>
> The reason why I thought of deleting these 3 lines was:
>
> The 1st argument should be passed as the 2nd argument,
> and the 2nd argument should be passed as the 1st argument,
> because it should varify if *this contains *g. Not the other way around.
>
> BUT, predicate::RectangleContains::contains method accepts the 1st
> argument only being a rectangle.
> So, passing *this as the 1st argument is not acceptable since *this is
> not guaranteed as a rectangle; it is just a geometry.
>
>
> I will put this info to the below site, too.
> http://trac.osgeo.org/geos/
>
> What do you think about the solution? I need your feedbacks.
>
>
> Good Day,
>
> KXK
>
>
> 2008/1/18, KXK <vivahome2 at gmail.com>:
>   
>> Paul
>>
>>
>> Thanx for a quick reply.
>>
>> At http://trac.osgeo.org/geos, I issued a ticket whose number is #171.
>>
>>
>> KXK
>>
>> 2008/1/18, Paul Ramsey <pramsey at refractions.net>:
>>     
>>> I think this must be arising in the "I'm a box so I can short-circuit
>>> full computation" code. The error displays with different combinations
>>> of square and non-square arguments.
>>>
>>> On Jan 17, 2008, at 7:55 PM, Paul Ramsey wrote:
>>>
>>>       
>>>> I just confirmed this behavior. true/true on geos 2.2 true/false on
>>>> geos 3.0.
>>>> Please file this at http://trac.osgeo.org/geos, it's real, and it's
>>>> not right.
>>>>
>>>> P
>>>>
>>>> On Jan 17, 2008, at 7:35 PM, KXK wrote:
>>>>
>>>>         
>>>>> SELECT
>>>>> ST_Contains(
>>>>> GeomFromText('POLYGON((0 0,0 10,10 10,10 0,0 0))', -1),
>>>>> GeomFromText('POLYGON((5 5,5 6,6 6,6 5,5 5))', -1) );
>>>>>
>>>>> returns TRUE
>>>>>
>>>>>
>>>>> But,
>>>>>
>>>>> SELECT
>>>>> ST_Contains(
>>>>> GeomFromText('POLYGON((0 0,0 11,11 10,10 0,0 0))', -1),
>>>>> GeomFromText('POLYGON((5 5,5 6,6 6,6 5,5 5))', -1) );
>>>>>
>>>>> returns FALSE
>>>>>
>>>>> I thought the above would also return TRUE.
>>>>>
>>>>>
>>>>> Is this behavior of ST_Contains correct?
>>>>>
>>>>> [VERSION INFORMATION]
>>>>> OS: fc6
>>>>> PostgreSQL: 8.2.4
>>>>> PostGIS: 1.2
>>>>> GEOS: 3.0.0
>>>>> _______________________________________________
>>>>> postgis-users mailing list
>>>>> postgis-users at postgis.refractions.net
>>>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>>>>           
>>>> _______________________________________________
>>>> geos-devel mailing list
>>>> geos-devel at lists.osgeo.org
>>>> http://lists.osgeo.org/mailman/listinfo/geos-devel
>>>>         
>>> _______________________________________________
>>> geos-devel mailing list
>>> geos-devel at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/geos-devel
>>>
>>>       
> _______________________________________________
> geos-devel mailing list
> geos-devel at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/geos-devel
>
>   

-- 
Martin Davis
Senior Technical Architect
Refractions Research, Inc.
(250) 383-3022



More information about the geos-devel mailing list