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.
This commit is contained in:
Claude Paroz 2012-06-06 10:05:27 +02:00
parent fedac99c85
commit 17824e2b74
3 changed files with 13 additions and 2 deletions

View File

@ -171,6 +171,7 @@ answer newbie questions, and generally made Django that much better:
Clint Ecker Clint Ecker
Nick Efford <nick@efford.org> Nick Efford <nick@efford.org>
eibaan@gmail.com eibaan@gmail.com
David Eklund
Julia Elman Julia Elman
enlight enlight
Enrico <rico.bl@gmail.com> Enrico <rico.bl@gmail.com>

View File

@ -55,8 +55,11 @@ class Polygon(GEOSGeometry):
def from_bbox(cls, bbox): def from_bbox(cls, bbox):
"Constructs a Polygon from a bounding box (4-tuple)." "Constructs a Polygon from a bounding box (4-tuple)."
x0, y0, x1, y1 = bbox x0, y0, x1, y1 = bbox
return GEOSGeometry( 'POLYGON((%s %s, %s %s, %s %s, %s %s, %s %s))' % ( for z in bbox:
x0, y0, x0, y1, x1, y1, x1, y0, x0, y0) ) 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 ### ### These routines are needed for list-like operation w/ListMixin ###
def _create_polygon(self, length, items): def _create_polygon(self, length, items):

View File

@ -384,6 +384,13 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
p = Polygon.from_bbox(bbox) p = Polygon.from_bbox(bbox)
self.assertEqual(bbox, p.extent) 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): def test_polygons(self):
"Testing Polygon objects." "Testing Polygon objects."