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
This commit is contained in:
Justin Bronn 2009-11-10 17:28:20 +00:00
parent 70f9a4f6ce
commit 3f8f3f8411
2 changed files with 28 additions and 4 deletions

View File

@ -389,6 +389,9 @@ class GEOSGeometry(GEOSBase, ListMixin):
geometry. geometry.
""" """
if self.hasz: 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) return ewkb_w3d.write_hex(self)
else: else:
return ewkb_w.write_hex(self) return ewkb_w.write_hex(self)
@ -422,6 +425,9 @@ class GEOSGeometry(GEOSBase, ListMixin):
and Z values that are a part of this geometry. and Z values that are a part of this geometry.
""" """
if self.hasz: 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) return ewkb_w3d.write(self)
else: else:
return ewkb_w.write(self) return ewkb_w.write(self)

View File

@ -84,16 +84,34 @@ class GEOSTest(unittest.TestCase):
# 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. # 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_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. # Same for EWKB.
self.assertEqual(buffer(a2b_hex(hexewkb_2d)), pnt_2d.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. # Redundant sanity check.
self.assertEqual(True, GEOSGeometry(hexewkb_3d).hasz)
self.assertEqual(4326, GEOSGeometry(hexewkb_2d).srid) self.assertEqual(4326, GEOSGeometry(hexewkb_2d).srid)
def test01c_kml(self): def test01c_kml(self):