Patrick Hartling wrote:
> Sean Gillies wrote:
>> On Jan 21, 2010, at 5:35 PM, Patrick Hartling wrote:
>>
>>> Howard Butler wrote:
>>>> On Jan 21, 2010, at 9:30 AM, Patrick Hartling wrote:
>>>>
>>>>> We have run into a strange problem with the is_empty property on  
>>>>> Shapely
>>>>> goemetry objects failing on Linux. We are using r1485 from the  
>>>>> Shapely 1.2
>>>>> branch with GEOS 3.1.1 and Python 2.6.2 on 64-bit Ubuntu Linux  
>>>>> 9.04. The
>>>>> code below demonstrates the problem:
>>>>>
>>>>> import shapely.geometry
>>>>> assert shapely.geometry.Point(1,1).is_empty == False
>>>> What about this?  Maybe the chaining is causing the reference to go  
>>>> bad.
>>>>
>>>> p = shapely.geometry.Point(1,1)
>>>> p.is_empty
>>> The result is the same in that case: is_empty still returns False.
>>>
>>> -Patrick
>> An "empty" geometry is an odd beast. Not quite the same as None, it's  
>> a reflection of whether the geometry has coordinates or a sequence of  
>> coordinates. A Point with x and y values set is definitely not empty.  
>> The following is correct:
>>
>>    >>> from shapely.geometry import Point
>>    >>> p = Point(0, 0)
>>    >>> p.is_empty
>>    False
>>
>> Thanks for trying the code, Patrick. I'm going to try to make a second  
>> alpha release of 1.2 tonight or tomorrow and will notify this list.
> 
> Using r1521 of the Shapely 1.2 branch, I get the same failure with is_empty:
> 
>    >>> from shapely.geometry import Point
>    >>> p = Point(0, 0)
>    >>> p.is_empty
>    True
> 
> I think that the next logical thing for me to try is to run this in GDB and
> see what is happening in GEOS.

I figured out what was going wrong. The return type on some of the ctypes
declarations did not match the actual GEOS C function, and this caused bogus
results to be extracted from the stack frame. On x86_64 Linux, int is 64
bits wide. GEOS C functions that return a boolean value have char as the
return type. By using the attached patch (made against r1521 of the 1.2
branch), my test code works, and 5 Shapely test suite failures are fixed. I
have not tried this patch on Windows or Mac OS X yet, however, but I can
check on them soon.

 -Patrick


-- 
Patrick L. Hartling
Senior Software Engineer, Priority 5
http://www.priority5.com/

The information transmitted in this communication is intended only for
the person or entity to which it is addressed and contains proprietary
material. Any review, retransmission, dissemination or other use of, or
taking of any action in reliance upon, this information by persons or
entities other than the intended recipient is prohibited. If you
received this in error, please destroy any copies, contact the sender
and delete the material from any computer.
Index: shapely/ctypes_declarations.py
===================================================================
--- shapely/ctypes_declarations.py	(revision 1521)
+++ shapely/ctypes_declarations.py	(working copy)
@@ -134,46 +134,46 @@
     lgeos.GEOSRelatePattern.restype = ctypes.c_char
     lgeos.GEOSRelatePattern.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_char_p]
 
-    lgeos.GEOSDisjoint.restype = ctypes.c_int
+    lgeos.GEOSDisjoint.restype = ctypes.c_int8
     lgeos.GEOSDisjoint.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
 
-    lgeos.GEOSTouches.restype = ctypes.c_int
+    lgeos.GEOSTouches.restype = ctypes.c_int8
     lgeos.GEOSTouches.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
 
-    lgeos.GEOSIntersects.restype = ctypes.c_int
+    lgeos.GEOSIntersects.restype = ctypes.c_int8
     lgeos.GEOSIntersects.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
 
-    lgeos.GEOSCrosses.restype = ctypes.c_int
+    lgeos.GEOSCrosses.restype = ctypes.c_int8
     lgeos.GEOSCrosses.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
 
-    lgeos.GEOSWithin.restype = ctypes.c_int
+    lgeos.GEOSWithin.restype = ctypes.c_int8
     lgeos.GEOSWithin.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
 
-    lgeos.GEOSContains.restype = ctypes.c_int
+    lgeos.GEOSContains.restype = ctypes.c_int8
     lgeos.GEOSContains.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
 
-    lgeos.GEOSOverlaps.restype = ctypes.c_int
+    lgeos.GEOSOverlaps.restype = ctypes.c_int8
     lgeos.GEOSOverlaps.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
 
-    lgeos.GEOSEquals.restype = ctypes.c_int
+    lgeos.GEOSEquals.restype = ctypes.c_int8
     lgeos.GEOSEquals.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
 
-    lgeos.GEOSEqualsExact.restype = ctypes.c_int
+    lgeos.GEOSEqualsExact.restype = ctypes.c_int8
     lgeos.GEOSEqualsExact.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_double]
 
-    lgeos.GEOSisEmpty.restype = ctypes.c_int
+    lgeos.GEOSisEmpty.restype = ctypes.c_int8
     lgeos.GEOSisEmpty.argtypes = [ctypes.c_void_p]
 
-    lgeos.GEOSisValid.restype = ctypes.c_int
+    lgeos.GEOSisValid.restype = ctypes.c_int8
     lgeos.GEOSisValid.argtypes = [ctypes.c_void_p]
 
-    lgeos.GEOSisSimple.restype = ctypes.c_int
+    lgeos.GEOSisSimple.restype = ctypes.c_int8
     lgeos.GEOSisSimple.argtypes = [ctypes.c_void_p]
 
-    lgeos.GEOSisRing.restype = ctypes.c_int
+    lgeos.GEOSisRing.restype = ctypes.c_int8
     lgeos.GEOSisRing.argtypes = [ctypes.c_void_p]
 
-    lgeos.GEOSHasZ.restype = ctypes.c_int
+    lgeos.GEOSHasZ.restype = ctypes.c_int8
     lgeos.GEOSHasZ.argtypes = [ctypes.c_void_p]
 
     lgeos.GEOSGeomType.restype = ctypes.c_char_p

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Community mailing list
[email protected]
http://lists.gispython.org/mailman/listinfo/community

Reply via email to