FR:Nominatim/Installation
Ces scripts sont à utiliser conjointement au mode -O gazetteer de osm2pgsql pour générer une base de donnée permettant un géocodage.
Changements
Pré-requis
Software
- GCC compiler http://gcc.gnu.org/
- PostgreSQL http://www.postgresql.org/
- Proj4 http://trac.osgeo.org/proj/
- GEOS http://trac.osgeo.org/geos/
- PostGIS http://postgis.refractions.net/
- PHP http://php.net/ (both apache and command line)
- PHP-pgsql
- PEAR::DB http://pear.php.net/package/DB
- wget
Une distribution standard Debian/Ubuntu devrait fournir tout ces paquetages.
Ubuntu
apt-get install php5-pgsql postgis postgresql php5 php-pear gcc proj libgeos-c1 postgresql-contrib postgresql-8.4-postgis postgresql-server-dev-8.4 pear install DB
PostgreSQL and PostGIS Version
Soyez conscient que différents problèmes ont été découverts en faisant tourner Nominatim avec PostgreSQL 8.4. A savoir que la version 8.4 a aussi ralenti l'indexation en masse (!). Il est actuellement recommandé d'utiliser PostgreSQL 8.3. Les premiers tests indiquent que la version 9.0 fonctionne correctement.
De surcroît, Nominatim utilise beaucoup la fonction ST_CONTAINS de PostGIS qui semble plus lente sur ses versions antérieure à la 1.5. Ainsi, il serait de bonne augure, si vous avez cette possibilité, d'utiliser une version ultérieure ou égale à la 1.5. Certaines des releases de la version 1.3 ont aussi des problèmes de stabilité.
Hardware
Pour installer les données de l'ensemble de la planète, vous aurez besoin d'un minimum de 300GB d'espace disque. Sur le serveur OSM Nominatim (http://wiki.openstreetmap.org/wiki/Servers/katie) l'import initial (osm2pgsql) dure environ 30 heures, et le reste du processus d'indexation dure environ 10 jours en utilisant deux processeurs parallèlement.
Sur une machine dotée de 16 coeurs et 48 GB de mémoire avec des disques rapides, l'import initial dure environ 4 heures et le reste du processus d'indexation dure toujours environ une semaine.
First Installation
NB : Vous pourrez être amené à rencontrer le nom "gazetteer" ou "gazetteerworld" comme nom de base de donnée, et le nom d'utilisateur "twain" en dur dans certains fichiers. Si vous utilisez des noms différents, prenez garde à modifier ces termes (la commande grep pouvant alors être utile).
Make the database
createdb gazetteer createlang plpgsql gazetteer
cat /usr/share/postgresql/8.3/contrib/_int.sql | psql gazetteer
(Les répertoires d'installation /contrib et /postgis peuvent être différent selon la configuration de votre machine).
cat /usr/share/postgresql/8.3/contrib/pg_trgm.sql | psql gazetteer cat /usr/share/postgresql-8.3-postgis/lwpostgis.sql | psql gazetteer
(lwpostgis.sql est remplacé par postgis.sql dans les nouvelles versions de postgis)
cat /usr/share/postgresql-8.3-postgis/spatial_ref_sys.sql | psql gazetteer
Full script for Ubuntu 11.04:
cat /usr/share/postgresql/8.4/contrib/_int.sql | psql gazetteer cat /usr/share/postgresql/8.4/contrib/pg_trgm.sql | psql gazetteer cat /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql | psql gazetteer cat /usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql | psql gazetteer
Vous pourriez avoir envie de modifier la configuration de PostgreSQL pour une meilleure utilisation de votre configuration matérielle pour les dernières étapes d'installation :
- Vérifiez les paramètres shared_buffers, maintenance_work_mem, et work_mem et augmentez leurs valeurs par défaut (par exemple 4G/1G/1G?)
- définissez random_page_cost à 1.5 (plus petit que la valeur par défaut qui est 4).
- pour l'import initial, désactivez autovacuum=off et fsync=off; ne pas oublier de les restaurer à "on" plus tard.
Import OSM data
Tout d'abord, téléchargez un [Planet File].
Compilez osm2pgsql (depuis http://svn.openstreetmap.org/applications/utils/export/osm2pgsql à moins que vous n'ayez déjà un paquetage à disposition) :
cd osm2pgsql make
Chargez le fichier planétaire. La base de donnée créé à ce niveau n'est pas compatible avec celle que vous pourriez utiliser pour un rendu, créée sans l'option -O gazetteer :
./osm2pgsql -lsc -O gazetteer -C 2000 -d gazetteer planet.osm.bz2
Vérifiez que vous utilisez bien l'option -l (--latlon) et -s (--slim); Ils sont nécessaires. -C est la taille du cache en MB. Si vous disposez de suffisamment de mémoire, définissez -C à 8 fois le plut haut id de noeud OSM divisé par 1 million (au moment où ce texte -original- est rédigé, -C 8000 est le paramétrage vous assurant de la meilleure performance). Utiliser une valeur plus élevée n'améliorera pas vos performances. Si vous ne disposez pas d'autant de mémoire, utilisez tout ce que vous pouvez.
Vous n'avez pas besoin de décompresser le fichier planétaire, osm2pgsql prend à sa charge le format bzip.
Ne faîtes pas attention aux messages d'avertissement traitant de fonctions manquantes ou de types de données.
Si vous obtenez une erreur d'initialisation de projection, c'est que votre installation de proj n'a pas été trouvée à l'emplacement attendu. Copiez le répertoire de proj dans /usr/share pour corriger ce problème (NDR: ou effectuer un lien symbolique?).
Construction du module de transformation
Jusqu'à osm2pgsql 0.69
NB: des versions aussi anciennes sont susceptibles de produire une erreur relation "placex" does not exist durant la phase de transformation osm2pgsql. Le conseil donné par advice (archives OSM) est d'utiliser la dernière version disponible sur svn.
cd gazetteer make
Mettez à jour gazetteer-functions.sql pour spécifier le chemin absolu vers le module, en remplaçant /home/twain/osm2pgsql/gazetteer/gazetteer.so.
osm2pgsql 0.70.x et au delà
Avec les modifications apportées par autotools dans osm2pgsql 0.70.x, la librairie gazetteer.so est construite dans sourcedir/gazetteer/.libs/gazetteer.so dans le sous-répertoire caché .libs, et installé dans $prefix/lib/osm2pgsql/gazetteer.so (avec /usr/local comme valeur par défaut de $prefix).
Jusqu'à la version 0.70.5 il était toujours nécessaire de modifier le chemin vers gazetteer.so dans gazetteer-functions.sql manuellement. A partir de la version 0.70.6 make prend en compte la définition du chemin d'installation spécifié dans gazetteer-functions.sql.
Diverses données complémentaires, utilisées pour patcher les manques dans les données OSM
cd gazetteer cat import_country_osm_grid.sql | psql gazetteer cat import_worldboundaries.sql | psql gazetteer cat import_country_name.sql | psql gazetteer cat import_gb_postcode.sql | psql gazetteer cat import_gb_postcodearea.sql | psql gazetteer cat import_us_state.sql | psql gazetteer cat import_us_statecounty.sql | psql gazetteer
Création du site utilisateur
Créer un site utilisateur, www-data dans l'exemple qui suit
createuser -SDR www-data
Ajout des fonctions gazetteer dans la base de donnée
cat gazetteer-functions.sql | psql gazetteer
Si vous obtenez une erreur ERROR: type "planet_osm_ways" does not exist, cela signifie que vous essayez de lancer le script sur une base "non-slim" qui n'est pas supportée; Vous avez sans doute ommis de spécifier -s lors du premier import.
Ne faîtes pas attention aux erreurs concernant place_boundingbox qui n'apparaissent pas au premier lancement !
cat gazetteer-tables.sql | psql gazetteer
Si vous obtenez une erreur ERROR: operator class “gin_trgm_ops” does not exist for access method “gin”, c'est que vous avez oublier de charger le module pg_trm.sql comme indiqué plus haut. Il est possible de ne le recharger que maintenant, et de ne recommencer que les étapes concernant les tables gazetteer.
cat gazetteer-functions.sql | psql gazetteer
Il est nécessaire de lancer gazetteer-functions.sql une deuxième fois!
Copie des données dans les tables actives
La commande qui suit effectue une première étape d'indexation avec différents triggers et peut prendre un certain temps (pour la planête entière, comptez entre 10 et 3à heures selon votre configuration):
cat gazetteer-loaddata.sql | psql gazetteer
Si vous vous demandez où en est l'avancement de l'indexation, exécutez la commande select pg_size_pretty(pg_relation_size('placex')); puis la même avec place à la place de <placex>. Lorsque le chargement est terminé, placex sera égal à +/- 25% de la taille de place.
Il est recommandé de lancer la commande PostgreSQL analyze une fois le chargement des données terminé.
Index the database
Cette étape peut nécessiter une durée très longue - jusqu'à 10 jours sur la planète entière sur une petite machine.
Pour de petits imports (un pays entier) vous pouvez utiliser:
cat gazetteer-index.sql | psql gazetteer
Pour des imports plus conséquents, vous nécessiterez d'utiliser:
./util.update.php --index
Veillez à bien modifier la chaîne de connexion à la base dans le script PHP.
Si vous avez une machine multiprocesseur, vous pouvez en tirer partie avec le mode multithread ainsi:
./util.update.php --index --index-instances 8 --max-load 10 --max-blocking 10
Cela permettra la création de 8 threads, et ne les mettra en pause que si le chargement dépasse les 10 où si 10 processus sont bloqués d'après /proc/stat.
A titre de vérification après l'indexation, si vous exécutez la commande select count(*) from search_name vous devriez obtenir quelque cose comme 20 millions.
Quelques mots 'spéciaux' pour la recherche
Une description détaillée en est donné dans le fichier lui-même.
cat import_specialwords.sql | psql gazetteer
Paramétrage des permissions
Assurez-vous que toutes les permissions sur la table sont attribuée à l'utilisateur www-data.
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" gazetteer` ; do psql -c "alter table $tbl owner to \"www-data\"" gazetteer; done
Définissez le site web
cp website/* ~/public_html/
Vous devez vous assurer que website/.htlib/settings.php est configuré avec des valeurs correctes.
nano ~/public_html/.htlib/settings.php
Modifiez CONST_Website_BaseURL et CONST_Database_DSN selon les paramètres de votre installation.
Mise à jour
Si vous devez effectuer des mises à jour régulières, vous pouvez au choix utiliser Osmosis pour télécharger des différentiels ou programmer le chargement du script util.update.php pour charger des différentiels journaliers ou toutes les heures.
Différentiels journalier ou chaque heure
Mettez à jour la table 'import_status' pour indiquer la date de votre fichier planétaire (il vous est possible d'avoir un jour de décalage pour ne pas perdre de données).
Modifiezutil.update.php pour remplacer /home/twain par le chemin où vous souhaitez stocker vos données, et lancez:
./util.update.php --import-daily --import-all --index
Osmosis
A documenter.