Skip to content

Commit

Permalink
added the render command back into toposm for quick previews
Browse files Browse the repository at this point in the history
  • Loading branch information
bnordgren committed Dec 17, 2016
1 parent 530195b commit a56354f
Showing 1 changed file with 79 additions and 1 deletion.
80 changes: 79 additions & 1 deletion toposm.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,51 @@
# Enable/disable the use of the cairo renderer altogether
USE_CAIRO = False

class RenderThread:
def __init__(self, q, maxz, threadNumber):
self.q = q
self.maxz = maxz
self.threadNumber = threadNumber
self.currentz = 0

def init_zoomlevel(self, z):
self.currentz = z
self.tilesize = getTileSize(NTILES[z], True)
self.maps = {}
for mapName in MAPNIK_LAYERS:
console.debugMessage('Loading mapnik.Map: ' + mapName)
self.maps[mapName] = mapnik.Map(self.tilesize, self.tilesize)
mapnik.load_map(self.maps[mapName], mapName + ".xml")
def runAndLog(self, message, function, args):
message = '[%02d] %s' % (self.threadNumber+1, message)
console.printMessage(message)
try:
function(*args)
except Exception as ex:
console.printMessage('Failed: ' + message)
errorLog.log('Failed: ' + message, ex)
raise

def renderMetaTile(self, z, x, y):
ntiles = NTILES[z]
if (z != self.currentz):
self.init_zoomlevel(z)
if not (allConstituentTilesExist(z, x, y, ntiles)):
msg = "Rendering meta tile %s %s %s (%sx%s)" % \
(z, x, y, ntiles, ntiles)
self.runAndLog(msg, renderMetaTile, (z, x, y, ntiles, self.maps))

def renderLoop(self):
self.currentz = 0
while True:
r = self.q.get()
if (r == None):
self.q.task_done()
break
self.renderMetaTile(*r)
self.q.task_done()



class Tile:
"""Represents a single tile (or metatile)."""
Expand Down Expand Up @@ -347,6 +392,30 @@ def prepareData(envLLs):
NED.clusterContoursOnGeoColumn()
NED.analyzeContoursTable()

def renderTiles(envLLs, minz, maxz):
if not hasattr(envLLs, '__iter__'):
envLLs = (envLLs,)
queue = Queue(32)
renderers = {}
for i in range(NUM_THREADS):
renderer = RenderThread(queue, maxz, i)
renderThread = threading.Thread(target=renderer.renderLoop)
renderThread.start()
renderers[i] = renderThread
for envLL in envLLs:
for z in range(minz, maxz+1):
ntiles = NTILES[z]
(fromx, tox, fromy, toy) = getTileRange(envLL, z, ntiles)
for x in range(fromx, tox+1):
for y in range(fromy, toy+1):
queue.put((z, x, y))
for i in range(NUM_THREADS):
queue.put(None)
queue.join()
for i in range(NUM_THREADS):
renderers[i].join()


def renderToPdf(envLL, filename, sizex, sizey):
"""Renders the specified Box2d and zoom level as a PDF"""
basefilename = os.path.splitext(filename)[0]
Expand Down Expand Up @@ -412,6 +481,7 @@ def renderToPng(envLL, filename, sizex, sizey):

def printSyntax():
print "Syntax:"
print " toposm.py render <area(s)> <minZoom> <maxZoom>"
print " toposm.py pdf <area> <filename> <sizeX> <sizeY>"
print " toposm.py png <area> <filename> <sizeX> <sizeY>"
print " toposm.py prep <area(s)>"
Expand All @@ -423,7 +493,15 @@ def printSyntax():
printSyntax()
sys.exit(1)
cmd = sys.argv[1]
if cmd == 'pdf' or cmd == 'png':
if cmd == 'render':
areaname = sys.argv[2]
minzoom = int(sys.argv[3])
maxzoom = int(sys.argv[4])
env = vars(areas)[areaname]
print "Render: %s %s, z: %d-%d" % (areaname, env, minzoom, maxzoom)
BASE_TILE_DIR = path.join(BASE_TILE_DIR, areaname)
renderTiles(env, minzoom, maxzoom)
elif cmd == 'pdf' or cmd == 'png':
areaname = sys.argv[2]
filename = sys.argv[3]
sizex = int(sys.argv[4])
Expand Down

0 comments on commit a56354f

Please sign in to comment.