Formateur 326,
géocodage via Nominatim (3)

Publié le 12 octobre 2020, par Richard Carlier
Série: Formateur 326
#geocodage #nominatim #OpenData #OpenStreetMap #python #sql

Cet épisode va traiter de ma dernière tentative pour affiner les latitudes/longitudes de nos organismes de formation.

Pour cela, je vais tenter de passer par l’API Nominatim.

Résumé de l’épisode 2 :

J’ai téléchargé la base BANO (Base d’Adresse Nationale Ouverte) de quelques 21 millions de lignes représentant la totalité des adresses postales de France avec leurs coordonnées géographiques.

Mais vu la qualité des données en ma possession, faire la jointure génère 58% de déchet…

On attaque l’API

Nominatim (du Latin, ‘par le nom’) est un outil permettant de chercher des données Open Street Map par leur nom et leur adresse, et d’en obtenir les latitude et longitude. Ce que l’on appelle le géocodage (l’inverse étant le géocodage inversé, précision importante…)

Utiliser la version en ligne avec interface web (donc traiter manuellement les adresses une par une) est bien pratique pour une recherche ponctuelle, mais je ne l’envisage pas pour 7058 adresses.

Installer la version locale est une option qui me tente, mais j’avoue que j’hésite pour le moment (si je me lance, j’en ferais un article ici même).

On va donc utiliser l’API, via un script python. Ok, nous sommes limité à une requête par seconde, ce qui va mobiliser le python pendant 2 heures… mais après tout, il tourne tout seul.

Tester l’API

Avec GeoPy, utiliser l’API est on ne peut plus simple:

Une fois passé les imports, on précise l’adresse à chercher, on instancie l’objet avec un RateLimiter en accord avec les limites de Nominatim, et on lance le géocodage (ligne 10). Si l’objet n’est pas None, on affiche:

Imparable.

Bien sûr, trop d’infos dans mon cas (même si je pourrais les stocker pour affiner ma base) puisque seule les coordonnées (lat et lon) m’intéresse…

Une table complète (enfin)

Quelques requêtes SQL et une boucle pour les traiter toutes une par une plus tard (sans oublier le db.commit sinon on recommence à zéro), j’obtiens la version finale de mon jeu de données:

Entre la méthode BANO et la Nominatim, presque 75% d’adresses sont géolocalisées. Vu la qualité des adresses d’origines, on est bien.

Utiliser la version Nominatim directement aurait sans doute conduit au même nombre, je le saurais pour la prochaine fois (quoiqu’un peu plus lente). A moins de checker à la main les éléments restant (pour le coup, peut être pour ceux qui sont proche de chez moi), on peut difficilement faire mieux.

J’ai suffisamment de matière pour analyser un peu ces organismes.

Dans l’épisode suivant…

Top