Project Kartolog started as a proof of concept for creating 'smart'
tile cache. Smart tile cache stores metadata for each tile in cache
which is later used simplify tile management. Kartolog currently uses
Tornado as HTTP server, MongoDB for storage and Mapnik as a rendering

The problem

Users want to experience fast slippy map with lots of layers using
feature rich modern JavaScript frameworks (OpenLayers, ...). Even
modern browsers with fast JavaScript engines slow down when managing a
(lot of DOM elements = lots of tiles * number of layers).

The idea

Use standard WMS interface to serve combinations of precached tiles in
predefined tile matrix. Disk space is getting cheaper every day so
tiles, and combinations of tiles, will be stored on disk. This all
translates to single WMS layer, and custom control for managing layers
(Base and Overlay).

Tile management should be easy and efficient, if a layer style is
changed or features are modified, only tiles that are actually
rendered should be re-rendered.

The concept

Projections -> Projects -> Layers -> Tiles

Projection defined by bounding-box and max. resolution defines tile
matrix. Project is used to group layers, all layers in a project share
single projection. Layer defines style file location (Mapnik XML)
which is used to render tiles.

Client (i.e. Openlayers) requests a tile for a single layer or
combination of layers. Tilehash is generated for WMS request
(bbox(x,y,z), layers, srs, image format). Which is used for super fast
tile access in database (indexed). If a tile is rendered, has metadata
'status':'done', it's returned to the client. If a tile does not
exist, it's stored in database with metadata 'status':'blank'.

Rendering servers, which are separated from Kartolog tile service,
query database for tiles with 'status':'blank'. During the rendering
tile has 'status':'rendering', and after rendering it's stored with
'status':'done'. Rendering process can render single tile (Mapnik XML)
or combine multiple rendered tiles into single combined tile.

This design enables distributing rendering across many machines, but
client has to request tile at least twice. First to set the
'status':'blank' and then to actually get the rendered tile.


  * WMS tile service
  * single layer WMS service
  * web based management of projections, projects and layers.
  * simple status report (number of tiles in db, tiles rendering, tiles blank)
  * demo application


  * Python (2.6.5)
  * Tornado (1.1)
  * PyMongo (1.9)
  * MongoDB (1.8)
  * Mapnik (0.7.1)
  * PIL (1.1.7)