Vincent GODARD - V2 - 02/12/2022
Inspiré de :
de
de
de
et de
Document Notebook à télécharger => ici.
Dans le JupyterLab la bibliothèque Pandas est déjà installée mais pas la bibliothèque folium ni celle qui va permettre le géocodage sur les données OSM, geopy. Il faut les installer.
Il faut ensuite les charger (fonction import).
# Pour installer folium et geopy, effacez le # (avant le "!").
#!pip install folium
#!pip install geopy
import geopy
import pandas as pd
import folium
Nous n'utiliserons ici que le service de géocodage d'Open Street Map, Nominatim, qui est gratuit. Le plus connu est celui de Google, ici GoogleV3.
# OpenStreetMap API
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="Your@Email") # pensez à remplacer "Your@Email" par le vôtre !
Contrairement à l'API d'OSM, il vous faut une clef d'activation. Suivez les instructions ici pour en avoir une (gratuitement) => https://yoast.com/help/generate-set-google-maps-api-key/ !
# Google Maps API
from geopy.geocoders import GoogleV3
geolocator = GoogleV3(api_key='Your Google Maps API Key') # pensez à remplacer 'Your Google Maps API Key' par la vôtre
Il existe deux modes pour générer des coordonnées. Soit on part :
- des coordonnées postales pour obtenir des coordonnées géographiques ;
- des coordonnées géographiques pour obtenir des postales.
C'est la démarche de géocodage la plus fréquente. À savoir, partir d'une adresse postale, dans un annuaire (une base de données en chaîne de caractères), pour déterminer ses coordonnées géographiques à des fins d'analyse ou de représentation.
Le moteur d'extraction est très "sensible". S'il génère des erreurs ou pas de coordonnées, allez contrôler l'adresse sur le site d'OSM : https://www.openstreetmap.org/#map=6/46.449/2.210 avant de la resaisir ci-dessous.
# Adresse UP8
address_fac = '2, rue de la liberté, 93200 saint denis'
location = geolocator.geocode(address_fac)
print(location.latitude, location.longitude)
C'est le géocodage inverse, ou rétro-géocodage. Celle qui fournira une adresse plus "parlante" que les seules coordonnées géographiques en milieu urbanisé.
# utilisation de la fonction geolocator.reverse
location = geolocator.reverse('48.870200138819065, 2.316582939868993')
print(location.address)
Chez qui sommes nous ?
Le module folium sert d'interface entre python et la librairie leaflet. Il permet de se centrer et d'afficher une carte avec un niveau de zoom. Les coordonnées à indiquer sont, en degrés décimaux, celles de la fac.
Dans un deuxième temps, il faudra ajouter un marqueur pour faciliter la lecture.
# Remplacer les coordonnées lat, long calculées précédemment
lat = 48.944116
long = 2.365053
UP8 = folium.Map(location = [lat, long], zoom_start = 16)
# Si vous voulez voir l'objet UP8, il faut l'appeler (: !
UP8
La superposition d'un marqueur facilite le repérage. Celui-ci peut contenir des informations sous la forme d'une fenêtre contextuelle (pop-up window).
Informations qui apparaissent comme dans Google Map, lorsqu'on clique sur le marqueur.
Les trois informations de base sont : la position du marqueur (coordonnées lat et long) ; puis ce qui doit apparaître quand on clique dessus et enfin, l'action d'ajout à la carte pour le voir en superposition !
# Remplacer les coordonnées lat, long calculées précédemment.
lat = 48.944116
long = 2.365053
folium.Marker([lat, long], popup = "Université de Paris 8 - Saint-Denis").add_to(UP8)
UP8
On constatera que la position du marqueur n'est pas satisfaisante. Il est possible de la retravailler en jouant sur les décimales pour le ramener vers le NW de son actuel position.
Je vous propose plutôt de faire un marqueur pour le département de géographie de Paris 8.
Pour cela, il faut récupérer les coordonnées géographiques du bâtiment D et modifier le texte du menu contextuel comme suit.
# Remplacer les coordonnées lat, long par celles du bâtiment D qui héberge le département de géographie de Paris 8.
lat = 48.947195
long = 2.361883
folium.Marker([lat, long], popup = "Département de géographie, Université de Paris 8 - Saint-Denis").add_to(UP8)
UP8
Si vous faites plusieurs tentatives, les marqueurs successifs vont s'empiler ! Pour les effacer, il faut remonter à la première carte, puis, successivement, les effacer (dans un Notebook en allant dans le menu Cell/Current Outputs/Clear).
Vous pouvez être tenté d'enregistrer votre Carte.
Une des solutions est d'en faire un fichier html pour l'afficher dans votre navigateur par un simple clic.
# pour enregistrer votre composition cartographique dans votre répertoire de travail :
UP8.save('dep_geo_P8.html')
Vous avez maintenant une composition cartographique (marqueur + fond Leaflet). Vous pouvez "customiser" l'ensemble en consultant les informations relatives aux marqueurs (https://python-visualization.github.io/folium/) ou à Leaflet (https://leafletjs.com/) la bibliothèque JavaScript open source qui permet de faire des cartes interactives même une fois exporter en html.
# Collez et adaptez ici le script de géocodage
# Collez et adaptez ici le script d'appel du fond Leaflet et du pointeur
# Collez et adaptez ici le script pour enregistrer votre carte au format html
On verra dans un prochain TD comment représenter plusieurs points à partir d'un fichier et calculer la distance entre deux points, voire entre plusieurs.