Importer les données OpenStreetMap dans PostGIS : un guide détaillé pas à pas#
Date de publication initiale : 28 juin 2022
Prérequis :
- des droits d'installation
- de préférence un PC sous Linux Debian/Ubuntu (ou via WSL). Les outils utilisés sont tous disponibles sur Windows, MacOS et même FreeBSD, c'est vous dire !
Introduction#
Dans les tutoriaux d'ici ou d'ailleurs, on part souvent du principe que l'on dispose naturellement d'une base de données PostgreSQL/PostGIS tout bien configurée comme il faut avec, en prime, des données chargées et prêtes à être manipulées comme il se doit, souvent issues d'OpenStreetMap.
C'est justement en voulant rédiger un de ces tutoriaux et en constatant que je refaisais systématiquement le même setup que je me suis dit que ça serait intéressant de le consigner ici. Comme ça, je pourrai y retrouver mes commandes habituelles et y faire référence dans d'autres tutoriels.
Au menu :
- Installer PostgreSQL, ses extensions et configurer tout ce beau monde
- Installer les outils d'import (osm2pgsql) et de pré-traitement (Osmium) des données OSM
- Découper et importer les données dans la base
- Se créer la connexion dans QGIS
Compagniiiie... en mesure !
Installer et configurer PostgreSQL#
Installer PostgreSQL n'a rien de sorcier, tant le travail de packaging et de distribution est remarquablement réalisé et documenté, comme en témoigne la page de téléchargement. Mais c'est toujours bon de se noter les commandes à utiliser pour installer les versions depuis les dépôts communautaires.
Par exemple, sur les distributions Linux Debian comme Ubuntu :
En revanche, le packaging de PostgreSQL sur Debian et Ubuntu intègre des scripts de post-installation qui créent par défaut un cluster main
. C'est sympa de faire une partie du taf mais ce serait plus correct de demander avant quand même, en plus, le cluster n'est même pas optimisé !
Quand je fais installer un four en terre chez moi, je ne m'attends pas à ce que l'artisan me fasse un calzone mal cuite juste après la dernière pierre posée !
Création d'un cluster optimisé#
On prend donc l'habitude de refaire la pâte nous-même. C'est parti pour la création d'un cluster aux petits oignons petites olives !
On commence par lister les clusters (grappes en bon français) existants avec l'utilitaire fourni dans le paquet postgresql-common
:
L'objectif est donc de créer un cluster dédié avec des paramètres optimisés pour les tâches souhaitées (import de données OSM) et par rapport à l'ordinateur utilisé (dans mon cas, un Dell XPS 15 7590 avec un Intel Core i7-9750H de 9e génération - voir la fiche technique).
Pour cela, on va s'appuyer sur deux éléments :
- la documentation d'osm2pgsql qui recommande des paramètres de configuration
- les outils comme PGTune ou Cybertec Postgres Configurator qui permettent de générer une configuration "good enough" selon les capacités de la machine et le type d'application
C'est parti, on crée un cluster osmdata
en passant directement les options qui nous intéressent.
A noter :
- j'abaisse volontairement certaines valeurs pour garder la main sur mon interface graphique et qu'en cas de valeurs différentes entre PGTune et osm2pgsql, j'ai choisi de donner la priorité à ce dernier
- le port doit être différent de ceux déjà utilisés par les autres clusters. Pour me faciliter la mémoire, j'aligne toujours le 4ème chiffre avec l'unité de la version de PostgreSQL et j'ajoute un 5ème pour incrémenter les clusters. Ici, ça donne donc
54342
. - on fait la différence entre les options qui s'appliquent au cluster (
--pgoption
) et celles qui s'appliqueront à toute création de base de données (initdb
) dans ce cluster (qui se situent à la fin, après--
). Ici, il s'agit de paramètres d'intégrité et de sécurité recommandés habituellement (notamment par Dalibo).
Si vous êtes curieux/se, vous pouvez dérouler le détail de ce que la commande retourne.
Le détail de l'exécution sur ma machine
Enfin, on démarre l'instance :
Et voilà, on a notre PostgreSQL proprement installé et configuré sur notre machine !
Changer la configuration du cluster plus tard#
Il est évidemment possible de changer les paramètres du cluster par la suite, soit via une instuction SQL ALTER SYSTEM
, soit en éditant le postgresql.conf
:
Astuce pour avoir une Calzone réussie à chaque installation
Il est aussi possible de changer le comportement des scripts de post-installation du packaging PostgreSQL en modifiant le fichier /etc/postgresql-common/createcluster.conf
, soit pour désactiver la création automatisée du cluster main
, soit pour en modifier les paramètres par défaut (par exemple avec initdb_options = '--data-checksums --lc-messages=C'
).
Créer le rôle et gérer l'accès#
Comme on travaille à la maison, on va se faciliter la vie et créer un rôle en base correspondant à notre utilisateur système (trouvable avec la commande whoami
pour que la commande reste générique) de façon à utiliser le mode d'authentification peer
:
De façon à ne pas stocker de mot de passe en clair dans les applications clientes comme QGIS et pour se faciliter la vie, on se crée un fichier .pgpass
dans le répertoire personnel de l'utilisateur :
Dans la foulée, on change les permissions de ce fichier .pgpass
pour en limiter les accès en lecture et écriture à l'utilisateur - sans quoi le fichier sera ignoré :
De même, de façon à garder la connexion la plus générique possible dans le but de rendre la suite le plus facilement reproductible possible, on stocke les paramètres de connexion dans le fichier PGSERVICE
(voir la doc officielle de PostgreSQL et celle de QGIS) :
- emplacement par défaut :
~/.pg_service.conf
(Linux) ou%APPDATA%/postgresql/.pg_service.conf
(Windows) - ou personnalisable via une variable d'environnement
PGSERVICEFILE
pointant sur le fichier directement (nommage libre) ouPGSYSCONFDIR
pointant sur le répertoire où trouver le fichier (qui doit forcément être nommépg_service.conf
)
pg_service_all_inclusive
Il est également possible de stocker directement le mot de passe dans le .pg_service.conf
pour se simplifier encore plus la vie, mais personnellement j'aime que les mots de passe soient dans un fichier séparé de façon à pouvoir diffuser mon .pg_service.conf
tranquillement.
Créer et configurer la base de données#
Créer la base de données que l'on nomme osm
:
S'y connecter pour tester puis ressortir :
Activer PostGIS :
Activer HSTore :
Installer les outils liés à OpenStreetMap#
C'est dans ces moments-là où on mesure combien le projet est remarquable à plus d'un titre. Au-delà de la dimension collaborative et de la base de données, c'est aussi tout l'outillage disponible et "naturellement" maintenu qui fait d'OSM une réussite incontournable de notre écosystème.
Installer osm2pgsql#
Afin d'importer les données OpenStreetMap dans PostgreSQL, on utilise osm2pgsql qui est un outil en ligne de commande maintenu par la communauté OSM. Pour l'installation, rien de plus simple pour Debian et dérivés comme Ubuntu :
Sur Windows, le tutoriel de LearnOSM est très bien !
- Oui, une question Joséphine ?
- Monsieur, il est en anglais votre tuto et dans plein d'autres langues sauf en Français !
- Mon ange, c'est une excellente remarque que vous faites là ! C'est justement l'occasion de vous proposer pour contribuer à la traduction de ce merveilleux support !
- Ah ouais, bonne idée, ça me fera un bon exercice pour travailler la version en anglais !
Faites chauffer DeepL et Transifex pour contribuer à LearnOSM
Installer osmium#
Là encore, tout est packagé comme il faut pour notre distribution préférée pour installer Osmium facilement :
Les données#
Télécharger OSM sur la Belgique#
Franchement on va pas se mentir : si Napoléon avait eu les données OpenStreetMap, on aurait moins de problèmes de borne (de frontières, pas de ministre) de nos jours !
Un petit tour par GeoFabrik pour télécharger les données de la Belgique : https://download.geofabrik.de/europe/belgium.html.
On peut également utiliser un outil en ligne de commande, par exemple wget
avec l'option -N
qui permet de télécharger uniquement si le fichier distant (ici le serveur GeoFabrik) est plus récent par rapport à la version locale (sur votre machine) :
Découper les données#
Si on craint de manquer d'espace disque, de puissance ou qu'on cible une zone restreinte en particulier, on peut découper les données avec une emprise avant de les importer avec un outil comme Osmium par exemple.
Et on découpe sur la zone qui nous intéresse, par exemple Bruxelles :
Importer des données#
La commande osm2pgsql semble facile mais il faut bien régler les options pour ne pas avoir d'erreur :
Détail des options :
--create
: créer les données, quitte à les écraser si elles existent déjà dans la base--database
: nom de la base de données--port
: port de connexion à la base de données--cache
: gère la taille du cache (en MB) à allouer pour l'import des noeuds OSM. Je pensais au début que la valeur par défaut (800) suffirait mais j'ai eu l'erreur : Node cache size is too small to fit all nodes. Please increase cache size. Dépend de la RAM de votre machine.--number-processes
: nom de processus à utiliser pour paralléliser les tâches qui peuvent l'être
Pour celles et ceux que ça intéresse, voici le détail de l'exécution sur mon ordinateur qui a pris 187 secondes :
Le détail de l'exécution sur ma machine
Se connecter à la base#
Maintenant que nos données sont bien au chaud dans la base, il est temps de s'y connecter et voir ce qu'elle a dans le ventre ! On peut déjà faire un petit listing des tables via la console psql
:
Pour s'y connecter avec QGIS, on va pouvoir tirer parti de notre configuration d'authentification à l'aide du fichier pg_service.conf. Ainsi, seul le nom du service (= le nom de section entre []
) est nécessaire :
Et voilà notre liste de tables :
Nettoyage#
Voici les commandes si vous souhaitez supprimer le cluster créé pendant le tutoriel. Attention, cela supprimera toutes les données donc à n'exécuter que si vous êtes certain/e de ne pas y tenir :
Auteur#
Julien Moura#
Géographe "sigiste" de formation, j'ai travaillé sur différentes thématiques et types de structures : gestion des déchets en milieu urbain à Madagascar, foncier d'intérêt général auprès de l'EPF de La Réunion, organisation et la résilience urbaine face aux risques naturels à Lima pour l'IRD, gouvernance et ouverture des données à Isogeo.
Je travaille désormais à Oslandia.
Féru des dynamiques de contributions, je participe activement à Geotribu depuis fin 2011.
Licence #
Ce contenu est sous licence Creative Commons International 4.0 BY-NC-SA, avec attribution et partage dans les mêmes conditions, sauf dans le cadre d'une utilisation commerciale.
Les médias d'illustration sont potentiellement soumis à d'autres conditions d'utilisation.
Détails
Vous êtes autorisé(e) à :
- Partager : copier, distribuer et communiquer le matériel par tous moyens et sous tous formats
- Adapter : remixer, transformer et créer à partir du matériel pour toute utilisation, exceptée commerciale.
Citer cet article :
"Importer des données OSM dans PostgreSQL" publié par Julien MOURA sur Geotribu sous CC BY-NC-SA - Source : https://static.geotribu.fr/articles/2022/2022-06-28_import-donnees-osm-postgresql-osm2pgsql-osmium/
Commentaires
Propulsé par Isso.
Ce contenu est sous licence Creative Commons BY-NC-SA 4.0 International