mirror of
				https://github.com/django/django.git
				synced 2025-10-29 08:36:09 +00:00 
			
		
		
		
	Dropped support for GEOS 3.1
This commit is contained in:
		| @@ -577,15 +577,11 @@ class GEOSGeometry(GEOSBase, ListMixin): | |||||||
|     def interpolate(self, distance): |     def interpolate(self, distance): | ||||||
|         if not isinstance(self, (LineString, MultiLineString)): |         if not isinstance(self, (LineString, MultiLineString)): | ||||||
|             raise TypeError('interpolate only works on LineString and MultiLineString geometries') |             raise TypeError('interpolate only works on LineString and MultiLineString geometries') | ||||||
|         if not hasattr(capi, 'geos_interpolate'): |  | ||||||
|             raise NotImplementedError('interpolate requires GEOS 3.2+') |  | ||||||
|         return self._topology(capi.geos_interpolate(self.ptr, distance)) |         return self._topology(capi.geos_interpolate(self.ptr, distance)) | ||||||
|  |  | ||||||
|     def interpolate_normalized(self, distance): |     def interpolate_normalized(self, distance): | ||||||
|         if not isinstance(self, (LineString, MultiLineString)): |         if not isinstance(self, (LineString, MultiLineString)): | ||||||
|             raise TypeError('interpolate only works on LineString and MultiLineString geometries') |             raise TypeError('interpolate only works on LineString and MultiLineString geometries') | ||||||
|         if not hasattr(capi, 'geos_interpolate_normalized'): |  | ||||||
|             raise NotImplementedError('interpolate_normalized requires GEOS 3.2+') |  | ||||||
|         return self._topology(capi.geos_interpolate_normalized(self.ptr, distance)) |         return self._topology(capi.geos_interpolate_normalized(self.ptr, distance)) | ||||||
|  |  | ||||||
|     def intersection(self, other): |     def intersection(self, other): | ||||||
| @@ -602,8 +598,6 @@ class GEOSGeometry(GEOSBase, ListMixin): | |||||||
|             raise TypeError('locate_point argument must be a Point') |             raise TypeError('locate_point argument must be a Point') | ||||||
|         if not isinstance(self, (LineString, MultiLineString)): |         if not isinstance(self, (LineString, MultiLineString)): | ||||||
|             raise TypeError('locate_point only works on LineString and MultiLineString geometries') |             raise TypeError('locate_point only works on LineString and MultiLineString geometries') | ||||||
|         if not hasattr(capi, 'geos_project'): |  | ||||||
|             raise NotImplementedError('geos_project requires GEOS 3.2+') |  | ||||||
|         return capi.geos_project(self.ptr, point.ptr) |         return capi.geos_project(self.ptr, point.ptr) | ||||||
|  |  | ||||||
|     def project_normalized(self, point): |     def project_normalized(self, point): | ||||||
| @@ -611,8 +605,6 @@ class GEOSGeometry(GEOSBase, ListMixin): | |||||||
|             raise TypeError('locate_point argument must be a Point') |             raise TypeError('locate_point argument must be a Point') | ||||||
|         if not isinstance(self, (LineString, MultiLineString)): |         if not isinstance(self, (LineString, MultiLineString)): | ||||||
|             raise TypeError('locate_point only works on LineString and MultiLineString geometries') |             raise TypeError('locate_point only works on LineString and MultiLineString geometries') | ||||||
|         if not hasattr(capi, 'geos_project_normalized'): |  | ||||||
|             raise NotImplementedError('project_normalized requires GEOS 3.2+') |  | ||||||
|         return capi.geos_project_normalized(self.ptr, point.ptr) |         return capi.geos_project_normalized(self.ptr, point.ptr) | ||||||
|  |  | ||||||
|     def relate(self, other): |     def relate(self, other): | ||||||
|   | |||||||
| @@ -1,29 +1,16 @@ | |||||||
| """ | """ | ||||||
|  Error checking functions for GEOS ctypes prototype functions. |  Error checking functions for GEOS ctypes prototype functions. | ||||||
| """ | """ | ||||||
| import os | from ctypes import c_void_p, string_at | ||||||
| from ctypes import c_void_p, string_at, CDLL |  | ||||||
| from django.contrib.gis.geos.error import GEOSException | from django.contrib.gis.geos.error import GEOSException | ||||||
| from django.contrib.gis.geos.libgeos import GEOS_VERSION |  | ||||||
| from django.contrib.gis.geos.prototypes.threadsafe import GEOSFunc | from django.contrib.gis.geos.prototypes.threadsafe import GEOSFunc | ||||||
|  |  | ||||||
|  |  | ||||||
| # Getting the `free` routine used to free the memory allocated for | # Getting the `free` routine used to free the memory allocated for | ||||||
| # string pointers returned by GEOS. | # string pointers returned by GEOS. | ||||||
| if GEOS_VERSION >= (3, 1, 1): | free = GEOSFunc('GEOSFree') | ||||||
|     # In versions 3.1.1 and above, `GEOSFree` was added to the C API | free.argtypes = [c_void_p] | ||||||
|     # because `free` isn't always available on all platforms. | free.restype = None | ||||||
|     free = GEOSFunc('GEOSFree') |  | ||||||
|     free.argtypes = [c_void_p] |  | ||||||
|     free.restype = None |  | ||||||
| else: |  | ||||||
|     # Getting the `free` routine from the C library of the platform. |  | ||||||
|     if os.name == 'nt': |  | ||||||
|         # On NT, use the MS C library. |  | ||||||
|         libc = CDLL('msvcrt') |  | ||||||
|     else: |  | ||||||
|         # On POSIX platforms C library is obtained by passing None into `CDLL`. |  | ||||||
|         libc = CDLL(None) |  | ||||||
|     free = libc.free |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### ctypes error checking routines ### | ### ctypes error checking routines ### | ||||||
|   | |||||||
| @@ -6,10 +6,12 @@ __all__ = ['geos_boundary', 'geos_buffer', 'geos_cascaded_union', | |||||||
|            'geos_centroid', 'geos_convexhull', 'geos_difference', |            'geos_centroid', 'geos_convexhull', 'geos_difference', | ||||||
|            'geos_envelope', 'geos_intersection', 'geos_linemerge', |            'geos_envelope', 'geos_intersection', 'geos_linemerge', | ||||||
|            'geos_pointonsurface', 'geos_preservesimplify', 'geos_simplify', |            'geos_pointonsurface', 'geos_preservesimplify', 'geos_simplify', | ||||||
|            'geos_symdifference', 'geos_union', 'geos_relate'] |            'geos_symdifference', 'geos_union', 'geos_relate', | ||||||
|  |            'geos_project', 'geos_interpolate', 'geos_project_normalized', | ||||||
|  |            'geos_interpolate_normalized'] | ||||||
|  |  | ||||||
| from ctypes import c_double, c_int | from ctypes import c_double, c_int | ||||||
| from django.contrib.gis.geos.libgeos import geos_version_info, GEOM_PTR | from django.contrib.gis.geos.libgeos import GEOM_PTR | ||||||
| from django.contrib.gis.geos.prototypes.errcheck import check_geom, check_minus_one, check_string | from django.contrib.gis.geos.prototypes.errcheck import check_geom, check_minus_one, check_string | ||||||
| from django.contrib.gis.geos.prototypes.geom import geos_char_p | from django.contrib.gis.geos.prototypes.geom import geos_char_p | ||||||
| from django.contrib.gis.geos.prototypes.threadsafe import GEOSFunc | from django.contrib.gis.geos.prototypes.threadsafe import GEOSFunc | ||||||
| @@ -51,14 +53,10 @@ geos_relate.restype = geos_char_p | |||||||
| geos_relate.errcheck = check_string | geos_relate.errcheck = check_string | ||||||
|  |  | ||||||
| # Linear referencing routines | # Linear referencing routines | ||||||
| info = geos_version_info() | geos_project = topology(GEOSFunc('GEOSProject'), GEOM_PTR, | ||||||
| if info['version'] >= '3.2.0': |     restype=c_double, errcheck=check_minus_one) | ||||||
|     geos_project = topology(GEOSFunc('GEOSProject'), GEOM_PTR, | geos_interpolate = topology(GEOSFunc('GEOSInterpolate'), c_double) | ||||||
|         restype=c_double, errcheck=check_minus_one) |  | ||||||
|     geos_interpolate = topology(GEOSFunc('GEOSInterpolate'), c_double) |  | ||||||
|  |  | ||||||
|     geos_project_normalized = topology(GEOSFunc('GEOSProjectNormalized'), | geos_project_normalized = topology(GEOSFunc('GEOSProjectNormalized'), | ||||||
|         GEOM_PTR, restype=c_double, errcheck=check_minus_one) |     GEOM_PTR, restype=c_double, errcheck=check_minus_one) | ||||||
|     geos_interpolate_normalized = topology(GEOSFunc('GEOSInterpolateNormalized'), c_double) | geos_interpolate_normalized = topology(GEOSFunc('GEOSInterpolateNormalized'), c_double) | ||||||
|     __all__.extend(['geos_project', 'geos_interpolate', |  | ||||||
|         'geos_project_normalized', 'geos_interpolate_normalized']) |  | ||||||
|   | |||||||
| @@ -29,18 +29,6 @@ if HAS_GEOS: | |||||||
| @skipUnless(HAS_GEOS, "Geos is required.") | @skipUnless(HAS_GEOS, "Geos is required.") | ||||||
| class GEOSTest(unittest.TestCase, TestDataMixin): | class GEOSTest(unittest.TestCase, TestDataMixin): | ||||||
|  |  | ||||||
|     @property |  | ||||||
|     def null_srid(self): |  | ||||||
|         """ |  | ||||||
|         Returns the proper null SRID depending on the GEOS version. |  | ||||||
|         See the comments in `test_srid` for more details. |  | ||||||
|         """ |  | ||||||
|         info = geos_version_info() |  | ||||||
|         if info['version'] == '3.0.0' and info['release_candidate']: |  | ||||||
|             return -1 |  | ||||||
|         else: |  | ||||||
|             return None |  | ||||||
|  |  | ||||||
|     def test_base(self): |     def test_base(self): | ||||||
|         "Tests out the GEOSBase class." |         "Tests out the GEOSBase class." | ||||||
|         # Testing out GEOSBase class, which provides a `ptr` property |         # Testing out GEOSBase class, which provides a `ptr` property | ||||||
| @@ -116,9 +104,7 @@ class GEOSTest(unittest.TestCase, TestDataMixin): | |||||||
|  |  | ||||||
|         # HEXEWKB should be appropriate for its dimension -- have to use an |         # HEXEWKB should be appropriate for its dimension -- have to use an | ||||||
|         # a WKBWriter w/dimension set accordingly, else GEOS will insert |         # a WKBWriter w/dimension set accordingly, else GEOS will insert | ||||||
|         # garbage into 3D coordinate if there is none.  Also, GEOS has a |         # garbage into 3D coordinate if there is none. | ||||||
|         # a bug in versions prior to 3.1 that puts the X coordinate in |  | ||||||
|         # place of Z; an exception should be raised on those versions. |  | ||||||
|         self.assertEqual(hexewkb_2d, pnt_2d.hexewkb) |         self.assertEqual(hexewkb_2d, pnt_2d.hexewkb) | ||||||
|         self.assertEqual(hexewkb_3d, pnt_3d.hexewkb) |         self.assertEqual(hexewkb_3d, pnt_3d.hexewkb) | ||||||
|         self.assertEqual(True, GEOSGeometry(hexewkb_3d).hasz) |         self.assertEqual(True, GEOSGeometry(hexewkb_3d).hasz) | ||||||
| @@ -651,13 +637,8 @@ class GEOSTest(unittest.TestCase, TestDataMixin): | |||||||
|         p1 = fromstr(hex) |         p1 = fromstr(hex) | ||||||
|         self.assertEqual(4326, p1.srid) |         self.assertEqual(4326, p1.srid) | ||||||
|  |  | ||||||
|         # In GEOS 3.0.0rc1-4  when the EWKB and/or HEXEWKB is exported, |  | ||||||
|         # the SRID information is lost and set to -1 -- this is not a |  | ||||||
|         # problem on the 3.0.0 version (another reason to upgrade). |  | ||||||
|         exp_srid = self.null_srid |  | ||||||
|  |  | ||||||
|         p2 = fromstr(p1.hex) |         p2 = fromstr(p1.hex) | ||||||
|         self.assertEqual(exp_srid, p2.srid) |         self.assertIsNone(p2.srid) | ||||||
|         p3 = fromstr(p1.hex, srid=-1)  # -1 is intended. |         p3 = fromstr(p1.hex, srid=-1)  # -1 is intended. | ||||||
|         self.assertEqual(-1, p3.srid) |         self.assertEqual(-1, p3.srid) | ||||||
|  |  | ||||||
| @@ -1007,15 +988,12 @@ class GEOSTest(unittest.TestCase, TestDataMixin): | |||||||
|         tgeoms.extend(get_geoms(self.geometries.polygons, 3084)) |         tgeoms.extend(get_geoms(self.geometries.polygons, 3084)) | ||||||
|         tgeoms.extend(get_geoms(self.geometries.multipolygons, 900913)) |         tgeoms.extend(get_geoms(self.geometries.multipolygons, 900913)) | ||||||
|  |  | ||||||
|         # The SRID won't be exported in GEOS 3.0 release candidates. |  | ||||||
|         no_srid = self.null_srid == -1 |  | ||||||
|         for geom in tgeoms: |         for geom in tgeoms: | ||||||
|             s1, s2 = cPickle.dumps(geom), pickle.dumps(geom) |             s1, s2 = cPickle.dumps(geom), pickle.dumps(geom) | ||||||
|             g1, g2 = cPickle.loads(s1), pickle.loads(s2) |             g1, g2 = cPickle.loads(s1), pickle.loads(s2) | ||||||
|             for tmpg in (g1, g2): |             for tmpg in (g1, g2): | ||||||
|                 self.assertEqual(geom, tmpg) |                 self.assertEqual(geom, tmpg) | ||||||
|                 if not no_srid: |                 self.assertEqual(geom.srid, tmpg.srid) | ||||||
|                     self.assertEqual(geom.srid, tmpg.srid) |  | ||||||
|  |  | ||||||
|     def test_prepared(self): |     def test_prepared(self): | ||||||
|         "Testing PreparedGeometry support." |         "Testing PreparedGeometry support." | ||||||
| @@ -1071,7 +1049,7 @@ class GEOSTest(unittest.TestCase, TestDataMixin): | |||||||
|         self.assertIsInstance(g.valid_reason, six.string_types) |         self.assertIsInstance(g.valid_reason, six.string_types) | ||||||
|         self.assertTrue(g.valid_reason.startswith("Too few points in geometry component")) |         self.assertTrue(g.valid_reason.startswith("Too few points in geometry component")) | ||||||
|  |  | ||||||
|     @skipUnless(HAS_GEOS and geos_version_info()['version'] >= '3.2.0', "geos >= 3.2.0 is required") |     @skipUnless(HAS_GEOS, "Geos is required.") | ||||||
|     def test_linearref(self): |     def test_linearref(self): | ||||||
|         "Testing linear referencing" |         "Testing linear referencing" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -101,16 +101,13 @@ class GEOSIOTest(unittest.TestCase): | |||||||
|             # Equivalent of `wkb_w.outdim = bad_outdim` |             # Equivalent of `wkb_w.outdim = bad_outdim` | ||||||
|             self.assertRaises(ValueError, wkb_w._set_outdim, bad_outdim) |             self.assertRaises(ValueError, wkb_w._set_outdim, bad_outdim) | ||||||
|  |  | ||||||
|         # These tests will fail on 3.0.0 because of a bug that was fixed in 3.1: |         # Now setting the output dimensions to be 3 | ||||||
|         # http://trac.osgeo.org/geos/ticket/216 |         wkb_w.outdim = 3 | ||||||
|         if not geos_version_info()['version'].startswith('3.0.'): |  | ||||||
|             # Now setting the output dimensions to be 3 |  | ||||||
|             wkb_w.outdim = 3 |  | ||||||
|  |  | ||||||
|             self.assertEqual(hex3d, wkb_w.write_hex(g)) |         self.assertEqual(hex3d, wkb_w.write_hex(g)) | ||||||
|             self.assertEqual(wkb3d, wkb_w.write(g)) |         self.assertEqual(wkb3d, wkb_w.write(g)) | ||||||
|  |  | ||||||
|             # Telling the WKBWriter to include the srid in the representation. |         # Telling the WKBWriter to include the srid in the representation. | ||||||
|             wkb_w.srid = True |         wkb_w.srid = True | ||||||
|             self.assertEqual(hex3d_srid, wkb_w.write_hex(g)) |         self.assertEqual(hex3d_srid, wkb_w.write_hex(g)) | ||||||
|             self.assertEqual(wkb3d_srid, wkb_w.write(g)) |         self.assertEqual(wkb3d_srid, wkb_w.write(g)) | ||||||
|   | |||||||
| @@ -336,8 +336,7 @@ class DistanceTest(TestCase): | |||||||
|         # Reference queries: |         # Reference queries: | ||||||
|         # SELECT ST_Area(poly) FROM distapp_southtexaszipcode; |         # SELECT ST_Area(poly) FROM distapp_southtexaszipcode; | ||||||
|         area_sq_m = [5437908.90234375, 10183031.4389648, 11254471.0073242, 9881708.91772461] |         area_sq_m = [5437908.90234375, 10183031.4389648, 11254471.0073242, 9881708.91772461] | ||||||
|         # Tolerance has to be lower for Oracle and differences |         # Tolerance has to be lower for Oracle | ||||||
|         # with GEOS 3.0.0RC4 |  | ||||||
|         tol = 2 |         tol = 2 | ||||||
|         for i, z in enumerate(SouthTexasZipcode.objects.area()): |         for i, z in enumerate(SouthTexasZipcode.objects.area()): | ||||||
|             self.assertAlmostEqual(area_sq_m[i], z.area.sq_m, tol) |             self.assertAlmostEqual(area_sq_m[i], z.area.sq_m, tol) | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ geospatial libraries: | |||||||
| ========================  ====================================  ================================  ========================== | ========================  ====================================  ================================  ========================== | ||||||
| Program                   Description                           Required                          Supported Versions | Program                   Description                           Required                          Supported Versions | ||||||
| ========================  ====================================  ================================  ========================== | ========================  ====================================  ================================  ========================== | ||||||
| :ref:`GEOS <ref-geos>`    Geometry Engine Open Source           Yes                               3.4, 3.3, 3.2, 3.1 | :ref:`GEOS <ref-geos>`    Geometry Engine Open Source           Yes                               3.4, 3.3, 3.2 | ||||||
| `PROJ.4`_                 Cartographic Projections library      Yes (PostgreSQL and SQLite only)  4.8, 4.7, 4.6, 4.5, 4.4 | `PROJ.4`_                 Cartographic Projections library      Yes (PostgreSQL and SQLite only)  4.8, 4.7, 4.6, 4.5, 4.4 | ||||||
| :ref:`GDAL <ref-gdal>`    Geospatial Data Abstraction Library   No (but, required for SQLite)     1.9, 1.8, 1.7, 1.6 | :ref:`GDAL <ref-gdal>`    Geospatial Data Abstraction Library   No (but, required for SQLite)     1.9, 1.8, 1.7, 1.6 | ||||||
| :ref:`GeoIP <ref-geoip>`  IP-based geolocation library          No                                1.4 | :ref:`GeoIP <ref-geoip>`  IP-based geolocation library          No                                1.4 | ||||||
| @@ -23,7 +23,6 @@ totally fine with GeoDjango. Your mileage may vary. | |||||||
|  |  | ||||||
| .. | .. | ||||||
|     Libs release dates: |     Libs release dates: | ||||||
|     GEOS 3.1.0 2009-03-11 |  | ||||||
|     GEOS 3.2.0 2009-12-14 |     GEOS 3.2.0 2009-12-14 | ||||||
|     GEOS 3.3.0 2011-05-30 |     GEOS 3.3.0 2011-05-30 | ||||||
|     GEOS 3.4.0 2013-08-11 |     GEOS 3.4.0 2013-08-11 | ||||||
|   | |||||||
| @@ -175,6 +175,8 @@ Miscellaneous | |||||||
|  |  | ||||||
| * ``URLField.to_python`` no longer adds a trailing slash to pathless URLs. | * ``URLField.to_python`` no longer adds a trailing slash to pathless URLs. | ||||||
|  |  | ||||||
|  | * ``django.contrib.gis`` dropped support for GEOS 3.1. | ||||||
|  |  | ||||||
| .. _deprecated-features-1.8: | .. _deprecated-features-1.8: | ||||||
|  |  | ||||||
| Features deprecated in 1.8 | Features deprecated in 1.8 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user