Formateur 326,
on affine la géolocalisation (2)
Publié le 2 octobre 2020, par Richard Carlier
Série: Formateur 326
#formation #OpenData #OpenStreetMap #python #sql
Dans l’épisode précédent, j’ai préparé les données des organismes de formation, en fusionnant plusieurs tables.
Mais utiliser la latitude/longitude des centres villes me parait par trop approximatif (tous les centres de formations de Paris sont, par exemple, regroupé en un point par arrondissement…)
On va donc tenter d’affiner…
Résumé de l’épisode 1
J’ai récupéré la liste des organismes de formation de France, filtré sur le code activité 326 qui m’intéresse, fusionné avec la table SIRENE pour récupérer les adresses postales, et ajouter via une table de ville les latitudes/longitudes des centres villes.
La carte de la version 1 manque un peu de précision
Pistes d’améliorations
A ce stade, plusieurs options s’offrent à moi…
- Me contenter de ce piètre résultat
- Envisager 12.337 appels vers une API de géocodage, genre Nominatim d’Open Street Map
- Télécharger l’intégralité de toutes les adresses de France, déjà géocodée, et travailler en local…
La première option ne me parait pas acceptable par principe. J’y retournerais si les précédentes ne fonctionnent pas.
La seconde est intéressante, mais risque d’être lente. Entre autre pour des raisons de qualité réseau, et sans doute de limitation du nombre de requêtes par minutes…
On va donc tenter la dernière. Qui me parait intéressante à plusieurs titre, entre autre de pouvoir réutiliser le principe pour tous les projets à venir. Envisager, en quelque sorte, de me faire ma propre API de géocodage locale…
Encore de la data…
Mon point de départ va donc être la Base d’Adresses Nationale Ouverte – BANO qui est un jeu de données constitué de plus de 21.158.298 adresses et provient du projet de Base d’Adresses Nationale Ouverte initié par OpenStreetMap France.
Oui, 21.158.298 d’adresses, 1,6 Go environ pour le fichier brut…
Après import dans MySQL et ajout d’index pour accélérer les requêtes au maximum (et on passe à presque 10 Go), nous voici avec une jolie table. Extrait:
Les explications des différents champs se trouvent sur le site de Bano, mais ils sont assez lisible…
Montrez moi la voie…
Il va falloir faire coïncider avec ceci (et pouvoir remplir les champs osm_lat et osm_lng…) :
Autant dire que ce n’est pas gagné. C’est bien entendu la voie qui va coincer, le code postal étant normalisé, pas utile de se pencher sur la ville.
Si OSM utilise une version lisible, la base SIRENE n’utilise que des majuscules, sans accent… Les numéros de voies ont de multiples versions (avenue, av, av. et autre dans OSM, mais assez précis dans SIRENE), sans parler des suffixes (bis, ter…) qui sont dans le numéro pour OSM et séparés pour l’autre.
La table SIRENE semble opter pour la concision au niveau des noms de voies…
J’ajoute donc un champs à ma table osm_bano, qui sera une concaténation des champs numéro, voie et code postal, mis en majuscule, sans accents, et en remplaçant les noms de voies longs par leurs versions courtes…
Si les requêtes pour faire les jointures ne sont pas trop difficiles à écrire, les temps de traitement pour expérimenter sont pénibles… mais ça tourne tout seul, et on peut faire autre chose en parallèle…
Rien que sur la ville de Colombes, sur les 22 organismes de formation, mes jointures n’arrivent à n’en faire coïncider que 14 en environ 1 min 38…
Par contre, le résultat est encourageant :
A gauche, les 22 points sont empilés au centre de Colombes (situé, cocassement, sur le cimetière Gabriel Péri…). A droite, 10 organismes sont empilés au cimetière, mais les autres sont plus réalistement répartis… Je crois même que celui le plus au Sud Ouest, c’est moi !
On se lance !
Le processeur de la machine chauffe. Je quitte Colombes et j’applique la procédure à l’ensemble de la base.
Après un moment, le bilan tombe : sur les 12.337 organismes de formation, mon système a affiné la géolocalisation pour 5.279 d’entre eux. Et donc 7.058 toujours inconnus… 58% de déchet, globalement répartis sur tous le territoire…
N’empêche, la carte s’affine quand même un peu:
A gauche la carte de base, les organismes sont centrés sur chaque arrondissement ; à droite les points sont plus proches de la réalité (à 42% près)…
Il va donc falloir, pour ces exclus, tenter des appels API sur Nominatim…
A suivre !