Blog Fabdev

Visualiser la station spatiale internationale en temps réel

By Valentin Balivet / Mathieu Soul

La Station Spatiale Internationale (ISS) est un gigantesque laboratoire scientifique en orbite autour de la Terre.
Elle abrite 6 membres d'équipage qui ont pour mission de réaliser des expériences qui ne peuvent être faites que dans l'espace (traitement contre le cancer, recherche de matière noire, potager dans l'espace ... liste exhaustive des expériences ici).
L'ISS fait 16 fois le tour du monde en 24h (8km par seconde) donc difficile de savoir où elle se trouve à un instant donné... Du coup on vous propose de réaliser un petit code qui devrait vous permettre tracer en temps réel sa position grâce à l'API People In Space.


Trajet temps réel de l'ISS

Commençons par obtenir la position courante de l'ISS. Pour cela, on utilise la librairie requests, qui premet de requêter facilement des API en Python. Grâce aux informations disponibles sur la documentation de l'API, on apprend qu'il suffit de requêter l'adresse suivante: http://api.open-notify.org/iss-now.json.

import requests

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

La requête renvoie un fichier JSON de la forme suivante:

{
'timestamp': 1539683585,
'iss_position':
      {'latitude': '-51.5658',
      'longitude': '-132.0373'},
'message': 'success'
}

Ces informations correspondent à la latitude et la longitude de la station au moment où la requête a été faite.


latitude = json_file['iss_position']['latitude']
longitude = json_file['iss_position']['longitude']
          

Pour visualiser le point sur une carte, nous allons utiliser la librairie folium. Folium permet de tracer des formes géométriques géolocalisées facilement.
On instancie une carte avec la commande .Map, en lui fournissant :

  • Un point sur lequel centrer la carte
  • Un zoom initial
On ajoute ensuite un marqueur sur la carte à l'aide de la méthode folium.Marker([latitude, longitude]).add_to(m).

import folium 
point_coordinates = [float(latitude), float(longitude)]
map = folium.Map([point_coordinates], zoom_start=5)
folium.Marker([float(latitude), float(longitude)]).add_to(m)
print(map)

Maintenant pour tracer la position de l'ISS à chaque instant, il suffit de requêter l'API de façon continue. La fonction ci-dessous prend en paramètres le nombre de points, et le temps attendu entre chaque point.
Pour faire attendre l'algorithme, on utilise une librairie de base de Python appelée time. Sa méthode time.sleep() permet de mettre en pause le déroulement de la boucle.

import time
def trace_ISS(number_of_points, wait_time) :
    points = []
    for i in range(number_of_points):
        position = requests.get('http://api.open-notify.org/iss-now.json').json()
        latitude = position['iss_position']['latitude']
        longitude = position['iss_position']['longitude']
        points.append([float(latitude), float(longitude)])
        map = folium.Map([point_coordinates], zoom_start=5)
        folium.Marker([float(latitude), float(longitude)]).add_to(m)
        print(map)
        time.sleep(wait_time)

Un dernier raffinement possible : la méthode ci-dessous enregistre tous les passages de l'ISS dans une variable points. Si l'on souhaite relier les points entre eux, on peut le faire grâce à la méthode folium.PolyLine.


folium.PolyLine(points).add_to(map)
print(map)