0

Find the map size even in child processes

Rendering needs to know self.treedepth, so this must be in child
processes and not just computed in do_preprocessing()
This commit is contained in:
Andrew Brown
2012-01-16 21:58:48 -05:00
parent aa34853664
commit 66295aabd9

View File

@@ -265,6 +265,9 @@ class TileSet(object):
else: else:
raise ValueError("imgformat must be one of: 'png' or 'jpeg'") raise ValueError("imgformat must be one of: 'png' or 'jpeg'")
# This sets self.treedepth, self.xradius, and self.yradius
self._set_map_size()
# Only pickle the initial state. Don't pickle anything resulting from the # Only pickle the initial state. Don't pickle anything resulting from the
# do_preprocessing step # do_preprocessing step
def __getstate__(self): def __getstate__(self):
@@ -282,30 +285,10 @@ class TileSet(object):
# THE do_work() METHOD (because this is only called in the main process # THE do_work() METHOD (because this is only called in the main process
# not the workers) # not the workers)
# Calculate the min and max column over all the chunks. # This warning goes here so it's only shown once
# This returns a Bounds namedtuple if self.treedepth >= 15:
bounds = self._find_chunk_range()
# Calculate the depth of the tree
for p in xrange(1,33): # max 32
# Will 2^p tiles wide and high suffice?
# X has twice as many chunks as tiles, then halved since this is a
# radius
xradius = 2**p
# Y has 4 times as many chunks as tiles, then halved since this is
# a radius
yradius = 2*2**p
if xradius >= bounds.maxcol and -xradius <= bounds.mincol and \
yradius >= bounds.maxrow and -yradius <= bounds.minrow:
break
if p >= 15:
logging.warning("Just letting you know, your map requries %s zoom levels. This is REALLY big!", logging.warning("Just letting you know, your map requries %s zoom levels. This is REALLY big!",
p) p)
self.treedepth = p
self.xradius = xradius
self.yradius = yradius
# Do any tile re-arranging if necessary # Do any tile re-arranging if necessary
self._rearrange_tiles() self._rearrange_tiles()
@@ -416,6 +399,35 @@ class TileSet(object):
maxcol = max(maxcol, col) maxcol = max(maxcol, col)
return Bounds(mincol, maxcol, minrow, maxrow) return Bounds(mincol, maxcol, minrow, maxrow)
def _set_map_size(self):
"""Finds and sets the depth of the map's quadtree, as well as the
xradius and yradius of the resulting tiles.
Sets self.treedepth, self.xradius, self.yradius
"""
# Calculate the min and max column over all the chunks.
# This returns a Bounds namedtuple
bounds = self._find_chunk_range()
# Calculate the depth of the tree
for p in xrange(1,33): # max 32
# Will 2^p tiles wide and high suffice?
# X has twice as many chunks as tiles, then halved since this is a
# radius
xradius = 2**p
# Y has 4 times as many chunks as tiles, then halved since this is
# a radius
yradius = 2*2**p
if xradius >= bounds.maxcol and -xradius <= bounds.mincol and \
yradius >= bounds.maxrow and -yradius <= bounds.minrow:
break
self.treedepth = p
self.xradius = xradius
self.yradius = yradius
def _rearrange_tiles(self): def _rearrange_tiles(self):
"""If the target size of the tree is not the same as the existing size """If the target size of the tree is not the same as the existing size
on disk, do some re-arranging on disk, do some re-arranging