Skip to main content

Themepark User’s Manual

You need a config file to give to osm2pgsql. It first has to load the Themepark framework:

local themepark = require('themepark')

All configuration is then done through the themepark variable.

After that a typical config file might set some global options and then add topics from one or more themes.

See the config directory for some example config files.

Setting Global Options

Global options can be set with themepark:set_option(OPTION, VALUE). The following options are currently used:

Option Type Default Desciption
attribution text © OpenStreetMap contributors - https://openstreetmap.org/copyright Attribution.
debug bool none (disabled) Set name of debug column. See the Debug Mode section below for details.
extent array none Extent of your map as array table with (xmin, ymin, xmax, ymax).
prefix text none Prefix to be used on all table names.
schema text public Schema to be used for all tables unless overwritten in add_table(). You must have created this schema in the database with CREATE SCHEMA.
srid int 3857 SRID to be used for all geometries in all tables.
tags text none (disabled) Set name of tags column. See the Debug Mode section below for details.
tileset text osm Name of vector tiles tileset.
unique_id text none (disabled) Add column of this name for unique autogenerated ID and matching index to all tables. Needed for some software.

The attribution, extent, and tileset settings are used by the tileserver plugins only.

Adding Topics

Add any topics you want to use in your map using the themepark:add_topic('THEME/TOPIC', OPTIONS) command. In most cases there are no OPTIONS, but if the topic has some configuration options, you can set them.

Example: themepark:add_topic('shortbread_v1/water')

(Basically this will include the file themes/THEME/topics/TOPIC.lua. If it is the first time the THEME is used, it will also initialize that theme.)

For most themes/topics, the order does not matter, but some topics need to come before others. Read the documentation for each used theme for the details.

Name Handling

There are special topics in the core them which allow you to set the policy used for names. In the simplest case you just want to have a name column in all tables based on the name tag. This is done with:

themepark:add_topic('core/name-single', { column = 'name' })

Or you can have several names columns. In this case the name, name:de, and name:en tags will end up in the columns name, name_de, and name_en. Themepark will automatically relace the colons with underscores (_) for easier use in the database.

themepark:add_topic('core/name-list', { keys = {'name', 'name:de', 'name:en'} })

With the name-with-fallback topic, you can configure this even further. The columns will be filled based on the first tag in the list that’s not empty:

themepark:add_topic('core/name-with-fallback', {
    keys = {
        name = { 'name', 'name:en', 'name:de' },
        name_de = { 'name:de', 'name', 'name:en' },
        name_en = { 'name:en', 'name', 'name:de' },
    }
})

Note that themes need to have support for the naming topics, because only they know which tables should get a name at all.

Using Plugins

Themepark has plugins which can be used to create config files for tileservers etc.

Call themepark:plugin(PLUGIN):write_config(...) to create a config file. Note that those autogenerated config files are probably not perfect. But they are a good starting point for some tweaking.

Currently supported are several tile servers and you can generate Taginfo project files.

Plugin For Usage
bbox BBOX Server Call themepark:plugin('bbox'):write_config(FILENAME.toml).
t-rex T-Rex tileserver Call themepark:plugin('t-rex'):write_config(FILENAME.toml). You need the Lua toml module installed. Usually this is done with luarocks install toml.
tilekiln Tilekiln tileserver Call themepark:plugin('tilekiln'):write_config(DIR). The directory must exist. For this to work you need the Lua lyaml module installed. Usually this is done with luarocks install lyaml. Or install the lua-yaml debian package.
taginfo Taginfo Projects Call themepark:plugin('taginfo'):write_config(FILENAME.json) to generate a skeleton of a projects file for taginfo.

Debug Mode

To enable debug mode, set themepark.debug = true at the beginning of your config file or set the environment variable THEMEPARK_DEBUG.

In debug mode you’ll get some more output telling you what Themepark is doing when running osm2pgsql. It will also enable extra debugging columns on your database tables as follows:

Tags: If you set a tags column name with themepark:set_option('tags', NAME) and debug mode is enabled you’ll get an extra JSONB column on all your tables with the name NAME with all the tags of any object you are writing into this table.

Debug: If you set a debug column name with themepark:set_option('debug', NAME) and debug mode is enabled you’ll get an extra JSONB column on all your tables with the name NAME. Themes can put any data they want into that column, this could for instance be some data generated from the OSM tags.

Themes must have support for these debug columns and not all themes do!

Running osm2pgsql

To use any Themepark config you need to set the LUA_PATH environment variable so that osm2pgsql knows where to find the Themepark framework. Set it with something like

export LUA_PATH="REPO_DIR/lua/?.lua;;"

(Replace REPO_DIR with the directory where you checked out the osm2pgsql-themepark repository).

After you have set up the config file, you can run osm2pgsql as usual with something like

osm2pgsql -d DATABASE -O flex -S CONFIG.lua OSM-DATA-FILE

Using Themepark Functions without Theme

It is possible to use the Themepark functions for creating tables or adding processing functions directly in your config file, without a theme. This can be useful, for instance, to modify some tags before the processing functions of a theme are run. See the Author’s Manual for available functions.