Skip to content

Commit

Permalink
Merge pull request #7 from JoeGermuska/grid
Browse files Browse the repository at this point in the history
add grid rendering
  • Loading branch information
onyxfish committed Aug 23, 2012
2 parents fa8e356 + 7eda11d commit dbc5491
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 3 deletions.
33 changes: 33 additions & 0 deletions invar/renderer.py
Expand Up @@ -9,6 +9,9 @@
import constants import constants
import projections import projections


import json
from os.path import splitext

class Renderer(multiprocessing.Process): class Renderer(multiprocessing.Process):
""" """
A Mapnik renderer process. A Mapnik renderer process.
Expand Down Expand Up @@ -69,6 +72,12 @@ class TileRenderer(Renderer):
""" """
Renderer for tiles. Renderer for tiles.
""" """
def __init__(self, tile_queues, config, width=constants.DEFAULT_WIDTH, height=constants.DEFAULT_HEIGHT, filetype=constants.DEFAULT_FILE_TYPE, buffer_size=None, skip_existing=False, **kwargs):
super(TileRenderer, self).__init__(tile_queues, config, width, height, filetype, buffer_size, skip_existing)
self.grid = kwargs.get('grid',False)
self.key = kwargs.get('key',None)
self.fields = kwargs.get('fields',None)

def render(self, filename, tile_x, tile_y, zoom): def render(self, filename, tile_x, tile_y, zoom):
""" """
Render a single tile to a given filename. Render a single tile to a given filename.
Expand Down Expand Up @@ -99,6 +108,30 @@ def render(self, filename, tile_x, tile_y, zoom):
image = mapnik.Image(self.width, self.height) image = mapnik.Image(self.width, self.height)
mapnik.render(self.mapnik_map, image) mapnik.render(self.mapnik_map, image)
image.save(filename, self.filetype) image.save(filename, self.filetype)

if self.grid:
if self.key:
grid = mapnik.Grid(self.width, self.height)
else:
grid = mapnik.Grid(self.width, self.height, key=self.key)

fields = []
if self.fields:
fields.extend(self.fields)

mapnik.render_layer(self.mapnik_map,grid,layer=0,fields=fields)
# then encode the grid array as utf, resample to 1/4 the size, and dump features
# this comes from https://github.com/springmeyer/gridsforkids/blob/master/generate_tiles.py
# with little consideration
grid_utf = grid.encode('utf', resolution=4, features=True)

# client code uses jsonp, so fake by wrapping in grid() callback
base, ext = splitext(filename)
grid_filename = "%s.grid.json" % base
print 'Rendering %s' % (grid_filename)
open(grid_filename,'wb').write('grid(' + json.dumps(grid_utf) + ')')




class FrameRenderer(Renderer): class FrameRenderer(Renderer):
""" """
Expand Down
15 changes: 12 additions & 3 deletions ivtile
Expand Up @@ -23,7 +23,11 @@ class IVTile(invar.InvarUtility):
self.argparser.add_argument('lon_2', type=float, help="Most eastern longitude") self.argparser.add_argument('lon_2', type=float, help="Most eastern longitude")
self.argparser.add_argument('min_zoom', help="Minimum zoom level to render", type=int, default=DEFAULT_MIN_ZOOM) self.argparser.add_argument('min_zoom', help="Minimum zoom level to render", type=int, default=DEFAULT_MIN_ZOOM)
self.argparser.add_argument('max_zoom', help="Maximum zoom level to render", type=int, default=DEFAULT_MAX_ZOOM) self.argparser.add_argument('max_zoom', help="Maximum zoom level to render", type=int, default=DEFAULT_MAX_ZOOM)


self.argparser.add_argument('-g', '--grid', action="store_true", help="Force grid JSON to be rendered alongside each tile. If -k or -f options are provided, this is inferred and need not be specified.")
self.argparser.add_argument('-k', '--key', help="For grid rendering, the column in the associated dataset which is a unique ID for a feature. If not specified, will use mapnik default ('__id__')")
self.argparser.add_argument('-f', '--fields', help="For grid rendering, a comma separated list of fields associated with each feature which will be included in grid JSON.")

def main(self): def main(self):
if not os.path.isdir(self.args.output_dir): if not os.path.isdir(self.args.output_dir):
os.mkdir(self.args.output_dir) os.mkdir(self.args.output_dir)
Expand Down Expand Up @@ -87,9 +91,14 @@ class IVTile(invar.InvarUtility):
print 'Using %i processes to render %i tiles' % (self.args.process_count, tile_count) print 'Using %i processes to render %i tiles' % (self.args.process_count, tile_count)


processes = [] processes = []

try:
fields = self.args.fields.split(",")
except:
fields = None

for i in range(self.args.process_count): for i in range(self.args.process_count):
renderer = invar.TileRenderer(tile_queues, self.args.config, self.args.width, self.args.height, buffer_size=self.args.buffer, skip_existing=self.args.skip_existing) grid = (self.args.grid or self.args.fields or self.args.key)
renderer = invar.TileRenderer(tile_queues, self.args.config, self.args.width, self.args.height, buffer_size=self.args.buffer, skip_existing=self.args.skip_existing, grid=grid, key=self.args.key, fields=fields)
renderer.start() renderer.start()


processes.append(renderer) processes.append(renderer)
Expand Down

0 comments on commit dbc5491

Please sign in to comment.