A world map in two flavours:
- Piano, when you need a very light background to put data on top of if
- Forte, when you need a generic purpose map
And three languages: French, English, Arabic.
Create a pianoforte
PSQL database:
sudo -u postgres createdb pianoforte -O youruser
Clone this repository:
git clone https://github.com/tilery/pianoforte
Compile the world boundaries:
make boundary
Download the PBF from Geofabrik:
make download
Note: you can use another area by setting the PBF
env var to the Geofabrik
relative path (default is: africa/egypt-latest.osm.pbf).
Import the PBF and the boundaries into the database:
make import
Copy the localconfig sample, and change the db configuration inside:
cp localconfig.js.sample localconfig.js
Run kosmtik with forte:
kosmtik serve forte.yml
Or with piano:
kosmtik serve piano.yml
- tiles are generated by the classic mod_tile/Mapnik stack
- Mapnik XML files are distributed in dist/ folder in this repository
- OSM data is managed by Imposm
- custom data (including boundaries, country labels, main city labels) is managed by mae-boundaries
- postgresql
- postgis
- gdal
- apache2
- imposm
- mod-tile (see osmadmins/ppa for Ubuntu)
-
create a database with postgis extension:
createdb tilery psql tilery -c "CREATE EXTENSION IF NOT EXISTS postgis"
Note: the database is named tilery
to follow conventions in the Mapnik XML
generated in the dist/
of the project, see below.
-
grab Mapnik XML, fonts, icons, Imposm mapping…:
git clone https://github.com/tilery/pianoforte /path/to/pianoforte --depth 1
-
download OSM data
wget https://planet.openstreetmap.org/pbf/planet-latest.osm.pbf
-
download coastline data
wget https://osmdata.openstreetmap.de/download/simplified-land-polygons-complete-3857.zip unzip simplified-land-polygons-complete-3857.zip wget https://osmdata.openstreetmap.de/download/land-polygons-split-3857.zip unzip land-polygons-split-3857.zip
-
import OSM data
imposm import -diff -config /path/to/imposm.conf -read /path/to/planet-latest.osm.pbf -overwritecache -write -deployproduction
-
download and import boundary data
wget http://nuage.yohanboniface.me/boundary.json ogr2ogr --config PG_USE_COPY YES -lco GEOMETRY_NAME=geometry -lco DROP_TABLE=IF_EXISTS -f PGDump boundary.sql /path/to/boundary.json -sql 'SELECT name,"name:en","name:fr","name:ar","name:es","name:de","name:ru",iso FROM boundary' -nln itl_boundary psql -d tilery --file /path/to/boundary.sql
-
download and import city names
wget https://raw.githubusercontent.com/tilery/mae-boundaries/master/city.csv ogr2ogr --config PG_USE_COPY YES -lco GEOMETRY_NAME=geometry -lco DROP_TABLE=IF_EXISTS -f PGDump city.sql /path/to/city.csv -select name,'name:en','name:fr','name:ar',capital,type,prio,ldir -nln city -oo X_POSSIBLE_NAMES=Lon* -oo Y_POSSIBLE_NAMES=Lat* -oo KEEP_GEOM_COLUMNS=NO -a_srs EPSG:4326 psql -d tilery --file /path/to/city.sql
-
download disputed areas
wget http://nuage.yohanboniface.me/disputed.json -O data/disputed.json
-
create custom DB indexes
psql -d tilery -c "CREATE INDEX IF NOT EXISTS idx_road_label ON osm_roads USING GIST(geometry) WHERE name!='' OR ref!=''" psql -d tilery -c "CREATE INDEX IF NOT EXISTS idx_boundary_low ON osm_admin USING GIST(geometry) WHERE admin_level IN (3, 4)"
-
in renderd configuration file (/etc/renderd.conf) add one section for any flavour/language you want to support:
[fortefr] URI=/fortefr/ TILEDIR=/srv/tilery/tmp/tiles XML=/srv/tilery/pianoforte/fortefr.xml HOST=localhost TILESIZE=256 MAXZOOM=20 CORS=*
-
if you want retina support, add dedicated sections, example:
[fortefr2x] URI=/fortefr@2x/ TILEDIR=/srv/tilery/tmp/tiles XML=/srv/tilery/pianoforte/fortefr.xml HOST=localhost TILESIZE=512 SCALE=2 MAXZOOM=20 CORS=*
-
configure
mod_tile
; create/etc/apache2/mods-available/tile.load
with this content:LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so
-
create
/etc/apache2/mods-available/tile.load
with this content:<IfModule tile_module> LoadTileConfigFile /etc/renderd.conf ModTileRenderdSocketName /var/run/renderd/renderd.sock # Timeout before giving up for a tile to be rendered ModTileRequestTimeout 0 # Timeout before giving up for a tile to be rendered that is otherwise missing ModTileMissingRequestTimeout 30 </IfModule>
-
run renderd
/usr/bin/renderd -f -c /etc/renderd.conf