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:
parent
fedac99c85
commit
17824e2b74
1
AUTHORS
1
AUTHORS
|
@ -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>
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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."
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue