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
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Community mailing list [email protected] http://lists.gispython.org/mailman/listinfo/community
