shapely 1.0.6__tar.gz → 1.0.11__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. {Shapely-1.0.6 → Shapely-1.0.11}/CHANGES.txt +24 -1
  2. Shapely-1.0.11/GEOS-C-API.txt +55 -0
  3. {Shapely-1.0.6 → Shapely-1.0.11}/PKG-INFO +6 -3
  4. {Shapely-1.0.6 → Shapely-1.0.11}/README.txt +4 -1
  5. {Shapely-1.0.6 → Shapely-1.0.11}/Shapely.egg-info/PKG-INFO +6 -3
  6. {Shapely-1.0.6 → Shapely-1.0.11}/Shapely.egg-info/SOURCES.txt +3 -0
  7. {Shapely-1.0.6 → Shapely-1.0.11}/setup.py +2 -4
  8. {Shapely-1.0.6 → Shapely-1.0.11}/setup_windows.py +2 -4
  9. Shapely-1.0.11/shapely/ctypes_declarations.py +204 -0
  10. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geometry/base.py +2 -0
  11. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geometry/polygon.py +33 -20
  12. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geos.py +12 -9
  13. {Shapely-1.0.6 → Shapely-1.0.11}/tests/Polygon.txt +0 -1
  14. Shapely-1.0.11/tests/dimensions.txt +17 -0
  15. {Shapely-1.0.6 → Shapely-1.0.11}/CREDITS.txt +0 -0
  16. {Shapely-1.0.6 → Shapely-1.0.11}/HISTORY.txt +0 -0
  17. {Shapely-1.0.6 → Shapely-1.0.11}/LICENSE.txt +0 -0
  18. {Shapely-1.0.6 → Shapely-1.0.11}/Shapely.egg-info/dependency_links.txt +0 -0
  19. {Shapely-1.0.6 → Shapely-1.0.11}/Shapely.egg-info/requires.txt +0 -0
  20. {Shapely-1.0.6 → Shapely-1.0.11}/Shapely.egg-info/top_level.txt +0 -0
  21. {Shapely-1.0.6 → Shapely-1.0.11}/examples/geoms.py +0 -0
  22. {Shapely-1.0.6 → Shapely-1.0.11}/examples/world.py +0 -0
  23. {Shapely-1.0.6 → Shapely-1.0.11}/manual/manual.txt +0 -0
  24. {Shapely-1.0.6 → Shapely-1.0.11}/manual/style.css +0 -0
  25. {Shapely-1.0.6 → Shapely-1.0.11}/setup.cfg +0 -0
  26. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/__init__.py +0 -0
  27. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geometry/__init__.py +0 -0
  28. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geometry/collection.py +0 -0
  29. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geometry/geo.py +0 -0
  30. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geometry/linestring.py +0 -0
  31. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geometry/multilinestring.py +0 -0
  32. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geometry/multipoint.py +0 -0
  33. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geometry/multipolygon.py +0 -0
  34. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geometry/point.py +0 -0
  35. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/geometry/proxy.py +0 -0
  36. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/iterops.py +0 -0
  37. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/kml.py +0 -0
  38. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/ops.py +0 -0
  39. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/predicates.py +0 -0
  40. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/topology.py +0 -0
  41. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/wkb.py +0 -0
  42. {Shapely-1.0.6 → Shapely-1.0.11}/shapely/wkt.py +0 -0
  43. {Shapely-1.0.6 → Shapely-1.0.11}/tests/Array.txt +0 -0
  44. {Shapely-1.0.6 → Shapely-1.0.11}/tests/GeoInterface.txt +0 -0
  45. {Shapely-1.0.6 → Shapely-1.0.11}/tests/IterOps.txt +0 -0
  46. {Shapely-1.0.6 → Shapely-1.0.11}/tests/LineString.txt +0 -0
  47. {Shapely-1.0.6 → Shapely-1.0.11}/tests/MultiLineString.txt +0 -0
  48. {Shapely-1.0.6 → Shapely-1.0.11}/tests/MultiPoint.txt +0 -0
  49. {Shapely-1.0.6 → Shapely-1.0.11}/tests/MultiPolygon.txt +0 -0
  50. {Shapely-1.0.6 → Shapely-1.0.11}/tests/Operations.txt +0 -0
  51. {Shapely-1.0.6 → Shapely-1.0.11}/tests/Persist.txt +0 -0
  52. {Shapely-1.0.6 → Shapely-1.0.11}/tests/Point.txt +0 -0
  53. {Shapely-1.0.6 → Shapely-1.0.11}/tests/Predicates.txt +0 -0
  54. {Shapely-1.0.6 → Shapely-1.0.11}/tests/__init__.py +0 -0
  55. {Shapely-1.0.6 → Shapely-1.0.11}/tests/attribute-chains.txt +0 -0
  56. {Shapely-1.0.6 → Shapely-1.0.11}/tests/binascii_hex.txt +0 -0
  57. {Shapely-1.0.6 → Shapely-1.0.11}/tests/invalid_intersection.txt +0 -0
  58. {Shapely-1.0.6 → Shapely-1.0.11}/tests/polygonize.txt +0 -0
  59. {Shapely-1.0.6 → Shapely-1.0.11}/tests/rungrind.dist +0 -0
  60. {Shapely-1.0.6 → Shapely-1.0.11}/tests/test_doctests.py +0 -0
  61. {Shapely-1.0.6 → Shapely-1.0.11}/tests/test_threads.py +0 -0
  62. {Shapely-1.0.6 → Shapely-1.0.11}/tests/valgrind-python.supp +0 -0
@@ -1,4 +1,27 @@
1
- All tickets are children of http://trac.gispython.org/projects/PCL/ticket/
1
+ All tickets are children of http://trac.gispython.org/lab/ticket.
2
+
3
+ 1.0.11 (2008-11-20)
4
+ -------------------
5
+ - Work around bug in GEOS 2.2.3, GEOSCoordSeq_getOrdinate not exported properly
6
+ (#178).
7
+
8
+ 1.0.10 (2008-11-17)
9
+ -------------------
10
+ - Fixed compatibility with GEOS 2.2.3 that was broken in 1.0.8 release (#176).
11
+
12
+ 1.0.9 (2008-11-16)
13
+ ------------------
14
+ - Find and load MacPorts libgeos.
15
+
16
+ 1.0.8 (2008-11-01)
17
+ ------------------
18
+ - Fill out GEOS function result and argument types to prevent faults on a
19
+ 64-bit arch.
20
+
21
+ 1.0.7 (2008-08-22)
22
+ ------------------
23
+ - Polygon rings now have the same dimensions as parent (#168).
24
+ - Eliminated reference cycles in polygons (#169).
2
25
 
3
26
  1.0.6 (2008-07-10)
4
27
  ------------------
@@ -0,0 +1,55 @@
1
+ Ctypes declarations for functions present in GEOS C API 1.4, but not present in
2
+ 1.3, are listed below:
3
+
4
+ lgeos.GEOS_getWKBOutputDims.restype = ctypes.c_int
5
+ lgeos.GEOS_getWKBByteOrder.restype = ctypes.c_int
6
+ lgeos.GEOS_setWKBByteOrder.restype = ctypes.c_int
7
+ lgeos.GEOS_setWKBByteOrder.argtypes = [ctypes.c_int]
8
+ lgeos.GEOSGeomFromHEX_buf.restype = ctypes.c_void_p
9
+ lgeos.GEOSGeomFromHEX_buf.argtypes = [ctypes.c_void_p, ctypes.c_size_t]
10
+ lgeos.GEOSSimplify.restype = ctypes.c_void_p
11
+ lgeos.GEOSSimplify.argtypes = [ctypes.c_void_p, ctypes.c_double]
12
+ lgeos.GEOSTopologyPreserveSimplify.restype = ctypes.c_void_p
13
+ lgeos.GEOSTopologyPreserveSimplify.argtypes = [ctypes.c_void_p, ctypes.c_double]
14
+ lgeos.GEOSEqualsExact.restype = ctypes.c_int
15
+ lgeos.GEOSEqualsExact.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_double]
16
+ lgeos.GEOSNormalize.restype = ctypes.c_int
17
+ lgeos.GEOSNormalize.argtypes = [ctypes.c_void_p]
18
+ lgeos.GEOSWKTReader_create.restype = ctypes.c_void_p
19
+ lgeos.GEOSWKTReader_destroy.restype = None
20
+ lgeos.GEOSWKTReader_destroy.argtypes = [ctypes.c_void_p]
21
+ lgeos.GEOSWKTReader_read.restype = ctypes.c_void_p
22
+ lgeos.GEOSWKTReader_read.argtypes = [ctypes.c_void_p, ctypes.c_char_p]
23
+ lgeos.GEOSWKTWriter_create.restype = ctypes.c_void_p
24
+ lgeos.GEOSWKTWriter_destroy.restype = None
25
+ lgeos.GEOSWKTWriter_destroy.argtypes = [ctypes.c_void_p]
26
+ lgeos.GEOSWKTWriter_write.restype = ctypes.c_char_p
27
+ lgeos.GEOSWKTWriter_write.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
28
+ lgeos.GEOSWKBReader_create.restype = ctypes.c_void_p
29
+ lgeos.GEOSWKBReader_destroy.restype = None
30
+ lgeos.GEOSWKBReader_destroy.argtypes = [ctypes.c_void_p]
31
+ lgeos.GEOSWKBReader_read.restype = ctypes.c_void_p
32
+ lgeos.GEOSWKBReader_read.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_size_t]
33
+ lgeos.GEOSWKBReader_readHEX.restype = ctypes.c_void_p
34
+ lgeos.GEOSWKBReader_readHEX.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_size_t]
35
+ lgeos.GEOSWKBWriter_create.restype = ctypes.c_void_p
36
+ lgeos.GEOSWKBWriter_destroy.restype = None
37
+ lgeos.GEOSWKBWriter_destroy.argtypes = [ctypes.c_void_p]
38
+ lgeos.GEOSWKBWriter_getOutputDimension.restype = ctypes.c_int
39
+ lgeos.GEOSWKBWriter_getOutputDimension.argtypes = [ctypes.c_void_p]
40
+ lgeos.GEOSWKBWriter_setOutputDimension.restype = None
41
+ lgeos.GEOSWKBWriter_setOutputDimension.argtypes = [ctypes.c_void_p, ctypes.c_int]
42
+ lgeos.GEOSWKBWriter_getByteOrder.restype = ctypes.c_int
43
+ lgeos.GEOSWKBWriter_getByteOrder.argtypes = [ctypes.c_void_p]
44
+ lgeos.GEOSWKBWriter_setByteOrder.restype = None
45
+ lgeos.GEOSWKBWriter_setByteOrder.argtypes = [ctypes.c_void_p, ctypes.c_int]
46
+ lgeos.GEOSWKBWriter_getIncludeSRID.restype = ctypes.c_char
47
+ lgeos.GEOSWKBWriter_getIncludeSRID.argtypes = [ctypes.c_void_p]
48
+ lgeos.GEOSWKBWriter_setIncludeSRID.restype = None
49
+ lgeos.GEOSWKBWriter_setIncludeSRID.argtypes = [ctypes.c_void_p, ctypes.c_char]
50
+
51
+ Furthermore, the following unneeded declarations are removed to avoid problems
52
+ with Debian's 2.2.3 package:
53
+
54
+ lgeos.GEOSCoordSeq_getOrdinate.restype = ctypes.c_int
55
+ lgeos.GEOSCoordSeq_getOrdinate.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_uint, ctypes.c_void_p]
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: Shapely
3
- Version: 1.0.6
3
+ Version: 1.0.11
4
4
  Summary: Geospatial geometries, predicates, and operations
5
- Home-page: http://trac.gispython.org/projects/PCL/wiki/Shapely
5
+ Home-page: http://trac.gispython.org/lab/wiki/Shapely
6
6
  Author: Sean Gillies
7
7
  Author-email: sgillies@frii.com
8
8
  License: BSD
@@ -21,6 +21,10 @@ Description: Shapely
21
21
  Shapely requires Python 2.4+. (I've also begun to port it to Python 3.0:
22
22
  http://zcologia.com/news/564/shapely-for-python-3-0/.)
23
23
 
24
+ .. note::
25
+ We've switched to Windows GEOS DLLs based on MinGW in versions >= 1.0.6.
26
+ Please contact us if you experience difficulties.
27
+
24
28
  See also CHANGES.txt_ and HISTORY.txt_.
25
29
 
26
30
  .. _CHANGES.txt: http://trac.gispython.org/projects/PCL/browser/Shapely/trunk/CHANGES.txt
@@ -168,7 +172,6 @@ Description: Shapely
168
172
  Major portions of this work were supported by a grant (to Pleiades) from the
169
173
  U.S. National Endowment for the Humanities (http://www.neh.gov).
170
174
 
171
-
172
175
  Keywords: geometry topology
173
176
  Platform: UNKNOWN
174
177
  Classifier: Development Status :: 5 - Production/Stable
@@ -13,6 +13,10 @@ to other packages like WorldMill_ and pyproj_. For more information, see:
13
13
  Shapely requires Python 2.4+. (I've also begun to port it to Python 3.0:
14
14
  http://zcologia.com/news/564/shapely-for-python-3-0/.)
15
15
 
16
+ .. note::
17
+ We've switched to Windows GEOS DLLs based on MinGW in versions >= 1.0.6.
18
+ Please contact us if you experience difficulties.
19
+
16
20
  See also CHANGES.txt_ and HISTORY.txt_.
17
21
 
18
22
  .. _CHANGES.txt: http://trac.gispython.org/projects/PCL/browser/Shapely/trunk/CHANGES.txt
@@ -159,4 +163,3 @@ Credits
159
163
 
160
164
  Major portions of this work were supported by a grant (to Pleiades) from the
161
165
  U.S. National Endowment for the Humanities (http://www.neh.gov).
162
-
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: Shapely
3
- Version: 1.0.6
3
+ Version: 1.0.11
4
4
  Summary: Geospatial geometries, predicates, and operations
5
- Home-page: http://trac.gispython.org/projects/PCL/wiki/Shapely
5
+ Home-page: http://trac.gispython.org/lab/wiki/Shapely
6
6
  Author: Sean Gillies
7
7
  Author-email: sgillies@frii.com
8
8
  License: BSD
@@ -21,6 +21,10 @@ Description: Shapely
21
21
  Shapely requires Python 2.4+. (I've also begun to port it to Python 3.0:
22
22
  http://zcologia.com/news/564/shapely-for-python-3-0/.)
23
23
 
24
+ .. note::
25
+ We've switched to Windows GEOS DLLs based on MinGW in versions >= 1.0.6.
26
+ Please contact us if you experience difficulties.
27
+
24
28
  See also CHANGES.txt_ and HISTORY.txt_.
25
29
 
26
30
  .. _CHANGES.txt: http://trac.gispython.org/projects/PCL/browser/Shapely/trunk/CHANGES.txt
@@ -168,7 +172,6 @@ Description: Shapely
168
172
  Major portions of this work were supported by a grant (to Pleiades) from the
169
173
  U.S. National Endowment for the Humanities (http://www.neh.gov).
170
174
 
171
-
172
175
  Keywords: geometry topology
173
176
  Platform: UNKNOWN
174
177
  Classifier: Development Status :: 5 - Production/Stable
@@ -1,5 +1,6 @@
1
1
  CHANGES.txt
2
2
  CREDITS.txt
3
+ GEOS-C-API.txt
3
4
  HISTORY.txt
4
5
  LICENSE.txt
5
6
  README.txt
@@ -15,6 +16,7 @@ examples/world.py
15
16
  manual/manual.txt
16
17
  manual/style.css
17
18
  shapely/__init__.py
19
+ shapely/ctypes_declarations.py
18
20
  shapely/geos.py
19
21
  shapely/iterops.py
20
22
  shapely/kml.py
@@ -49,6 +51,7 @@ tests/Predicates.txt
49
51
  tests/__init__.py
50
52
  tests/attribute-chains.txt
51
53
  tests/binascii_hex.txt
54
+ tests/dimensions.txt
52
55
  tests/invalid_intersection.txt
53
56
  tests/polygonize.txt
54
57
  tests/rungrind.dist
@@ -1,4 +1,3 @@
1
-
2
1
  from setuptools import setup, Extension
3
2
  from sys import version_info
4
3
 
@@ -11,7 +10,7 @@ if version_info[:2] < (2,5):
11
10
  readme_text = file('README.txt', 'rb').read()
12
11
 
13
12
  setup(name = 'Shapely',
14
- version = '1.0.6',
13
+ version = '1.0.11',
15
14
  description = 'Geospatial geometries, predicates, and operations',
16
15
  license = 'BSD',
17
16
  keywords = 'geometry topology',
@@ -19,7 +18,7 @@ setup(name = 'Shapely',
19
18
  author_email = 'sgillies@frii.com',
20
19
  maintainer = 'Sean Gillies',
21
20
  maintainer_email = 'sgillies@frii.com',
22
- url = 'http://trac.gispython.org/projects/PCL/wiki/Shapely',
21
+ url = 'http://trac.gispython.org/lab/wiki/Shapely',
23
22
  long_description = readme_text,
24
23
  packages = ['shapely', 'shapely.geometry'],
25
24
  install_requires = install_requires,
@@ -35,4 +34,3 @@ setup(name = 'Shapely',
35
34
  'Topic :: Scientific/Engineering :: GIS',
36
35
  ],
37
36
  )
38
-
@@ -1,4 +1,3 @@
1
-
2
1
  from setuptools import setup, Extension
3
2
  from sys import version_info
4
3
 
@@ -11,7 +10,7 @@ if version_info[:2] < (2,5):
11
10
  readme_text = file('README.txt', 'rb').read()
12
11
 
13
12
  setup(name = 'Shapely',
14
- version = '1.0.6',
13
+ version = '1.0.11',
15
14
  description = 'Geospatial geometries, predicates, and operations',
16
15
  license = 'BSD',
17
16
  keywords = 'geometry topology',
@@ -19,7 +18,7 @@ setup(name = 'Shapely',
19
18
  author_email = 'sgillies@frii.com',
20
19
  maintainer = 'Sean Gillies',
21
20
  maintainer_email = 'sgillies@frii.com',
22
- url = 'http://trac.gispython.org/projects/PCL/wiki/Shapely',
21
+ url = 'http://trac.gispython.org/lab/wiki/Shapely',
23
22
  long_description = readme_text,
24
23
  packages = ['shapely', 'shapely.geometry'],
25
24
  data_files=[('DLLs', ['DLLs/geos.dll', 'DLLs/libgeos-3-0-0.dll']),],
@@ -36,4 +35,3 @@ setup(name = 'Shapely',
36
35
  'Topic :: Scientific/Engineering :: GIS',
37
36
  ],
38
37
  )
39
-
@@ -0,0 +1,204 @@
1
+ import ctypes
2
+
3
+ lgeos = lgeos # reduce pyflakes complaints
4
+
5
+ lgeos.initGEOS.restype = None
6
+
7
+ lgeos.finishGEOS.restype = None
8
+
9
+ lgeos.GEOSversion.restype = ctypes.c_char_p
10
+
11
+ lgeos.GEOSGeomFromWKT.restype = ctypes.c_void_p
12
+ lgeos.GEOSGeomFromWKT.argtypes = [ctypes.c_char_p]
13
+
14
+ lgeos.GEOSGeomToWKT.restype = ctypes.c_char_p
15
+ lgeos.GEOSGeomToWKT.argtypes = [ctypes.c_void_p]
16
+
17
+ lgeos.GEOS_setWKBOutputDims.restype = ctypes.c_int
18
+ lgeos.GEOS_setWKBOutputDims.argtypes = [ctypes.c_int]
19
+
20
+ lgeos.GEOSGeomFromWKB_buf.restype = ctypes.c_void_p
21
+ lgeos.GEOSGeomFromWKB_buf.argtypes = [ctypes.c_void_p, ctypes.c_size_t]
22
+
23
+ lgeos.GEOSCoordSeq_create.restype = ctypes.c_void_p
24
+ lgeos.GEOSCoordSeq_create.argtypes = [ctypes.c_uint, ctypes.c_uint]
25
+
26
+ lgeos.GEOSCoordSeq_clone.restype = ctypes.c_void_p
27
+ lgeos.GEOSCoordSeq_clone.argtypes = [ctypes.c_void_p]
28
+
29
+ lgeos.GEOSCoordSeq_destroy.restype = None
30
+ lgeos.GEOSCoordSeq_destroy.argtypes = [ctypes.c_void_p]
31
+
32
+ lgeos.GEOSCoordSeq_setX.restype = ctypes.c_int
33
+ lgeos.GEOSCoordSeq_setX.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_double]
34
+
35
+ lgeos.GEOSCoordSeq_setY.restype = ctypes.c_int
36
+ lgeos.GEOSCoordSeq_setY.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_double]
37
+
38
+ lgeos.GEOSCoordSeq_setZ.restype = ctypes.c_int
39
+ lgeos.GEOSCoordSeq_setZ.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_double]
40
+
41
+ lgeos.GEOSCoordSeq_setOrdinate.restype = ctypes.c_int
42
+ lgeos.GEOSCoordSeq_setOrdinate.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_uint, ctypes.c_double]
43
+
44
+ lgeos.GEOSCoordSeq_getX.restype = ctypes.c_int
45
+ lgeos.GEOSCoordSeq_getX.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_void_p]
46
+
47
+ lgeos.GEOSCoordSeq_getY.restype = ctypes.c_int
48
+ lgeos.GEOSCoordSeq_getY.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_void_p]
49
+
50
+ lgeos.GEOSCoordSeq_getZ.restype = ctypes.c_int
51
+ lgeos.GEOSCoordSeq_getZ.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_void_p]
52
+
53
+ lgeos.GEOSCoordSeq_getSize.restype = ctypes.c_int
54
+ lgeos.GEOSCoordSeq_getSize.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
55
+
56
+ lgeos.GEOSCoordSeq_getDimensions.restype = ctypes.c_int
57
+ lgeos.GEOSCoordSeq_getDimensions.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
58
+
59
+ lgeos.GEOSGeom_createPoint.restype = ctypes.c_void_p
60
+ lgeos.GEOSGeom_createPoint.argtypes = [ctypes.c_void_p]
61
+
62
+ lgeos.GEOSGeom_createLinearRing.restype = ctypes.c_void_p
63
+ lgeos.GEOSGeom_createLinearRing.argtypes = [ctypes.c_void_p]
64
+
65
+ lgeos.GEOSGeom_createLineString.restype = ctypes.c_void_p
66
+ lgeos.GEOSGeom_createLineString.argtypes = [ctypes.c_void_p]
67
+
68
+ lgeos.GEOSGeom_createPolygon.restype = ctypes.c_void_p
69
+ lgeos.GEOSGeom_createPolygon.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint]
70
+
71
+ lgeos.GEOSGeom_createCollection.restype = ctypes.c_void_p
72
+ lgeos.GEOSGeom_createCollection.argtypes = [ctypes.c_int, ctypes.c_void_p, ctypes.c_uint]
73
+
74
+ lgeos.GEOSGeom_clone.restype = ctypes.c_void_p
75
+ lgeos.GEOSGeom_clone.argtypes = [ctypes.c_void_p]
76
+
77
+ lgeos.GEOSGeom_destroy.restype = None
78
+ lgeos.GEOSGeom_destroy.argtypes = [ctypes.c_void_p]
79
+
80
+ lgeos.GEOSEnvelope.restype = ctypes.c_void_p
81
+ lgeos.GEOSEnvelope.argtypes = [ctypes.c_void_p]
82
+
83
+ lgeos.GEOSIntersection.restype = ctypes.c_void_p
84
+ lgeos.GEOSIntersection.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
85
+
86
+ lgeos.GEOSBuffer.restype = ctypes.c_void_p
87
+ lgeos.GEOSBuffer.argtypes = [ctypes.c_void_p, ctypes.c_double, ctypes.c_int]
88
+
89
+ lgeos.GEOSConvexHull.restype = ctypes.c_void_p
90
+ lgeos.GEOSConvexHull.argtypes = [ctypes.c_void_p]
91
+
92
+ lgeos.GEOSDifference.restype = ctypes.c_void_p
93
+ lgeos.GEOSDifference.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
94
+
95
+ lgeos.GEOSSymDifference.restype = ctypes.c_void_p
96
+ lgeos.GEOSSymDifference.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
97
+
98
+ lgeos.GEOSBoundary.restype = ctypes.c_void_p
99
+ lgeos.GEOSBoundary.argtypes = [ctypes.c_void_p]
100
+
101
+ lgeos.GEOSUnion.restype = ctypes.c_void_p
102
+ lgeos.GEOSUnion.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
103
+
104
+ lgeos.GEOSPointOnSurface.restype = ctypes.c_void_p
105
+ lgeos.GEOSPointOnSurface.argtypes = [ctypes.c_void_p]
106
+
107
+ lgeos.GEOSGetCentroid.restype = ctypes.c_void_p
108
+ lgeos.GEOSGetCentroid.argtypes = [ctypes.c_void_p]
109
+
110
+ lgeos.GEOSRelate.restype = ctypes.c_char_p
111
+ lgeos.GEOSRelate.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
112
+
113
+ lgeos.GEOSPolygonize.restype = ctypes.c_void_p
114
+ lgeos.GEOSPolygonize.argtypes = [ctypes.c_void_p, ctypes.c_uint]
115
+
116
+ lgeos.GEOSLineMerge.restype = ctypes.c_void_p
117
+ lgeos.GEOSLineMerge.argtypes = [ctypes.c_void_p]
118
+
119
+ lgeos.GEOSRelatePattern.restype = ctypes.c_char
120
+ lgeos.GEOSRelatePattern.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_char_p]
121
+
122
+ lgeos.GEOSDisjoint.restype = ctypes.c_int
123
+ lgeos.GEOSDisjoint.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
124
+
125
+ lgeos.GEOSTouches.restype = ctypes.c_int
126
+ lgeos.GEOSTouches.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
127
+
128
+ lgeos.GEOSIntersects.restype = ctypes.c_int
129
+ lgeos.GEOSIntersects.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
130
+
131
+ lgeos.GEOSCrosses.restype = ctypes.c_int
132
+ lgeos.GEOSCrosses.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
133
+
134
+ lgeos.GEOSWithin.restype = ctypes.c_int
135
+ lgeos.GEOSWithin.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
136
+
137
+ lgeos.GEOSContains.restype = ctypes.c_int
138
+ lgeos.GEOSContains.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
139
+
140
+ lgeos.GEOSOverlaps.restype = ctypes.c_int
141
+ lgeos.GEOSOverlaps.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
142
+
143
+ lgeos.GEOSEquals.restype = ctypes.c_int
144
+ lgeos.GEOSEquals.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
145
+
146
+ lgeos.GEOSisEmpty.restype = ctypes.c_int
147
+ lgeos.GEOSisEmpty.argtypes = [ctypes.c_void_p]
148
+
149
+ lgeos.GEOSisValid.restype = ctypes.c_int
150
+ lgeos.GEOSisValid.argtypes = [ctypes.c_void_p]
151
+
152
+ lgeos.GEOSisSimple.restype = ctypes.c_int
153
+ lgeos.GEOSisSimple.argtypes = [ctypes.c_void_p]
154
+
155
+ lgeos.GEOSisRing.restype = ctypes.c_int
156
+ lgeos.GEOSisRing.argtypes = [ctypes.c_void_p]
157
+
158
+ lgeos.GEOSHasZ.restype = ctypes.c_int
159
+ lgeos.GEOSHasZ.argtypes = [ctypes.c_void_p]
160
+
161
+ lgeos.GEOSGeomType.restype = ctypes.c_char_p
162
+ lgeos.GEOSGeomType.argtypes = [ctypes.c_void_p]
163
+
164
+ lgeos.GEOSGeomTypeId.restype = ctypes.c_int
165
+ lgeos.GEOSGeomTypeId.argtypes = [ctypes.c_void_p]
166
+
167
+ lgeos.GEOSGetSRID.restype = ctypes.c_int
168
+ lgeos.GEOSGetSRID.argtypes = [ctypes.c_void_p]
169
+
170
+ lgeos.GEOSSetSRID.restype = None
171
+ lgeos.GEOSSetSRID.argtypes = [ctypes.c_void_p, ctypes.c_int]
172
+
173
+ lgeos.GEOSGetNumGeometries.restype = ctypes.c_int
174
+ lgeos.GEOSGetNumGeometries.argtypes = [ctypes.c_void_p]
175
+
176
+ lgeos.GEOSGetGeometryN.restype = ctypes.c_void_p
177
+ lgeos.GEOSGetGeometryN.argtypes = [ctypes.c_void_p, ctypes.c_int]
178
+
179
+ lgeos.GEOSGetNumInteriorRings.restype = ctypes.c_int
180
+ lgeos.GEOSGetNumInteriorRings.argtypes = [ctypes.c_void_p]
181
+
182
+ lgeos.GEOSGetInteriorRingN.restype = ctypes.c_void_p
183
+ lgeos.GEOSGetInteriorRingN.argtypes = [ctypes.c_void_p, ctypes.c_int]
184
+
185
+ lgeos.GEOSGetExteriorRing.restype = ctypes.c_void_p
186
+ lgeos.GEOSGetExteriorRing.argtypes = [ctypes.c_void_p]
187
+
188
+ lgeos.GEOSGetNumCoordinates.restype = ctypes.c_int
189
+ lgeos.GEOSGetNumCoordinates.argtypes = [ctypes.c_void_p]
190
+
191
+ lgeos.GEOSGeom_getCoordSeq.restype = ctypes.c_void_p
192
+ lgeos.GEOSGeom_getCoordSeq.argtypes = [ctypes.c_void_p]
193
+
194
+ lgeos.GEOSGeom_getDimensions.restype = ctypes.c_int
195
+ lgeos.GEOSGeom_getDimensions.argtypes = [ctypes.c_void_p]
196
+
197
+ lgeos.GEOSArea.restype = ctypes.c_double
198
+ lgeos.GEOSArea.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
199
+
200
+ lgeos.GEOSLength.restype = ctypes.c_int
201
+ lgeos.GEOSLength.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
202
+
203
+ lgeos.GEOSDistance.restype = ctypes.c_int
204
+ lgeos.GEOSDistance.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
@@ -262,6 +262,8 @@ class BaseGeometry(object):
262
262
  def __del__(self):
263
263
  if self.__geom__ is not None and not self._owned:
264
264
  lgeos.GEOSGeom_destroy(self.__geom__)
265
+ self.__geom__ = None
266
+ self.__p__ = None
265
267
 
266
268
  def __str__(self):
267
269
  return self.to_wkt()
@@ -3,7 +3,7 @@ Polygons and their linear ring components.
3
3
  """
4
4
 
5
5
  from ctypes import byref, c_double, c_int, c_void_p, cast, POINTER, pointer
6
-
6
+ import weakref
7
7
  from shapely.geos import lgeos
8
8
  from shapely.geometry.base import BaseGeometry, exceptNull
9
9
  from shapely.geometry.linestring import LineString, LineStringAdapter
@@ -143,7 +143,7 @@ class LinearRing(LineString):
143
143
  """A linear ring.
144
144
  """
145
145
 
146
- _ndim = 2
146
+ _ndim = None
147
147
  __geom__ = None
148
148
  __p__ = None
149
149
  _owned = False
@@ -233,6 +233,8 @@ class InteriorRingSequence(object):
233
233
  _ndim = None
234
234
  _index = 0
235
235
  _length = 0
236
+ __rings__ = None
237
+ _gtag = None
236
238
 
237
239
  def __init__(self, parent):
238
240
  self.__p__ = parent
@@ -246,11 +248,9 @@ class InteriorRingSequence(object):
246
248
 
247
249
  def next(self):
248
250
  if self._index < self._length:
249
- g = LinearRing()
250
- g._owned = True
251
- g._geom = lgeos.GEOSGetInteriorRingN(self._geom, self._index)
251
+ ring = self._get_ring(self._index)
252
252
  self._index += 1
253
- return g
253
+ return ring
254
254
  else:
255
255
  raise StopIteration
256
256
 
@@ -265,10 +265,7 @@ class InteriorRingSequence(object):
265
265
  ii = M + i
266
266
  else:
267
267
  ii = i
268
- g = LinearRing()
269
- g._owned = True
270
- g._geom = lgeos.GEOSGetInteriorRingN(self._geom, ii)
271
- return g
268
+ return self._get_ring(i)
272
269
 
273
270
  @property
274
271
  def _longest(self):
@@ -278,6 +275,23 @@ class InteriorRingSequence(object):
278
275
  if l > max:
279
276
  max = l
280
277
 
278
+ def gtag(self):
279
+ return hash(repr(self.__p__))
280
+
281
+ def _get_ring(self, i):
282
+ gtag = self.gtag()
283
+ if gtag != self._gtag:
284
+ self.__rings__ = {}
285
+ if i not in self.__rings__:
286
+ g = lgeos.GEOSGetInteriorRingN(self._geom, i)
287
+ ring = LinearRing()
288
+ ring.__geom__ = g
289
+ ring.__p__ = self
290
+ ring._owned = True
291
+ ring._ndim = self._ndim
292
+ self.__rings__[i] = weakref.ref(ring)
293
+ return self.__rings__[i]()
294
+
281
295
 
282
296
  def geos_polygon_from_py(shell, holes=None):
283
297
  if shell is not None:
@@ -344,16 +358,15 @@ class Polygon(BaseGeometry):
344
358
  @property
345
359
  @exceptNull
346
360
  def exterior(self):
347
- if self._exterior is None:
348
- # A polygon created from the abstract factory will have a null
349
- # _exterior attribute.
350
- ring = lgeos.GEOSGetExteriorRing(self._geom)
351
- self._exterior = LinearRing()
352
- self._exterior._geom = ring
353
- # The ring needs to hold an extra ref to the polygon
354
- self.__p__ = self
355
- self._exterior._owned = True
356
- return self._exterior
361
+ if self._exterior is None or self._exterior() is None:
362
+ g = lgeos.GEOSGetExteriorRing(self._geom)
363
+ ring = LinearRing()
364
+ ring.__geom__ = g
365
+ ring.__p__ = self
366
+ ring._owned = True
367
+ ring._ndim = self._ndim
368
+ self._exterior = weakref.ref(ring)
369
+ return self._exterior()
357
370
 
358
371
  @property
359
372
  @exceptNull
@@ -3,12 +3,10 @@ Exports the libgeos_c shared lib, GEOS-specific exceptions, and utilities.
3
3
  """
4
4
 
5
5
  import atexit
6
- from ctypes import cdll, CDLL, pydll, PyDLL, CFUNCTYPE, c_char_p
7
- from ctypes.util import find_library
8
6
  import os
9
7
  import sys
10
-
11
- import shapely
8
+ from ctypes import cdll, CDLL, PyDLL, CFUNCTYPE, c_char_p
9
+ from ctypes.util import find_library
12
10
 
13
11
  if sys.platform == 'win32':
14
12
  try:
@@ -31,13 +29,15 @@ elif sys.platform == 'darwin':
31
29
  lib_paths = [
32
30
  # The Framework build from Kyng Chaos:
33
31
  "/Library/Frameworks/GEOS.framework/Versions/Current/GEOS",
32
+ # macports
33
+ '/opt/local/lib/libgeos_c.dylib',
34
34
  ]
35
35
  for path in lib_paths:
36
36
  if os.path.exists(path):
37
37
  lib = path
38
38
  break
39
- else:
40
- raise ImportError, "Could not find geos_c library"
39
+ if lib is None:
40
+ raise ImportError, "Could not find geos_c library"
41
41
  lgeos = PyDLL(lib)
42
42
  free = CDLL(find_library('libc')).free
43
43
  else:
@@ -51,6 +51,10 @@ else:
51
51
  free = CDLL('libc.so.6').free
52
52
 
53
53
 
54
+ # Load the ctypes restype and argtype declarations for geos_c functions.
55
+ _here = os.path.abspath(os.path.dirname(__file__))
56
+ execfile(os.path.join(_here, 'ctypes_declarations.py'))
57
+
54
58
  class allocated_c_char_p(c_char_p):
55
59
  pass
56
60
 
@@ -83,10 +87,9 @@ notice_h = CFUNCTYPE(None, c_char_p, c_char_p)(notice_handler)
83
87
  # Register a cleanup function
84
88
 
85
89
  def cleanup():
86
- lgeos.finishGEOS()
90
+ if lgeos is not None:
91
+ lgeos.finishGEOS()
87
92
 
88
93
  atexit.register(cleanup)
89
94
 
90
95
  lgeos.initGEOS(notice_h, error_h)
91
-
92
-
@@ -25,7 +25,6 @@ Initialization
25
25
  >>> ring.__geo_interface__
26
26
  {'type': 'LinearRing', 'coordinates': ((0.0, 0.0), (0.0, 2.0), (2.0, 2.0), (2.0, 0.0), (0.0, 0.0))}
27
27
 
28
-
29
28
  Test ring adapter
30
29
 
31
30
  >>> coords = [[0.0, 0.0], [0.0, 1.0], [1.0, 1.0], [1.0, 0.0]]
@@ -0,0 +1,17 @@
1
+ Background: see http://trac.gispython.org/lab/ticket/168
2
+
3
+ >>> from shapely.geometry import Polygon
4
+ >>> coords = ((0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (1.0, 1.0, 0.0), (1.0, 0.0, 0.0))
5
+ >>> polygon = Polygon(coords)
6
+ >>> polygon._ndim
7
+ 3
8
+ >>> gi = polygon.__geo_interface__
9
+ >>> gi['coordinates']
10
+ (((0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (1.0, 1.0, 0.0), (1.0, 0.0, 0.0), (0.0, 0.0, 0.0)),)
11
+
12
+ >>> e = polygon.exterior
13
+ >>> e._ndim
14
+ 3
15
+ >>> gi = e.__geo_interface__
16
+ >>> gi['coordinates']
17
+ ((0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (1.0, 1.0, 0.0), (1.0, 0.0, 0.0), (0.0, 0.0, 0.0))
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes