Nominatim
Nominatim (du Latin, 'par le nom') est un outil permettant de chercher des données géographiques par leur nom et leur adresse et de générer des adresses potentielles à partir de coordonnées géographiques (reverse geocoding). L'outil peut être utilisé en ligne sur cette page : http://nominatim.openstreetmap.org.
Nominatim est aussi utilisé par l'outil Search de la page d'accueil d'OpenStreetMap et améliore la qualité de la recherche proposée sur les sites MapQuest Open Initiative, PickPoint et OpenCage Geocoder.
La présente page décrit le processus d'installation de Nominatim sur un ordinateur personnel utilisé en qualité de serveur.
Pourquoi installer Nominatim
Pour un usage occasionnel, installer Nominatim sur son ordinateur n'a aucun intérêt. En revanche, pour des usages fréquents et répétés l'installation de Nominatim permet :
- de soulager les serveurs libres et gratuits d'OpenStreetMap
- de ne pas être dépendant d'internet
- de disposer de ses propres bases de données
Installer Nominatim
Installer les dépendances
sudo apt-get install libgeos-dev libpq-dev libtool automake libproj-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-thread-dev gcc proj-bin libgeos-c1 osmosis libgeos++-dev php5 php-pear php5-pgsql php5-json php-db postgresql postgis postgresql-contrib postgresql-9.3-postgis-2.1 postgresql-server-dev-9.3 libprotobuf-c0-dev protobuf-c-compiler
Il faut aussi installer les paquets suivants si vous ne les avez pas déjà installés :
sudo apt-get install build-essential libxml2-dev libbz2-dev git cmake pkg-config
Pour l'installation depuis les sources git
sudo apt-get install git autoconf-archive
Installer depuis les sources
Installation à partir de la version stable 2.4.0 (à la date du 4 juin 2015).
Téléchargement du fichier d'installation compressé
wget http://www.nominatim.org/release/Nominatim-2.4.0.tar.bz2
Décompactage du fichier d'installation
tar xvf Nominatim-2.4.0.tar.bz2
Compilation
Se rendre dans le répertoire Nominatim créé après la décompression (appelé Nominatim dans l'exemple ci-dessous)
cd Nominatim ./configure make sudo checkinstall
Personnalisation de Nomitamim
La création d'un fichier <local.php> situé dans le répertoire settings permet de personnaliser Nominatim. Les paramètres possibles peuvent être consultés dans le fichier <settings/settings.php>. Pour davantage de détail voir (en) doc
Si vous souhaitez personnaliser les titres des pages internet telles qu'elles s'affichent dans votre navigateur, il suffit de modifier le texte figurant entre les balises <title> et </title> dans les fichiers <lib/template/search-html.php> <lib/template/details-html.php> et <lib/template/details-error-html.php>.
ex :
<title>Perso - OpenStreetMap Nominatim : Recherche</title>
au lieu de :
<title>OpenStreetMap Nominatim: Search</title>
Téléchargement de données optionnelles
Pondérations Wikipedia (Wikipedia rankings)
Le fonctionnement de Nominatim peut être amélioré par le recours aux pondérations Wikipédia qui permettent de mesure l'importance des données osm. Nominatim peut fonctionner sans ces données mais la qualité du résultat s'en trouve dégradée.
Téléchargement des données
wget --output-document=data/wikipedia_article.sql.bin http://www.nominatim.org/data/wikipedia_article.sql.bin wget --output-document=data/wikipedia_redirect.sql.bin http://www.nominatim.org/data/wikipedia_redirect.sql.bin
La taille cumulée de ces deux fichiers atteint 1,5 GO et ajoute 30 GO à la taille finale de Nominatim sur le disque. La durée d'installation de Nominatim s'en trouve accrue d'une heure environ.
Codes postaux britanniques
Le cas échéant, utile pour les recherches concernant le territoire britannique.
wget --output-document=data/gb_postcode_data.sql.gz http://www.nominatim.org/data/gb_postcode_data.sql.gz
Installation des données Tiger housenumber pour les États-Unis d'Amérique
Aux États-Unis d'Amérique, l'instance Nominatim d'OSM utilise la base de données d'adresses TIGER pour compléter les données sur les numéros de rues qui restent encore incomplètes dans OpenStreetMap. L'ajout des données TIGER est possible après avoir installé la librairie GDAL pour Python. Installation de la librairie GDAL pour Python
sudo apt-get install python-gdal
Téléchargement des données TIGER 2014
Les fichiers à télécharger sont les fichiers EDGES (3 234 fichiers compressés, 11GO au total)
wget -r ftp://ftp2.census.gov/geo/tiger/TIGER2014/EDGES/
Conversion des données en requêtes SQL (sauvegardées dans data/tiger2011) :
./utils/imports.php --parse-tiger-2011 <répetoire des fichiers tiger edge>
Importation des données dans la base de données Nominatim de votre station de travail
./utils/setup.php --import-tiger-data
Création des comptes postgres
Compte de l'importateur
sudo -u postgres createuser -s <votre nom d'utilisateur>
Compte de l'utilisateur
Le nom d'utilisateur correspond au nom du compte qui doit être utilisé pour finaliser l'installation. Vous devez vous assurer (paramétrage généralement par défaut dans la plupart des distributions) que cet utilisateur peut se connecter à la base de donnée sans mot de passe.
Création de l’utilisateur du site web (PostgreSQL)
sudo -u postgres createuser -SDR www-data
Utilisateur nécessaire pour l'installation. Si vous souhaitez utiliser le site web avec un autre utilisateur, reportez-vous à la documentation (section Set up the website).
Paramètres PostgreSQL
Par défaut la base de données PostgreSQL s'installe dans le répertoire racine, au risque de ne plus laisser de place au système. Le répertoire de la base de donnée est le suivant sur mon Ubuntu 14.04 : </var/lib/postgresql/9.3/main> [9.3 pour la version actuelle]. Le répertoire par défaut peut être modifié dans le fichier de configuration </etc/postgresql/9.3/main/postgresql.conf>.
Pour redémarrer le serveur PostgreSQL, deux commandes équivalentes
sudo pg_ctlcluster 9.3 main start
ou bien
sudo service postgres 9.3 main start
Permissions de lecture Nominatim
L'ensemble des fichiers et répertoire doit être accessible en lecture pour le serveur PostgreSQL car certaines fonctions Nominatim Postgres sont intégrées au module C nominatim.so.
Ainsi, pour le cas d'un téléchargement et d'une compilation dans le répertoire <src> du répertoire utilisateur, saisir :
chmod +x ~/src chmod +x ~/src/Nominatim chmod +x ~/src/Nominatim/module
Importation et indexation des données OSM
L'importation préalable du fichier mondial ("Planet file") ou d'une extraction (par exemple du site Geofabrik) est nécessaire. Utiliser le format PBF.
Une fois le téléchargement terminé, saisir la commande suivante :
./utils/setup.php --osm-file <your planet file> --all --osm2pgsql-cache 18000 2>&1 | tee setup.log
Le paramètre –osm2pgsql-cache est optionnel mais fortement recommandé en cas d'importation de l'ensemble des données planétaires. Ce paramètre fixe la taille du cache des noeuds lors de l'importation osm2pgsql. 24 GO sont recommandés pour une importation des données mondiales mais vous pouvez choisir de fixer une valeur inférieure. À adapter à la taille de votre RAM pour éviter le swap.
Il se peut que vous rencontriez des problèmes liés au paramétrage de postgresql lors de l'importation des données, fichiers manquants, opérations impossibles, etc. La procédure ci-dessous a permis de solutionner le problème pour une installation particulière. À tenter sans garantie et en réfléchissant un peu. NB : postgresql exige que la version soit précisée, dans l'exemple ci-dessous c'est la 9.3. À adapter selon votre configuration.
- Arrêt postgresql
sudo pg_ctlcluster 9.3 main stop
- Suppression cluster
sudo -i -u postgres pg_dropcluster 9.3 main --stop exit
- suppression complète des paquets
sudo apt-get purge postgresql-9.3 postgresql postgresql-9.3-postgis-scripts postgresql-client-9.3 postgresql-client-common postgresql-common postgresql-contrib postgresql-contrib-9.3 liblwgeom-2.1.4 libgdal-dev libpostgis-java libpostgresql-jdbc-java libpq-dev php5-pgsql postgis postgis-doc osmosis sudo apt-get autoremove
- Suppression des répertoires
/var/lib/postgresql /etc/postgresql /var/log/postgresql /usr/share/postgresql et votre répertoire de données
sudo rm -R /var/lib/postgresql /etc/postgresql/ /var/log/postgresql /usr/share/postgresql sudo rm -R <votre répertoire>
- Réinstallation complète de tous les paquets
sudo apt-get install postgresql-9.3 postgresql postgresql-9.3-postgis-scripts postgresql-client-9.3 postgresql-client-common postgresql-common postgresql-contrib postgresql-contrib-9.3 liblwgeom-2.1.4 libgdal-dev libpostgis-java libpostgresql-jdbc-java libpq-dev php5-pgsql postgis postgis-doc osmosis
- Création d'un lien symbolique
(selon le résultat de la commande <pg_config –libdir>)
sudo ln -s /usr/share/postgresql/9.3/contrib/postgis-2.1 /usr/lib
- Création du cluster main
sudo pg_createcluster -d <votre répertoire> 9.3 main
- Démarrage postgresql
sudo pg_ctlcluster 9.3 main start
- Création utilisateur
sudo -u postgres createuser -s <votre nom d’utilisateur>
- Création utilisateur www-data
sudo -u postgres createuser -SDR www-data
- Retour dans nominatim
cd <votre répertoire d'installation> * Traitement données <code> ./utils/setup.php --osm-file <votre fichier.osm.pbf> --all --osm2pgsql-cache 18000 2>&1 | tee setup.lo
- On commence par vérifier le nom de la base (normalement c'est nominatim)
psql -l
- Puis on efface (et on perd tout évidemment)
dropdb nominatim
Ajout des phrases spéciales
Ajout des codes et des noms de pays à l'index de recherche
Saisir les instructions suivantes dans le terminal :
./utils/specialphrases.php --countries > data/specialphrases_countries.sql psql -d nominatim -f data/specialphrases_countries.sql
Marqueurs spécifiques
Si vous souhaitez retrouver des marqueurs particuliers ("amenity") comme par exemple des cafés parisiens, vous de devez importer les phrases spéciales de ce wiki de la manière suivante :
./utils/specialphrases.php --wiki-import > data/specialphrases.sql psql -d nominatim -f data/specialphrases.sql
Ces opération doivent être répétées de temps en temps pour prendre en compte les mises à jours et compléments du wiki. Il est notamment nécessaire d'effectuer la mise à jour après chaque mise à jour de Nomnatim.
Langues
Si vous n'avez pas besoin des phrases pour toutes les langues, éditez utils/specialphrases.php et supprimez en début de fichier les langues non utilisées.
initialisation du site web
Les instructions ci-dessous rendront Nominatim disponible à http://localhost/nominatim.
Création du répertoire
Créer le répertoire du site et assurez vous que les droits en écriture sont ouverts pour l’utilisateur d'installation et en lecture par Apache.
sudo mkdir -m 755 <répertoire racine apache>/nominatim sudo chown <votre nom d'utilisateur> <répertoire racine apache>/nominatim
Paramètres de CONST_Website_BaseURL
Vérifier que settings/local.php est configuré avec les valeurs correctes pour CONST_Website_BaseURL : il faut créer un fichier local.php dans le répertoire Nominatim-2.4.0/settings contenant les valeurs suivantes :
@define('CONST_Website_BaseURL', '<répertoire racine serveur pour le navigateur>/nominatim');
par exemple :
@define('CONST_Website_BaseURL', 'http://localhost/nominatim/');
#@define('CONST_Website_BaseURL', 'http://'.php_uname('n').'/');
et la remplacer (donc insérer en dessous) par :
@define('CONST_Website_BaseURL', 'http://localhost/nominatim/');
Ce n'est pas orthodoxe mais ça peut fonctionner en cas de problème d'arborescence.
Liens symboliques
Rendre disponible le répertoire du site web avec les liens symboliques nécessaires :
./utils/setup.php --create-website <répertoire racine apache>/nominatim
Configuration pour utilisation avec Apache
Vérifier que le fichier de configuration Apache contient les valeurs suivantes pour les répertoires :
<Directory "/var/www/html/nominatim/"> Options FollowSymLinks MultiViews AddType text/html .php </Directory>
En d'autres termes il faut insérer ces lignes dans le fichier de configuration </etc/apache2/apache2.conf> (adapter le nom du répertoire).
</var/www/html/nominatim> doit être remplacé par le nom du répertoire défini lors de la mise en place du site web Nominatim (voir ci-dessus).
Relancer Apache après modification de la configuration (sudo service apache2 start | restart)
Vous pouvez désormais utiliser Nominatim
Saisir http://localhost/nominatim/search.php dans votre navigateur internet saisir une adresse...ml/
Configuration pour utilisation avec Nginx
Pas testé. Voir (en) doc
Utilisation de Nominatim
La recherche dans Nominatim fonctionne à partir d'objets nommés ou numérotés à partir des données Openstreetmap (OSM) ainsi que d'une liste d'objets "non nommés" comme des commerces, des hôtels, des bâtiments publics, etc.
Le serveur Nominatim peut fonctionner de manière interactive dans le navigateur : saisir l'adresse localhost/nominatim/search.php affiche une carte du monde avec une zone à l'intérieur de laquelle il suffit de saisir une adresse physique pour la géocoder.
Toutefois Nominatim peut faire nettement plus, c'est ce que nous allons voir ci-dessous.
Géocodage
Le géocodage est l'action consistant à transformer une adresse en coordonnées géographiques.
Format des requêtes
Il est conseillé de saisir les requêtes de gauche à droite, en commençant par le plus précis (1, quai de la fraternité, Marseille) puis, en cas de difficulté, de réssayer en ordre inverse, de droite à gauche.
Format de base
Les requêtes sont passées dans le navigateur sous la forme suivante :
"http://nominatim.openstreetmap.org/search?<paramètres>"
ou
"http://nominatim.openstreetmap.org/search/<requête>?<paramètres>"
Adresses
Rue de la République, Marseille et Marseille, Rue de la République sont deux formats valides
Numéros
La saisie des numéros améliore la précision de la recherche. Dans ce cas le format de gauche à droite est nécessaire : 51, rue de la République, Marseille
Virgule
La présence de virgules entre les termes de la recherche n'est pas obligatoire mais améliore l’efficacité de la requête.
Mots clés spécifiques
L'usage des mots clés spécifiques est possible si les "phrases spéciales" (special phrases) ont été ajoutées à la base de donnée.
Paramètres
format=[html|xml|json|jsonv2]
Format de la sortie
- html
Format html
- xml
Format XML (format structuré)
- json
Format json
- jsonv2
Format jsonv2
json_callback=<chaîne>
Empaquette le résultat de la requête dans un appel de fonction json, c'est à dire une chaîne commençant par "json>"
accept-language=<langue du navigateur au format chaîne de caractère>
Force la langue de résultat indépendamment des valeur figurant dans l'en-tête (header) http. Accepte toutes les langues au format rfc2616 ou des codes de langue séparés par des virgules.
Écriture de la requête
q=<requête> <requête> est la chaîne de caractères recherchée. Les valeurs suivantes sont possibles :
- street=<numéro> <nom de rue>
- city=<ville>
- county=<comté>
- state=<état>
- country=<pays>
- postalcode=< code postal>
Requêtes structurées (experimental)
Les requêtes structurées sont plus rapides et nécessites moins de ressources serveur. NE PAS COMBINER AVEC LES PARAMETRES q=<query> PARAMETRES
countrycodes=< code pays>[,< code pays>][,< code pays>]...
Restreint la recherche à un pays (ou une liste de pays). Code au format ISO 3166-1alpha2 (fr pour France)
viewbox=<gauche>,<haut>,<droite>,<bas> ou viewboxlbrt=<gauche>,<bas>,<droite>,<haut>
zone préferentielle de recherche des résultats
bounded=[0|1]
Restreint la recherche aux seuls objets contenus dans la zone de recherche. Cette restriction permet la recherche par aménité. Ainsi [pub] échouera alors que [pub] avec bounded=1 affichera une liste d'objets correspondant à l'item à l'intérieur de la zone de recherche.*
polygon=[0|1]
Obsolète
addressdetails=[0|1]
Séparation de l'adresse en différents éléments
email=<addresse électronique de contact>
Peu utile pour un serveur autohébergé. Concerne les usages en ligne en masse
exclude_place_ids=<identifiant de lieu,[identifiant de lieu],[identifiant de lieu]>
Permet d'exclure de la liste des résultats certains objets à partir de leur identifiant OSM. Cette fonctionnalité est utile lorsqu'une première recherche n'a produt qu'un nombre lmité de résultats. Exclure ces objets permet d'obtenir davantage de réponses.
limit=<entier>
Limite le nombre des résultats au nombre précisé
dedupe=[0|1]
Non documenté
debug=[0|1]
Non documenté
polygon_geojson=1
Affiche la géométrie des résultats au format geojson.
polygon_kml=1
Affiche la géométrie des résultats au format kml.
polygon_svg=1
Affiche la géométrie des résultats au format svg.
polygon_text=1
Affiche la géométrie des résultats au format WKT.
Exemples
Pour faciliter le travail des utilisateurs, les liens sont donnés d'abord sur le serveur internet Nominatim d'Openstreetmap puis sur localhost pour les ubuntunautes qui ont poursuivi le travail d'installation du serveur à son terme.
32 quai du port à Marseille
12 Cours Mirabeau à Aix-en-Provence
Détails : 20, La Canebière à Marseille
À noter : les place_id sont différents !
Et une petite dernière pour la route :
Géocodage inversé
Le géocodage inversé est l'action qui consiste à déduire une adresse à partir d'une position en latitude et longitude. Le paramètre optopnnel de zoom précise le niveau de détail requis.
format=[xml|json]
Format de la sortie
xml
Format XML (format structuré)
json
Format json
json_callback=<chaîne>
Empaquette le résultat de la requête dans un appel de fonction json, c'est à dire une chaîne commençant par "json>"
accept-language=<langue du navigateur au format chaîne de caractère>
Force la langue de résultat indépendamment des valeur figurant dans l'en-tête (header) http. Accepte toutes les langues au format rfc2616 ou des codes de langue séparés par des virgules.
osm_type=[N|W|R] osm_id=<valeur>
objet OSM (noeud/route/relation) à géocoder. Lorsque cela est possible, l'usage des identifiants d'objets OSM est préférable.
lat=<valeur> lon=<valeur>
Coordonnées du point à géocoder.
zoom=[0-18]
Niveau de zoom, 1 correspond à un pays, 18 à un immeuble.
addressdetails=[0|1]
Séparation de l'adresse en différents éléments
email=<adresse électronique de contact>
Peu utile pour un serveur auto hébergé. Concerne les usages en ligne en masse.
Hierarchie
- Niveau administratif entité XML
- 2 <pays>
- 4 <état> (en France, région ?)
- 5 <district d'état> (en France, département ?)
- 6
- 7 <comté> (en France, canton ?)
- 8 <commune>
- 9 <arrondissement>
- 10 <quartier>
Exemples
Latitude Nord 43,29537 Longitude Est 5,37444
Surprise ! C'est : 1, La Canebière, Marseille 1er Arrondissement, Marseille, Bouches-du-Rhône, Provence-Alpes-Côte d'Azur, 13001, France
Latitude Nord 44,90008 Longitude Est 6,4461
Et la capture d'écran :
Gare SNCF de Briançon.
Consultation d'adresses
Affiche les adresses d'un ou plusiseurs objets OSM : noeuds, routes, relations.
Format
http://nominatim.openstreetmap.org/lookup?<query>
Paramètres
format=[xml|json]
Format de la sortie
xml Format XML (format structuré) json Format json
json_callback=<chaîne>
Empaquette le résultat de la requête dans un appel de fonction json, c'est à dire une chaîne commençant par "json>"
accept-language=<langue du navigateur au format chaîne de carctères>
Force la langue de résultat indépendamment des valeur figurant dans l'en-tête (header) http. Accepte toutes les langues au format rfc2616 ou des codes de langue séparés par des virgules.
osm_ids=[N|W|R]<valeur>,…,[N|W|R]<valeur>
liste de 1 à 50 objets dont l'adresse doit être retournée.
addressdetails=[0|1]
Séparation de l'adresse en différents éléments
email=<addresse électronique de contact>
Peu utile pour un serveur autohébergé. Concerne les usages en ligne en masse.
Exemples
Mise à jours base de données Nominatim avec Osmosis
Plusieurs méthodes existent, la documentation OpenStreetMap conseille Osmosis et renvoie à la lecture de <./utils/update.php –help> pour obtenir la liste des autres méthodes.
Installation de la nouvelle version d'Osmosis
Téléchargement du binaire
La version d'Osmosis disponible dans les paquets de la plupart des distributions est trop ancienne pour repérer correctement les différences pour la mise à jour. Il est donc conseillé de télécharger le binaire de la dernière version stable sur le site Osmosis puis de le décompresser. Copier alors le binaire dans </usr/local/bin> :
wget http://bretth.dev.openstreetmap.org/osmosis-build/osmosis-latest.zip unzip osmosis-latest.zip bin/osmosis mv bin/osmosis /usr/local/bin/osmosis rmdir bin rm osmosis-latest.zip
Définition de la version à utiliser
Indiquer alors à Nominatim d'utiliser cette version d'Osmosis en ajoutant cette cible au fichier settings/local.php:
@define('CONST_Osmosis_Binary', '/usr/local/bin/osmosis');
Configuration des mises à jour
Par défaut, Nominatim est configuré pour réaliser des mises à jour des différences globales à la minute (?? global minutely diffs - mon anglais technique est insuffisant pour une traduction optimale).
Modification des sources de mise à jour
Pour modifier les sources de mise à jour, le paramétrage est à faire dans le fichier <settings/local.php>. Par exemple, pour utiliser les mises à jours quotidiennes en Irlande à partir de Geofabrik, ajouter les lignes suivantes à <settings/local.php> :
@define('CONST_Replication_Url', 'http://download.geofabrik.de/europe/ireland-and-northern-ireland-updates'); @define('CONST_Replication_MaxInterval', '40000'); // Process each update separately, osmosis cannot merge multiple updates @define('CONST_Replication_Update_Interval', '86400'); // How often upstream publishes diffs @define('CONST_Replication_Recheck_Interval', '900'); // How long to sleep if no update found yet
Et pour la France :
@define('CONST_Replication_Url', 'http://download.geofabrik.de/europe/france-updates');
Remplacement du paramétrage antérieur
Il est nécessaire de préalablement effacer le fichier <configuration.txt> puis d’exécuter la commande setup.php :
rm configuration.txt ./utils/setup.php --osmosis-init
Activation des mises à jour hiérarchiques
Lorsqu'un lieu est modifié dans la base de données, l'ensemble des lieux qui contiennent cet endroit doit être également mis à jour. Ces mises à jour hiérarchiques sont désactivées pas défaut car elles ralentissent l'importation initiale. Il convient d'activer ces mises à jour avec la commande suivante :
./utils/setup.php --create-functions --enable-diff-updates
Mise à jour de Nominatim
La commande ci-dessous permet de maintenir à jour en permanence la base de donnée :
./utils/update.php --import-osmosis-all --no-npi
Mise à jour des données si la base de données porte sur plusieurs pays : le script ci-dessous devrait faire le job (original ici)
#!/bin/bash ### Country list COUNTRIES="europe/isle-of-man europe/kosovo" NOMINATIM="/var/Nominatim" ### Foreach country check if configuration exists (if not create one) and then import the diff for COUNTRY in $COUNTRIES; do DIR="$NOMINATIM/updates/$COUNTRY" FILE="$DIR/configuration.txt" if [ ! -f ${FILE} ]; then /bin/mkdir -p ${DIR} /usr/bin/osmosis --rrii workingDirectory=${DIR}/. /bin/echo baseUrl=http://download.geofabrik.de/${COUNTRY}-updates > ${FILE} /bin/echo maxInterval = 0 >> ${FILE} cd ${DIR} /usr/bin/wget http://download.geofabrik.de/${COUNTRY}-updates/state.txt fi FILENAME=${COUNTRY//[\/]/_} /usr/bin/osmosis --rri workingDirectory=${DIR}/. --wxc ${FILENAME}.osc.gz done INDEX=0 # false ### Foreach diff files do the import cd ${NOMINATIM}/updates for OSC in *.osc.gz; do ${NOMINATIM}/utils/update.php --import-diff ${NOMINATIM}/updates/${OSC} INDEX=1 done ### Re-index if needed if ((${INDEX})); then ${NOMINATIM}/utils/update.php --index fi ### Remove all diff files rm -f ${NOMINATIM}/updates/*.osc.gz