TD 1.1 : Où sommes-nous ?¶

Créer des coordonnées latitude et longitude d'après une adresse postale.¶

Vincent GODARD - V2 - 02/12/2022

Cours de SIG et analyse spatiale¶

Département de géographie - L3 - Université de Paris 8¶

Inspiré de :

  • How to Create Interactive Maps Using Python GeoPy and Plotly https://towardsdatascience.com/work-with-geospatial-data-and-create-interactive-maps-using-geopy-and-plotly-28178d2868f1

de

  • Clean Messy Address Data Effortlessly Using Geopy and Python https://towardsdatascience.com/transform-messy-address-into-clean-data-effortlessly-using-geopy-and-python-d3f726461225

de

  • Python’s geocoding — Convert a list of addresses into a map https://towardsdatascience.com/pythons-geocoding-convert-a-list-of-addresses-into-a-map-f522ef513fd6#c8f7

de

  • TP9 - Cartographie sous python https://fxjollois.github.io/cours-2016-2017/analyse-donnees-massives-tp9.html

et de

  • A Short Guide to Quick and Beautiful Interactive Maps in Folium https://medium.com/the-innovation/quick-and-beautiful-interactive-maps-in-folium-c6fd535c3d3b

Téléchargement des documents nécessaires :

Document Notebook à télécharger => ici.

1. Chargement des bibliothèques (packages)¶

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).

In [ ]:
# Pour installer folium et geopy, effacez le # (avant le "!").
#!pip install folium
#!pip install geopy
import geopy
import pandas as pd
import folium

2. Paramétrer une API de service de géocodage¶

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.

2.1 l'API d'OSM¶

In [ ]:
# OpenStreetMap API
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="Your@Email") # pensez à remplacer "Your@Email" par le vôtre !

2.2 l'API de Google¶

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/ !

In [ ]:
# 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

3. Extraction des coordonnées¶

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. 

3.1 Extraction des coordonnées géographiques à partir d'une adresse postale¶

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.

In [ ]:
# Adresse UP8
address_fac = '2, rue de la liberté, 93200 saint denis'
location = geolocator.geocode(address_fac)
print(location.latitude, location.longitude)

3.2 Extraction d'une adresse postale à partir des coordonnées géographiques¶

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é.

In [ ]:
# utilisation de la fonction geolocator.reverse
location = geolocator.reverse('48.870200138819065, 2.316582939868993')
print(location.address)

Chez qui sommes nous ?

4. Cartographie de l'adresse de l'université Paris 8 - Saint-Denis¶

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.

4.1 Appel du fond Leaflet¶

In [ ]:
# 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)
In [ ]:
# Si vous voulez voir l'objet UP8, il faut l'appeler (: !
UP8

4.2 Ajout d'un marqueur pointant sur l'université Paris 8¶

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 !

In [ ]:
# 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.

In [ ]:
# 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).

5. Enregistrement de la carte¶

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.

In [ ]:
# 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.

6. Sauriez-vous le faire seul·e ?¶

6.1 Recherchez les coordonnées géographiques de votre domicile¶

In [ ]:
# Collez et adaptez ici le script de géocodage

6.2 Cartographiez avec un pointeur les coordonnées géographiques de votre domicile¶

In [ ]:
# Collez et adaptez ici le script d'appel du fond Leaflet et du pointeur
In [ ]:
# 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.