Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface.
PLpgSQL Python JavaScript HTML CSS PHP

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.



Lizard-map provides basic map interaction for Django applications that use a lizard-ui user interface. We designed it at Nelen & Schuurmans for our geographical information websites (with water management information).

It provides:

  • Openlayers (map javascript libary) map display and server-side map generation (mapnik's WMS functionality). Background maps are configurable.
  • A "workspace" interaction model: drag mappable items into a workspace and they'll get displayed. The workspace is stored in the Django database.
  • A "collage" attached to every workspace for storing selected info on map items (like graphs).
  • An extention mechanism to plug more or less arbitrary map sources into the workspace so that they can be displayed, searched, etc.

Core concept: workspaces

A workspace item is something that can be displayed on a map. A workspace is a collection of workspace items that is actually displayed.

There are two types of workspaces:

  • Edit Workspace: Every session/user gets its own workspace. This workspace can be edited.
  • Storage Workspace. TODO: extra info.

A workspace item needs to know how to display itself, how to search for items when you click on the map and more. To get that to work for arbitrary map sources, you need to configure an adapter. The adapter has a layer() method for returning a mapnik layer, a search() method for searching and so on.

  • You register an adapter as a so-called "setuptools entrypoint" under a specfic name.
  • When you add a workspace item, you pass in the adapter name and an optional snippet of json to configure the adapter.

The workspace item keeps track of this adapter and its configuragion and uses it to generate maps, for searching, etc.


A workspace item often results in multiple areas or points. If you click on such a point, you normally get a popup with extra information. If you want to compare a couple of those information "snippets", you can place them in your collage. In the GUI this is called "Selectie".

Clicking the collage gives a popup with all the collected information popups in that single popup.


Included is quite some javascript for workspace interaction. Potential workspace items can be drag/dropped into a workspace to add them. Workspace items can be reordered. You can drag them to the trash.


Almost all dependencies are listed in our, so they get pulled in automatically. Not all of them install as good as eggs, though. You might be better off installing them system-wide with your OS's own packaging system.

You can force buildout to use system-wide installed packages with the osc.recipe.sysegg recipe. An example config:

parts =

recipe = osc.recipe.sysegg
force-sysegg = true
eggs =

Development installation

The first time, you'll have to run the "bootstrap" script to set up setuptools and buildout:

$> python

And then run buildout to set everything up:

$> bin/buildout

(On windows it is called bin\buildout.exe).

You'll have to re-run buildout when you or someone else made a change in or buildout.cfg.

The current package is installed as a "development package", so changes in .py files are automatically available (just like with python develop).

If you want to use trunk checkouts of other packages (instead of released versions), add them as an "svn external" in the local_checkouts/ directory and add them to the develop = list in buildout.cfg.

Tests can always be run with bin/test or bin\test.exe.

External dependencies

The dependencies for a full website that uses lizard-map are best expressed as ubuntu/debian package dependencies: build-essential, python2.6-dev, apache2, libjpeg-dev, python-imaging, python-matplotlib, python-mapnik, python-scipy, libapache2-mod-wsgi, python-gdal, spatialite-bin, python-pysqlite2, python-pyproj.

Upgrading to Lizard 3

Short summary to convert your app to Lizard 3.

  • Replace old template tags workspace with workspace_edit and collage_edit (see below).
  • Review for old lizard_map views. Replace with new ones or remove.
  • Migrate
  • Upgrade to class-based views, using one of the View classes (i.e. AppView). An excellent description can be found when googling "class based views reinout". You can take lizard-map views as examples as well.

Site integration

The following steps has to be done in order to use the lizard_map/workspace concepts.

  • Install lizard-map somewhere. (Add 'lizard-map' in your install_requires)

  • Add 'lizard_map' to your INSTALLED_APPS.

  • Add an entry in your

    import lizard_map.urls
    (r'^map/', include(lizard_map.urls)),
  • Use one of the views, i.e. AppView.

Example view:

from lizard_map.views import AppView

class MyAppView(AppView):
    template_name = 'my_app/template.html'

Example template:

{% extends "lizard_map/wms.html" %}
{% load workspaces %}

{% block subtitle %} (page name) {% endblock %}

{% block sidebar %}

<div id="iconbox" class="sidebarbox sidebarbox-stretched iconlist">
        <a href="/address/" class="lizard-map-link">
          <img src="{{ STATIC_URL }}lizard_ui/app_icons/meetgegevens.png" />

{% workspace_edit view.workspace_edit %}
{% collage_edit view.collage_edit %}

{% endblock %}
  • Add this view to your

    import my_app.views

    (r'^$', my_app.views.MyAppView.as_view()),

  • Start testing by running syncdb / migrate.

  • Add and configure background maps by loading "background_maps" fixture.

  • Start dev server.


Some default date range settings can be set in All settings are optional:

START_YEAR = 2000  # Defaults to today - 7 years
END_YEAR = 2010  # Defaults to today + 3 years.

# Define default period 1..5
# From

DEFAULT_PERIOD = 5  # Defaults to 1

# If DEFAULT_PERIOD = 6, define these
DEFAULT_START_DAYS = -20  # Defaults to -1000
DEFAULT_END_DAYS = 1  # Defaults to 10

You can add google analytics to your site by adding the tracking code:

Something went wrong with that request. Please try again.