[Community] Polygon.contains() fails after being called few dozen times

Sean Gillies sgillies at frii.com
Tue Jul 8 19:20:16 EEST 2008


Jaakko Salli wrote:
> Sean Gillies wrote:
>> Jaakko Salli wrote:
>>> sgillies at frii.com wrote:
>>>>> Jaakko Salli wrote:
>>>>>> Brent Pedersen wrote:
>>>>>>> On Wed, Jun 25, 2008 at 8:52 AM, Jaakko Salli <jaakko.salli at pp.inet.fi>
>>>>>>> wrote:
>>>>>>>> Hi all,
>>>>>>>>
>>>>>>>> I have encountered strange problem with Polygon.contains(Point). It
>>>>>>>> seems it stops functioning correctly after being called 21 times. At
>>>>>>>> that point, instead of checking if point is inside the polygon, it
>>>>>>>> just
>>>>>>>> check if it is inside polygon's bounding box.
>>>>>>>>
>>>>>>>> Here is code to reproduce the issue (I have tried it with Python 2.5.2
>>>>>>>> and Shapely SVN trunk):
>>>>>>>>
>>>>>>>> from shapely.geometry import Point, Polygon
>>>>>>>>
>>>>>>>> # Form a 'L' shaped polygon
>>>>>>>> points = [(0.0, 0.0),
>>>>>>>>          (1.0, 0.0),
>>>>>>>>          (1.0, 1.0),
>>>>>>>>          (2.0, 1.0),
>>>>>>>>          (2.0, 2.0),
>>>>>>>>          (0.0, 2.0),
>>>>>>>>          (0.0, 0.0)]
>>>>>>>>
>>>>>>>> poly = Polygon(points)
>>>>>>>>
>>>>>>>> # Create point that should be outside polygon, but
>>>>>>>> # inside its bounding box
>>>>>>>> pt_outside_but_inside_bbox = Point(1.5, 0.5)
>>>>>>>>
>>>>>>>> # Create point that should be outside polygon,
>>>>>>>> # even outside its bounding box
>>>>>>>> pt_outside_even_bbox = Point(2.5, 0.5)
>>>>>>>>
>>>>>>>> # At iteration number 22, poly.contains effectively becomes
>>>>>>>> # poly_bounding_box.contains
>>>>>>>> for i in range(1,100):
>>>>>>>>    res1 = poly.contains(pt_outside_but_inside_bbox)
>>>>>>>>    res2 = poly.contains(pt_outside_even_bbox)
>>>>>>>>    print '#%i: poly.contains(pt_outside_but_inside_bbox) = %s'%(i,
>>>>>>>> res1)
>>>>>>>>    print '     poly.contains(pt_outside_even_bbox) = %s'%(res2)
>>>>>>>>    if res1 != False:
>>>>>>>>        print "poly.contains failed at try #%i!"%(i)
>>>>>>>>        break
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>>  Jaakko Salli
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Community mailing list
>>>>>>>> Community at lists.gispython.org
>>>>>>>> http://lists.gispython.org/mailman/listinfo/community
>>>>>>>>
>>>>>>> thankfully, i dont see this with r1117. that scared me.
>>>>>>> even upped the range to 100K and no problems.
>>>>>>> fwiw, i'm using geos 3.0.0, not an rc...
>>>>>> I'm using the geos DLL provided with the Windows installer
>>>>>> (also using Windows XP SP2, if that matters).
>>>>> I have now built geos 3.0.0 DLL with msys+MingW32. Seems to have fixed
>>>>> the issue.
>>>>>
>>>>> Sorry for bothering :)
>>>>>
>>>>> Thanks,
>>>>>   Jaakko
>>>> Jaakko, would you be willing to put that DLL online so I can download and
>>>> compare it to the one I am distributing?
>>> Here you go:
>>>
>>> http://personal.inet.fi/private/jmsalli/geos_dlls.zip
>>>
>>> I didn't use any configure options, but did run 'strip -d' after make was
>>> done.
>>>
>>> Jaakko
>> Jaakko,
>>
>> I'm back in my office, trying to reproduce the problem, and have run
>> into something that disturbs me ...
>>
>> Save the attached doctest file and run it like
>>
>>   >>> import doctest
>>   >>> doctest.testfile('ops-repeat.txt')
>>
>> On Linux (w/ Python 2.5, GEOS 3.0) the test passes. The test also passes
>> when I use your new DLLs. I can confirm that if I use the geos.dll I
>> have been distributing, the test fails on the 22nd interation. I have no
>> idea WTF is going on in that case :(
>>
>> I'm not a Windows platform expert at all ... will your DLLs work on all
>> Win32 systems? I'm testing on Windows 2000 here.
>>
>> Cheers,
>> Sean
> Sorry, I can only test with XP, but since it works on your Windows 2000 
> I can't think of any reason why low-level stuff like this would not work 
> on all modern NT-based versions of Windows (ie. Win2K and later). 
> Win95-based ones are another matter, although I still think that it will 
> work.
> 
> One thing however: On Windows, Python 2.5 extensions are supposed to be 
> built with Visual C++ 7, but your included makefile failed for me. So, I 
> tried mingw, and was surprised that the resulting DLLs worked. Mingw 
> links with the same CRT as VC7, so that probably helped.
> 
> Jaakko

Jaakko,

I'd like to use your DLLs for future Shapely windows installers. Can the
size of the second be reduced at all?

Sean




More information about the Community mailing list