Commit 3f8f3f84 authored by Justin Bronn's avatar Justin Bronn
Browse files

Now raise an exception when trying to export 3D (HEX)EWKB when using GEOS 3.0...

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
parent 70f9a4f6
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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)
+22 −4
Original line number Diff line number Diff line
@@ -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)
        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)
        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):