Skip to content

Commit

Permalink
Add Mapnik store
Browse files Browse the repository at this point in the history
  • Loading branch information
Stéphane Brunner authored and sbrunner committed Oct 3, 2012
1 parent 829959f commit 61791eb
Showing 1 changed file with 66 additions and 0 deletions.
66 changes: 66 additions & 0 deletions tilecloud/store/mapnik_utils.py
@@ -0,0 +1,66 @@
from json import dumps

from tilecloud import TileStore

try:
import mapnik2 as mapnik
except:
import mapnik


class MapnikTileStore(TileStore):
"""
Tiles stored to render with Mapnik
requires mapnik2: http://pypi.python.org/pypi/mapnik2
"""

def __init__(self, tilegrid, mapfile, data_buffer=128, image_buffer=0, output_format='png256', resolution=2, layers_fields={}, **kwargs):
"""
Conastructs a MapnikTileStore
:param tilegrid: the tilegrid.
:param mapfile: the file used to render the tiles.
:param buffer_size: the image buffer size default is 128.
:param output_format: the output format,
possible values 'jpeg', 'png', 'png256', 'grid',
default is 'png256'
:param layers: the layers and fields used in the grid generation,
example: { 'my_layer': ['my_first_field', 'my_segonf_field']},
default is {}.
:param **kwargs: for extended class.
"""

TileStore.__init__(self, **kwargs)
self.tilegrid = tilegrid
self.buffer = image_buffer
self.output_format = output_format
self.resolution = resolution
self.layers_fields = layers_fields

self.mapnik = mapnik.Map(tilegrid.tile_size, tilegrid.tile_size)
mapnik.load_map(self.mapnik, mapfile, True)
self.mapnik.buffer_size = data_buffer

def get_one(self, tile):
bbox = self.tilegrid.extent(tile.tilecoord, self.buffer)
bbox2d = mapnik.Box2d(bbox[0], bbox[1], bbox[2], bbox[3])

size = tile.tilecoord.n * self.tilegrid.tile_size + 2 * self.buffer
self.mapnik.resize(size, size)
self.mapnik.zoom_to_box(bbox2d)

if self.output_format == 'grid':
grid = mapnik.Grid(self.tilegrid.tile_size, self.tilegrid.tile_size)
for n, l in enumerate(self.mapnik.layers):
if l.name in self.layers_fields:
mapnik.render_layer(self.mapnik, grid, layer=n, fields=self.layers_fields[l.name])

This comment has been minimized.

Copy link
@fredj

fredj Dec 7, 2012

Member

Won't work: by design different layers (attributes) can't be mixed. see mapnik/mapnik#1325


tile.data = dumps(grid.encode('utf', resolution=self.resolution))
else:
# Render image with default Agg renderer
im = mapnik.Image(size, size)
mapnik.render(self.mapnik, im)
tile.data = im.tostring(self.output_format)

return tile

0 comments on commit 61791eb

Please sign in to comment.