Commit 17824e2b authored by Claude Paroz's avatar Claude Paroz
Browse files

Fixed #17736 -- Kept maximal floating-point accuracy in from_bbox

When constructing a polygon with Polygon.from_bbox, do not convert
parameters to strings at this stage (str defaults to 12 significant
digits).
Thanks tdihp@hotmail.com for the report and David Eklung for the patch.
parent fedac99c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -171,6 +171,7 @@ answer newbie questions, and generally made Django that much better:
    Clint Ecker
    Nick Efford <nick@efford.org>
    eibaan@gmail.com
    David Eklund
    Julia Elman
    enlight
    Enrico <rico.bl@gmail.com>
+5 −2
Original line number Diff line number Diff line
@@ -55,8 +55,11 @@ class Polygon(GEOSGeometry):
    def from_bbox(cls, bbox):
        "Constructs a Polygon from a bounding box (4-tuple)."
        x0, y0, x1, y1 = bbox
        return GEOSGeometry( 'POLYGON((%s %s, %s %s, %s %s, %s %s, %s %s))' %  (
                x0, y0, x0, y1, x1, y1, x1, y0, x0, y0) )
        for z in bbox:
            if not isinstance(z, (int, long, float)):
                return GEOSGeometry('POLYGON((%s %s, %s %s, %s %s, %s %s, %s %s))' %
                                    (x0, y0, x0, y1, x1, y1, x1, y0, x0, y0))
        return Polygon(((x0, y0), (x0, y1), (x1, y1), (x1, y0), (x0, y0)))

    ### These routines are needed for list-like operation w/ListMixin ###
    def _create_polygon(self, length, items):
+7 −0
Original line number Diff line number Diff line
@@ -384,6 +384,13 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
        p = Polygon.from_bbox(bbox)
        self.assertEqual(bbox, p.extent)

        # Testing numerical precision
        x = 3.14159265358979323
        bbox = (0, 0, 1, x)
        p = Polygon.from_bbox(bbox)
        y = p.extent[-1]
        self.assertEqual(format(x, '.13f'), format(y, '.13f'))

    def test_polygons(self):
        "Testing Polygon objects."