From 3f8f3f8411650bd328cd4054941c18ff9da1d1f6 Mon Sep 17 00:00:00 2001 From: Justin Bronn Date: Tue, 10 Nov 2009 17:28:20 +0000 Subject: [PATCH] Now raise an exception when trying to export 3D (HEX)EWKB when using GEOS 3.0 due to bug in that underlying library version. git-svn-id: http://code.djangoproject.com/svn/django/trunk@11731 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/gis/geos/geometry.py | 6 +++++ django/contrib/gis/geos/tests/test_geos.py | 26 ++++++++++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/django/contrib/gis/geos/geometry.py b/django/contrib/gis/geos/geometry.py index fb686741c5..9f2a119c47 100644 --- a/django/contrib/gis/geos/geometry.py +++ b/django/contrib/gis/geos/geometry.py @@ -389,6 +389,9 @@ class GEOSGeometry(GEOSBase, ListMixin): geometry. """ if self.hasz: + if not GEOS_PREPARE: + # See: http://trac.osgeo.org/geos/ticket/216 + raise GEOSException('Upgrade GEOS to 3.1 to get valid 3D HEXEWKB.') return ewkb_w3d.write_hex(self) else: return ewkb_w.write_hex(self) @@ -422,6 +425,9 @@ class GEOSGeometry(GEOSBase, ListMixin): and Z values that are a part of this geometry. """ if self.hasz: + if not GEOS_PREPARE: + # See: http://trac.osgeo.org/geos/ticket/216 + raise GEOSException('Upgrade GEOS to 3.1 to get valid 3D EWKB.') return ewkb_w3d.write(self) else: return ewkb_w.write(self) diff --git a/django/contrib/gis/geos/tests/test_geos.py b/django/contrib/gis/geos/tests/test_geos.py index 85f983733d..440075dd49 100644 --- a/django/contrib/gis/geos/tests/test_geos.py +++ b/django/contrib/gis/geos/tests/test_geos.py @@ -84,16 +84,34 @@ class GEOSTest(unittest.TestCase): # HEXEWKB should be appropriate for its dimension -- have to use an # a WKBWriter w/dimension set accordingly, else GEOS will insert - # garbage into 3D coordinate if there is none. + # garbage into 3D coordinate if there is none. Also, GEOS has a + # 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_3d, pnt_3d.hexewkb) + if GEOS_PREPARE: + self.assertEqual(hexewkb_3d, pnt_3d.hexewkb) + self.assertEqual(True, GEOSGeometry(hexewkb_3d).hasz) + else: + try: + hexewkb = pnt_3d.hexewkb + except GEOSException: + pass + else: + self.fail('Should have raised GEOSException.') # Same for EWKB. self.assertEqual(buffer(a2b_hex(hexewkb_2d)), pnt_2d.ewkb) - self.assertEqual(buffer(a2b_hex(hexewkb_3d)), pnt_3d.ewkb) + if GEOS_PREPARE: + self.assertEqual(buffer(a2b_hex(hexewkb_3d)), pnt_3d.ewkb) + else: + try: + ewkb = pnt_3d.ewkb + except GEOSException: + pass + else: + self.fail('Should have raised GEOSException') # Redundant sanity check. - self.assertEqual(True, GEOSGeometry(hexewkb_3d).hasz) self.assertEqual(4326, GEOSGeometry(hexewkb_2d).srid) def test01c_kml(self):