Skip to content

Instantly share code, notes, and snippets.

@dugasmark
Created November 7, 2013 14:49
Show Gist options
  • Save dugasmark/7355804 to your computer and use it in GitHub Desktop.
Save dugasmark/7355804 to your computer and use it in GitHub Desktop.
Installation d'un serveur OpenStreetMap sur Ubuntu 12.04 Server http://tuts.syrinxoon.net/tuts/installer-un-serveur-cartographique-avec-openstreetmap

#Installation des dépendances# Une fois votre VM installée, mettez à jour le système et installez les paquets listés ci-dessous.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install subversion git-core tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev libgeos-dev libpq-dev libbz2-dev proj munin-node munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev libboost-all-dev libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev

Notez que le serveur HTTP Apache2 sera installé si ce n'est pas le cas. Nous l'utiliserons pour servir les uiles de la carte et affiche la carte finale.

L'installation des paquets munin et munin-node n'est pas requise mais peut s'avérer utile pour monitorer les performances de votre serveur.

#Création d'un nouvel utilisateur# Nous allons créer un nouvel utilisateur qui sera en charge des applications permettant de faire fonctionner notre serveur géographique.

sudo adduser osm
sudo passwd osm

Dans la suite de ce tutoriel, le mot de passe de mon l'utilisateur osm est osm.

#Installation de PostgreSQL# Pour stocker nos données géographiques PostgreSQL est l'élement clé de notre installation puisque toutes nos données géographiques y seront stockées.

Commençons par installer PostgreSQL ainsi que son extension PostGIS permettant la manipulation de données géographiques.

sudo apt-get install postgresql postgresql-9.1-postgis postgresql-contrib postgresql-server-dev-9.1

Note : La version de PostgreSQL que j'utilise ici est la 9.1, si vous installez la version 9.2 par exemple, pensez à changer le numéro de version dans les paquets ci-dessus.

#Création de la base de données# Commencez par passer sous l'utilisateur possédant les droits d'administration sur PostgreSQL.

sudo -u postgres -i

Nous allons ajouter un nouvel utilisateur qui sera reponsable de la base contenant les données d'OSM.

createuser osm

Pensez à répondre oui (y) lorsque le script vous demandera si l'utilisateur doit être un super utilisateur. Ce n'est pas strictement requis mais PostgreSQL peut vous poser quelques problèmes quand ce n'est pas le cas.

Créons maintenant la base de données en précisant que l'utilisateur osm en est le propriétaire.

createdb -E UTF8 -O osm osm

Nous allons maintenant donner un mot de passe à notre utilisateur osm afin qu'il puisse se connecter.

psql

La commande ci-dessus vous connecte à la console PostgreSQL sous le nom de postgres, l'administrateur par défaut de PostgreSQL.

ALTER USER osm WITH PASSWORD 'osm';

Note : Le fait qu'il y ait deux utilisateur osm est peut être ambigüe... Juste pour être clair, il y a bien un utilisateur système nommé osm ET un utilisateur PostgreSQL nommé osm. Libre à vous de les nommer comme vous le souhaitez de toute façon.

Notre utilisateur osm peut maintenant s'identifier à l'aide du mot de passe osm mais il ne peut pas encore se connecter.

Afin de régler ce problème nous allons aller modifier un fichier de configuration.

sudo vim /etc/postgresql/9.1/main/pg_hba.conf

Descendez dans le fichier jusqu'à trouver la ligne suivante :

local       all         all         peer

Et remplacez la par la ligne ci-dessous.

local       all         all         md5

Nous devons maintenant redémarrer PostgreSQL afin que nos modifications prennent effet.

sudo service postgresql restart

#Configuration de la base de données avec PostGIS# Afin de préparer notre base de données à accueillir des données géographiques, nous allons la configurer avec PostGIS.

Cette configuration se fait de manière très simple en important deux fichiers SQL.

  • postgis.sql importe tout un tas de fonctions permettant de manipuler des données géospatiales dans votre base.
  • spatial_ref_sys.sql crée une table contenant une liste exhaustive des identificateurs de systèmes de coordonnées EPSG.

Chacune des commandes vous demandera le mot de passe de l'utilisateur osm. Si vous avez donné un autre nom à votre base de données, changez celui derrière l'option -d et celui derrière l'option -U si votre utilisateur porte un autre nom.

psql -d osm -U osm -f /usr/share/postgresql/9.1/contrib/postgis.sql
psql -d osm -U osm -f /usr/share/postgresql/9.1/contrib/spatial_ref_sys.sql

#Installation d'osm2pgsql# Pour l'importation des données osm2pgsql est le programme qui va nous permettre de remplir notre base de données à partir des fichiers XML que nous téléchargerons sur OpenStreetMap.

L'installation sera assez brève mais veillez à répondre correctement aux questions qui vous seront posées.

sudo add-apt-repository ppa:kakrueger/openstreetmap
sudo apt-get update
sudo apt-get install osm2pgsql
  • Répondez non (no) à la première question.
  • Dites au script d'utiliser la base osm à la seconde question.
  • Enfin, répondez www-data (ou le nom de l'utilisateur sous lequel tourne Apache) ainsi qu'osm à la troisième et dernière question. Séparez les noms d'utilisateurs par un espace.

#Installation de Mapnik# Pour faire le rendu des cartes Mapnik est le programme qui est chargé de faire le rendu des cartes. Il extrait les données de notre base et s'arrange pour en faire le rendu tout en suivant des règles de style (par défaut celles d'OSM mais libre à vous de créer les votes (et bon courage !)).

L'installation est plutôt directe.

sudo add-apt-repository ppa:mapnik/v2.1.0
sudo apt-get update
sudo apt-get install libmapnik mapnik-utils python-mapnik

Afin de vérifier que Mapnik a été correctement installé, ouvrez un REPL Python et essayez d'importer mapnik.

python
>>> import mapnik
>>>

Si python vous répond avec >>> c'est dans la boîte. Sinon, tentez de diagnostiquer et de corriger le problème avant de poursuivre le tutoriel.

Pressez CTRL+D pour quitter le REPL.

#Installation de mod_tile# Pour servir les cartes Mod Tile est un module d'Apache2 permettant de servir les tuiles (morceaux de cartes, (tiles en anglais)) demandées par les utilisateur et de les mettre en cache une fois générées.

Mod Tile envoit des requêtes à un daemon nommé renderd, installé en même temps que lui, pour contrôler la génération des tuiles. Renderd traite ces requêtes en demandant à Mapnik, que nous venons d'installer, de générer les tuiles si elles n'éxistent pas déjà. Si elles existent, elles sont renvoyées directement depuis le cache.

Durant l'installation, le script vous demandera si vous souhaitez télécharger les coastline data. Ces données contiennent des informations "précompilées" sur le contour des côtés et augmentera par conséquent la rapidité des requêtes dans la base de données car c'est du travail en moins à faire pour Mapnik.

Répondez donc oui lorsqu'on vous demandera de les télécharger. Ces données ont un poids variant de 400 à 500Mo.

sudo apt-get install libapache2-mod-tile
sudo service apache2 reload

Note : Si le téléchargement des coastline data ne fonctionne pas (vous êtes derrière un proxy par exemple), vous pouvez les télécharger manuellement à l'adresse suivante : [https://github.com/gravitystorm/openstreetmap-carto/blob/master/get-shapefiles.sh].

Placez ensuite les fichiers dans le répertoire : /usr/share/mapnik-osm-data/world_boundaries.

Merci à MrBidon pour l'astuce.

#Configuration# De nos programmes ##Configuration de Mapnik## Modifiez le fichier /etc/mapnik-osm-data/inc/datasource-settings.xml.inc pour y entrer les informations de connexion à la base de données.

N'oubliez pas de décommenter les première lignes si elles le sont.

##Configuration du VirtualHost Apache2## Un VirtualHost a été créé pour nous dans le fichier /etc/apache2/sites-available/tileserversite_.

Vous pouvez le regarder pour une liste des paramètres de mod_tile.

Par défaut, ce VirtualHost rend les données cartographiques accessibles à partir de http://votre-domaine.com/osm/. Il est possible de modifier ce paramètre dans le fichier _/etc/renderd.conf/.

#Téléchargement et importation des données D'OpenStreetMap# Nous allons maintenant passer à la phase finale de l'installation de notre serveur, le téléchargement et l'importation des données d'OpenStreetMap dans notre base de données.

##Téléchargement## Rendez-vous sur le site de [Planet OSM] pour télécharger les données.

Une fois sur cette page, plusieurs choix s'offrent à vous :

Télécharger le Latest Weekly Planet File, une archive d'environ 23Go (plusieurs centaines de Go décompressée) contenant les données de toute la planète. Télécharger seulement une partie du monde (Extract) à partir des serveurs de Geofabrik. Note : Téléchargez uniquement les fichiers portant l'extension .osm.bz2, les autres ne nous intéressent pas dans le cas présent.

Pour ce tutoriel, j'ai choisi de télécharger uniquement la Bretagne. Je vais stocker l'archive dans le répertoire personnel de mon utilisateur avant de les importer.

mkdir \~/osm && cd \~/osm
wget http://download.geofabrik.de/openstreetmap/europe/france/bretagne.osm.bz2

Le téléchargement peut prendre un certain temps suivant le poids de votre archive.

##Importation des données## Passons maintenant à l'importation des données.

Note : Prenez un café ou allez dormir, ça peut être très long. De quelques minutes pour les archives les plus petites à quelques jours pour la planète complète.

Nous allons faire appel au programme osm2pgsql précédement installé pour importer nos données.

Ca tient en une commande.

cd \~/osm
osm2pgsql -K -c -s -d osm -U osm -W bretagne.osm.bz2

Je vous détaille ci-dessous la signification des options.

  • -K pour conserver les données côtières.
  • -c pour effacer toutes données (OSM) déjà présentes dans la base si il y en a, utilisez -a pour ne rien supprimer.
  • -s pour stocker les données temporaires en base de données. Réduit considérablement l'utilisation de la mémoire RAM mais ralentit l'importation. Cette option est requise si vous voulez pouvoir mettre à jour vos données ultérieurement.
  • -d pour le nom de base de données dans laquelle on effectue l'importation.
  • -U pour le nom de l'utilisateur avec lequel se connecter à la base de données.
  • -W pour que le script demande le mot de passe de l'utilisateur. L'option -E est implicite et vaut par défaut 3857 qui est le système de projection Mercator (utilisé sur Google Maps et OSM).

Voici ce à quoi les logs devraient ressembler si tout se passe bien.

osm2pgsql SVN version 0.81.0 (64bit id space)

Password:
Using projection SRS 900913 (Spherical Mercator)
Setting up table: planet\_osm\_point
NOTICE:  table "planet\_osm\_point" does not exist, skipping
NOTICE:  table "planet\_osm\_point\_tmp" does not exist, skipping
Setting up table: planet\_osm\_line
NOTICE:  table "planet\_osm\_line" does not exist, skipping
NOTICE:  table "planet\_osm\_line\_tmp" does not exist, skipping
Setting up table: planet\_osm\_polygon
NOTICE:  table "planet\_osm\_polygon" does not exist, skipping
NOTICE:  table "planet\_osm\_polygon\_tmp" does not exist, skipping
Setting up table: planet\_osm\_roads
NOTICE:  table "planet\_osm\_roads" does not exist, skipping
NOTICE:  table "planet\_osm\_roads\_tmp" does not exist, skipping
Allocating memory for dense node cache
Allocating dense node cache in one big chunk
Allocating memory for sparse node cache
Sharing dense sparse
Node-cache: cache=800MB, maxblocks=102401\*8192, allocation method=11
Mid: pgsql, scale=100 cache=800
Setting up table: planet\_osm\_nodes
NOTICE:  table "planet\_osm\_nodes" does not exist, skipping
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "planet\_osm\_nodes\_pkey" for table "planet\_osm\_nodes"
Setting up table: planet\_osm\_ways
NOTICE:  table "planet\_osm\_ways" does not exist, skipping
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "planet\_osm\_ways\_pkey" for table "planet\_osm\_ways"
Setting up table: planet\_osm\_rels
NOTICE:  table "planet\_osm\_rels" does not exist, skipping
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "planet\_osm\_rels\_pkey" for table "planet\_osm\_rels"

Reading in file: bretagne.osm.bz2
Processing: Node(18484k 128.4k/s) Way(2512k 27.02k/s) Relation(12165 202.75/s)  parse time: 297s

Node stats: total(18484998), max(1934092021) in 144s
Way stats: total(2512404), max(183049159) in 93s
Relation stats: total(12165), max(2434641) in 60s
Committing transaction for planet\_osm\_point
Committing transaction for planet\_osm\_line
Committing transaction for planet\_osm\_polygon
Committing transaction for planet\_osm\_roads

Going over pending ways...
'' 2287014 ways are pending

Using 1 helper-processes
Process 0 finished processing 2287014 ways in 963 sec

All child processes exited

2287014 Pending ways took 963s at a rate of 2374.88/s
Committing transaction for planet\_osm\_point
Committing transaction for planet\_osm\_line
Committing transaction for planet\_osm\_polygon
Committing transaction for planet\_osm\_roads

Going over pending relations...
'' 0 relations are pending

Using 1 helper-processes
Process 0 finished processing 0 relations in 0 sec

All child processes exited

Sorting data and creating indexes for planet\_osm\_point
Sorting data and creating indexes for planet\_osm\_line
node cache: stored: 18484998(100.00%), storage efficiency: 55.59% (dense blocks: 9033, sparse nodes: 12001406), hit rate: 100.00%
Sorting data and creating indexes for planet\_osm\_roads
Sorting data and creating indexes for planet\_osm\_polygon
Stopping table: planet\_osm\_nodes
Stopped table: planet\_osm\_nodes in 0s
Stopping table: planet\_osm\_rels
Building index on table: planet\_osm\_rels (fastupdate=off)
Stopping table: planet\_osm\_ways
Building index on table: planet\_osm\_ways (fastupdate=off)
Analyzing planet\_osm\_point finished
Analyzing planet\_osm\_roads finished
Analyzing planet\_osm\_line finished
Stopped table: planet\_osm\_rels in 1s
Copying planet\_osm\_point to cluster by geometry finished
Analyzing planet\_osm\_polygon finished
Creating indexes on  planet\_osm\_point finished
All indexes on  planet\_osm\_point created  in 50s
Completed planet\_osm\_point
Copying planet\_osm\_roads to cluster by geometry finished
Creating indexes on  planet\_osm\_roads finished
All indexes on  planet\_osm\_roads created  in 108s
Completed planet\_osm\_roads
Copying planet\_osm\_line to cluster by geometry finished
Creating indexes on  planet\_osm\_line finished
All indexes on  planet\_osm\_line created  in 184s
Completed planet\_osm\_line
Copying planet\_osm\_polygon to cluster by geometry finished
Creating indexes on  planet\_osm\_polygon finished
All indexes on  planet\_osm\_polygon created  in 416s
Completed planet\_osm\_polygon
Stopped table: planet\_osm\_ways in 427s

Osm2pgsql took 1689s overall

Il m'aura fallu environ 30 minutes pour importer 4Go de données sur une machine possédant un processeur 2 coeurs et 3Go de RAM. Sachez donc que ça peut être très long.

Pour augmenter la vitesse de traitement des données, vous pouvez également utiliser l'option --number-processes=X pour effectuer l'importation avec X processsus. Soyez cependant prudent et vérifiez le nombre de connexions simultannées autorisées par PostgreSQL dans le fichier /etc/postgresql/9.1/main/postgres.conf et augmentez le si nécessaire.

#Test# Nous allons maintenant pouvoir vérifier si tout fonctionne.

Redémarrez Apache2 et démarrez renderd.

sudo service apache2 restart
sudo service renderd start

Rendez-vous à l'adresse http://votre-serveur.com/mod_tile et vérifiez que vous voyez les statistiques de Mod Tile.

En cas de problème, vérifiez les logs de renderd.

tail -f /var/log/syslog | grep renderd

Ou tapez la commande suivante :

renderd  -f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment