User:Kodapan/Howto mod tile
This is old stuff, kept for historic reasons. Since the switch2osm-packages it makes very little sense to attempt this installation.
This is a composite of several howtos I followed and things I had to do in order to setup a slippy map using OSM data served by mod_tile. I'm using specific revisions of everything for your convenience.
In my environment this is running on a VirtualBox with 2TB dynamically growing disk, 4096MB RAM and 12 CPUs.
Ubuntu
You need a 64 bit distro for this to work!
Download ubuntu-11.10-desktop-amd64.iso and install from scratch. My first user is called osm, you call it whatever you want but if you do you can't copy and paste from the texts below without encountering problems.
Prerequisites
sudo apt-get install git-core subversion
PostgreSQL
sudo apt-get install postgresql-9.1-postgis postgresql-contrib-9.1 postgresql-server-dev-9.1 sudo sysctl -w kernel.shmmax=268435456 cat > 30-postgresql-shm.conf.diff 7,8c7 < #kernel.shmmax = 33554432 < --- > kernel.shmmax = 268435456 # Max shared memory 256MB
^C
sudo patch -p0 /etc/sysctl.d/30-postgresql-shm.conf < 30-postgresql-shm.conf.diff cat > postgresql.conf.diff 109c109 < shared_buffers = 24MB # min 128kB --- > shared_buffers = 128MB # min 128kB 119c119 < #maintenance_work_mem = 16MB # min 1MB --- > maintenance_work_mem = 256MB # min 1MB 174c174 < #checkpoint_segments = 3 # in logfile segments, min 1, 16MB each --- > checkpoint_segments = 20 # in logfile segments, min 1, 16MB each 431c431 < #autovacuum = on # Enable autovacuum subprocess? 'on' --- > autovacuum = off # Enable autovacuum subprocess? 'on'
^C
sudo patch -p0 /etc/postgresql/9.1/main/postgresql.conf < postgresql.conf.diff /etc/init.d/postgresql restart sudo su postgres createuser -s osm createdb -O osm osm echo "CREATE EXTENSION hstore;" | psql -d osm psql -d osm -f /usr/share/postgresql/9.1/contrib/postgis-1.5/postgis.sql echo "ALTER TABLE geometry_columns OWNER TO osm; ALTER TABLE spatial_ref_sys OWNER TO osm;" | psql -d osm wget http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/900913.sql psql -f 900913.sql osm
Mapnik
This is Mapnik 2.n
sudo apt-get install -y g++ cpp \ libicu-dev \ libboost-filesystem-dev \ libboost-program-options-dev \ libboost-python-dev libboost-regex-dev \ libboost-system-dev libboost-thread-dev \ python-dev libxml2 libxml2-dev \ libfreetype6 libfreetype6-dev \ libjpeg-dev \ libltdl7 libltdl-dev \ libpng-dev \ libgeotiff-dev libtiff-dev libtiffxx0c2 \ libcairo2 libcairo2-dev python-cairo python-cairo-dev \ libcairomm-1.0-1 libcairomm-1.0-dev \ ttf-unifont ttf-dejavu ttf-dejavu-core ttf-dejavu-extra \ git build-essential python-nose \ libgdal1-dev python-gdal libsqlite3-dev
I used a revision from march 2012, a later one might work.
git clone https://github.com/mapnik/mapnik.git cd mapnik git checkout -b kodapan 926404d9aead # checkout version from 2012-03-12 ./configure make # -j 12 sudo make install
No errors should be reported when importing mapnik from python!
Install file: "fonts/unifont-5.1.20080907.ttf" as "/usr/local/lib/mapnik/fonts/unifont-5.1.20080907.ttf" scons: done building targets. osm@osm:~/mapnik$ python Python 2.7.2+ (default, Oct 4 2011, 20:06:09) [GCC 4.6.1] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import mapnik; >>> osm@osm:~/mapnik$
osm2pgsql
sudo apt-get install build-essential libxml2-dev libgeos-dev libpq-dev libbz2-dev proj libtool automake libprotobuf-c0-dev
When documenting this I was at revision 28086.
svn co -r 28086 http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/ cd osm2pgsql ./autogen.sh ./configure
Optionally, you can configure the compiler to produce a faster binary that can only run on CPUs that have the same capabilities as yours.
sed -i 's/-g -O2/-O2 -march=native -fomit-frame-pointer/' Makefile
Finally make it.
make # -j 12 # CPUs
OSM data
svn co -r 28086 http://svn.openstreetmap.org/applications/rendering/mapnik osm-mapnik cd osm-mapnik ./get-costlines.sh
Download the osm.bz2 data that you want to support from cloudmade or what not.
wget http://downloads.cloudmade.com/europe/northern_europe/sweden/sweden.osm.bz2
Finally import data to database. (This will bunzip file using one thread and import data using another.)
cd ~/osm2pgsql bunzip2 -c ../osm-mapnik/sweden.osm.bz2 | ./osm2pgsql -U osm -d osm /dev/stdin Reading in file: /dev/stdin Processing: Node(10744k 124.9k/s) Way(887k 10.08k/s) Relation(10112 306.42/s) parse time: 207s
All indexes on planet_osm_line created in 57s Completed planet_osm_line Osm2pgsql took 328s overall
sudo apt-get install python-lxml ./generate_xml.py --dbname osm --user osm --accept-none upgrade_map_xml.py osm.xml osm-mapnik2.xml
Apache and mod_tile
sudo apt-get install apache2 apache2-threaded-dev apache2-mpm-prefork apache2-utils sudo echo ServerName tile.domain.tld > /etc/apache2/http.conf sudo apt-get install libagg-dev svn co -r 28086 http://svn.openstreetmap.org/applications/utils/mod_tile cd mod_tile ./autogen ./configure
cat > gen_tile.cpp.patch 0a1 > #include <mapnik/config_error.hpp>
^C
patch -p0 gen_title.cpp < gen_title.cpp.patch make sudo make install
For me "nothing happends" as I executed make install, however it produced file .libs/mod_tile.so which I copied to /usr/lib/apache2/modules
sudo cp .libs/mod_tile.so /usr/lib/apache2/modules
After successful make install of mod_tile:
sudo bash -c "echo 'LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so' > /etc/apache2/mods-available/tile.load" sudo a2enmod tile sudo /etc/init.d/apache2 restart cat > default.patch 3a4,10 > LoadTileConfigFile /etc/renderd.conf > ModTileRenderdSocketName /tmp/osm-renderd > # Timeout before giving up for a tile to be rendered > ModTileRequestTimeout 3 > # Timeout before giving up for a tile to be rendered that is otherwise missing > ModTileMissingRequestTimeout 30 >
^C
sudo patch -p0 /etc/apache2/sites-available/default < default.patch cat > /etc/renderd.conf [renderd] num_threads=10 socketname=/tmp/osm-renderd stats_file=/var/run/renderd/renderd.stats [mapnik] plugins_dir=/usr/local/lib/mapnik/input font_dir=/usr/local/lib/mapnik/fonts font_dir_recurse=1 [default] URI=/osm_tiles2/ XML=/home/osm/osm-mapnik/osm-mapnik2.xml HOST=tile.domain.tld
^C sudo mkdir /var/run/renderd sudo chown osm /var/run/renderd sudo mkdir /var/lib/mod_tile sudo chown osm /var/lib/mod_tile ./renderd -f
sudo cat > /var/www/map.html <html> <head> <title>OpenLayers Demo</title> <style type="text/css"> html, body, #basicMap { width: 100%; height: 100%; margin: 0; } </style> <script src="http://www.openlayers.org/api/OpenLayers.js"></script> <script> function init() { var options = { projection: new OpenLayers.Projection("EPSG:900913"), displayProjection: new OpenLayers.Projection("EPSG:4326"), units: "m", maxResolution: 156543.0339, maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34), numZoomLevels: 20, controls: [ new OpenLayers.Control.Navigation(), new OpenLayers.Control.PanZoomBar(), new OpenLayers.Control.Permalink(), new OpenLayers.Control.ScaleLine(), new OpenLayers.Control.MousePosition(), new OpenLayers.Control.KeyboardDefaults() ] }; map = new OpenLayers.Map("basicMap",options); var newL = new OpenLayers.Layer.OSM("Default", "/osm_tiles2/${z}/${x}/${y}.png", {numZoomLevels: 19}); map.addLayer(newL); map.zoomIn(); } </script> </head> <body onload="init();"> <div id="basicMap"></div> </body> </html>
^C
Open a webbrowser to http://localhost/map.html
Sources
http://wiki.openstreetmap.org/wiki/HowTo_mod_tile
https://github.com/mapnik/mapnik/wiki/UbuntuInstallation
And many more that I forgot... Will try to find them in my history.