NSI 2022-2023: découverte du module folium et API

1. Mise en place

Créer un dossier TP_folium et enregistrer dans ce dossier le fichier python avec le code ci-dessous :

# on importe le module folium
import folium
# on définit un point géographique par ses coordonnées
# longitude et lattitude
coords = (48.8398094,2.5840685)
# on crée une carte centrée sur ce point géographique
map = folium.Map(location=coords, tiles='OpenStreetMap', zoom_start=5)
# on considère un nouveau point
coords = (48.8490591,2.577023)
# on ajoute un marqueur correspondant à ce point sur la carte
folium.Marker(location=coords, popup = "MacDo").add_to(map)
# on considère un nouveau point
coords = (48,2.57)
# on ajoute un marqueur correspondant à ce point sur la carte
folium.Marker(location=coords, popup = "MacDo").add_to(map)
# on sauvegarde la carte dans notre dossier sous la forme
# d'un fichier html
map.save(outfile='map.html')

On utilise dans de ce tp le module python folium :
https://python-visualization.github.io/folium/
Si ce module n’est pas installé , installer le avec la commande :
pip install folium

Tester votre programme et consulter votre dossier TP_folium, ce programme python a permis la création d’un fichier html. Ouvrez ce fichier dans votre navigateur favori.

Exercice 1 : Modifier votre programme pour afficher une carte centrée sur Lille permettant d’afficher la position du Lycée Faidherbe.

On désire à présent utiliser ce module pour afficher la position survolée par la station spatiale internationale ISS en temps réel.

Station Spatiale Internationale

2. Récupérer des informations sur ISS via une requête serveur

On va à présent utiliser la bibliothèque request : https://requests-fr.readthedocs.io/en/latest/user/quickstart.html
Cette bibliothèque permet d’effectuer simplement des échanges de requêtes http en particulier avec une API.

En informatique, une interface de programmation d’application ou interface de programmation applicative (souvent désignée par le terme API pour Application Programming Interface) est un ensemble normalisé de classes, de méthodes, de fonctions et de constantes qui sert de façade par laquelle un logiciel offre des services à d’autres logiciels. Elle est offerte par une bibliothèque logicielle ou un service web, le plus souvent accompagnée d’une description qui spécifie comment des programmes consommateurs peuvent se servir des fonctionnalités du programme fournisseur.

https://fr.wikipedia.org/wiki/Interface_de_programmation

Pour obtenir les renseignements nécessaires sur l’ISS, on va utiliser l’API :
http://api.open-notify.org/
Cette API nous donne au format JSON différents renseignements sur la station spatiale internationale.

JavaScript Object Notation (JSON) est un format de données textuelles dérivé de la notation des objets du langage JavaScript. Il permet de représenter de l’information structurée comme le permet XML par exemple

https://fr.wikipedia.org/wiki/JavaScript_Object_Notation

Modifier le programme précédent en :


import requests
import folium


donnees_ISS = requests.get('http://api.open-notify.org/iss-now.json').json()

Exécuter le programme.

Exercice 2 :
1. Après avoir exécuté le programme, déterminer à l’aide de commandes en console le type de la variable donnees_ISS et son contenu.
2. Modifier votre programme pour afficher à l’aide de folium la zone géographique survolée par ISS.
On pourra avoir besoin d’utiliser la méthode float qui permet de transformer une chaîne de caractères en un flottant.

Exercice 3 :
Modifier votre programme pour afficher les différentes positions survolées par ISS à différents instants.
On pourra pour cela utiliser la bibliothèque time et la méthode time.sleep(mon_temps).
On peut aussi compléter le programme ci-dessous en reprenant ce qui a été fait auparavant.

import requests
import folium
import time

# on définit et positionne la carte


# on crée une fonction qui va ajouter à la carte les différentes positions de l'ISS
def trajectoire(nbre_positions,temps_en_secondes):
# on récupère la carte comme variable globale
    global ma_carte
# on définit un tuple qui contiendra les différentes positions
    positions=()
    for i in range(nbre_positions):
# on récupère la position de l'ISS et on l'ajoute aux positions
# on ajoute un marqueur relatif à la position à la carte
        
# on utilise la méthode sleep de time pour faire une pause
        time.sleep(temps_en_secondes)
# on ajoute une ligne qui relie les différentes positions afin 
# d'afficher la trajectoire de la station
    folium.PolyLine(positions).add_to(ma_carte)
    return
# on appelle la fonction pour afficher 10 positions séparées par 6 secondes
trajectoire(10,6)
# on sauvegarde la carte
ma_carte.save(outfile='map.html')

Pour préparer le tp prochain :
On désire afficher sur une carte les stations V’Lille ayant encore des vélos disponibles à partir des données figurant sur la page :
https://opendata.lillemetropole.fr/explore/dataset/vlille-realtime/export/

En vous inspirant de ce qui a été fait pour la station ISS, créer un programme permettant d’afficher les stations ayant encore des vélos disponibles ou des places disponibles.

Proposition de Correction :

import requests
import folium
import time

# on définit et positionne la carte
donnees_ISS = requests.get('http://api.open-notify.org/iss-now.json').json()
longitude=donnees_ISS['iss_position']['longitude']
latitude=donnees_ISS['iss_position']['latitude']
coords = (longitude,latitude)
# on crée une carte centrée sur ce point géographique
ma_carte = folium.Map(location=coords, tiles='OpenStreetMap', zoom_start=5)
# on crée une fonction qui va ajouter à la carte les différentes positions de l'ISS
def trajectoire(nbre_positions,temps_en_secondes):
# on récupère la carte comme variable globale
    global ma_carte
# on définit un tuple qui contiendra les différentes positions
    positions=()
    for i in range(nbre_positions):
    # on récupère la position de l'ISS et on l'ajoute aux positions
        donnees_ISS = requests.get('http://api.open-notify.org/iss-now.json').json()
        longitude=donnees_ISS['iss_position']['longitude']
        latitude=donnees_ISS['iss_position']['latitude']
        coords = (longitude,latitude)
        positions+=coords
    # on ajoute un marqueur relatif à la position à la carte
        folium.Marker(location=coords, popup = "MacDo").add_to(ma_carte)
# on utilise la méthode sleep de time pour faire une pause
        time.sleep(temps_en_secondes)
# on ajoute une ligne qui relie les différentes positions afin 
# d'afficher la trajectoire de la station
    folium.PolyLine(positions).add_to(ma_carte)
    return
# on appelle la fonction pour afficher 10 positions séparées par 6 secondes
trajectoire(10,3)
# on sauvegarde la carte

ma_carte.save(outfile='map.html')