Bienvenidos a esta practica donde por medio de la programación en Python y contextualizando este aprendizaje en la estación Internacional espacial (ISS) realizaremos una practica sencilla, llevada paso a paso para nuestros alumnos.

Lo primero que haremos será contextualizar la actividad en el tema que vamos a tratar, asique…

Vamos a conocer la ISS

  • La Estación Espacial Internacional es una gran nave espacial en órbita alrededor de la Tierra. Sirve como hogar donde viven tripulaciones de astronautas y cosmonautas.
  • La estación espacial es también un laboratorio científico único. Varias naciones trabajaron juntas para construir y usar la estación espacial. La estación espacial está hecha de piezas ensambladas en el espacio por astronautas.
  • Orbita la Tierra a una altitud promedio de aproximadamente 250 millas. Viaja a 17.500 mph. Esto significa que orbita la Tierra cada 90 minutos.
  • La NASA está utilizando la estación espacial para aprender más sobre la vida y el trabajo en el espacio. Estas lecciones permitirán enviar a los humanos al espacio más lejos que nunca.

La primera pieza de la Estación Espacial Internacional se lanzó en noviembre de 1998. Un cohete ruso lanzó el módulo de control ruso Zarya (zar EE uh). Aproximadamente dos semanas después, el transbordador espacial Endeavour se encontró con Zarya en órbita. El transbordador espacial transportaba el nodo de la Unidad de Estados Unidos. La tripulación adjuntó el nodo Unity a Zarya.

La estación espacial tiene el volumen de una casa de cinco habitaciones o dos aviones Boeing 747. Es capaz de soportar una tripulación de seis personas, más visitantes. En la Tierra, la estación espacial pesaría casi un millón de libras. Medida desde los bordes de sus paneles solares, la estación cubre el área de un campo de fútbol. Incluye módulos de laboratorio de Estados Unidos, Rusia, Japón y Europa.

El Objetivo de nuestra práctica

El objetivo es estudiar algunos aspectos de la estación internacional a tiempo real usandon la programación y las consultas a herramientas externas.

Lo que haremos será contextualizar esta práctica en el ambito del espacio o directamente sobre la ISS (estación Internacional), para ello podemos usar la información aportada anteriormente en este documento. Una vez que nuestros alumnos conocen el contexto de la práctica, debemos marcar el objetivo que podemos conseguir usando la programación en Python.

Los objetivos serán 3:

  • Podremos localizar con exactitud donde se encuentra la ISS en cada momento.
  • Podremos saber cuantos astronautas van abordo de la ISS y sus nombres
  • Podremos saber cuando pasará exactamente por un lugar que nosotros le marquemos.

Para realizar este objetivo usaremos la web http://www.open-notify.org la cual tiene una API donde podemos obtener estos datos. Si lo alumnos no saben lo que es una API podemos explicarselo aquí https://www.xataka.com/basics/api-que-sirve Esta API nos devolverá los datos de respuesta en un formato llamado JSON¿Que es JSON?https://www.json.org/json-es.html Este formato JSON podremos gestionarlo perfectamente con Python como mostraremos más adelante.

El código de la practica (código completo al final del articulo)

Lo primero que debemos hacer es importar las librerias necesarias para realizar el ejercicio

  • urllib.request : para capturar datos desde una web
  • json : necesaria para tratar los datos que recibimos que en este caso vienen en formato json
  • folium : es una libreria de Python para dibujar mapas.

In [2]:

import urllib.request as url
import json
import folium

Lugar exacto de la ISS

  • Usando url.Request llamamos a la Web para obtener la coordenadas de la ISS en este momento. Esto lo haremos con las dos primeras lineas
  • Después leemos los datos en formato JSON usando el comando json.loads
  • Imprimimos los datos para verficarlos
ISS = url.Request("http://api.open-notify.org/iss-now.json")
response_ISS = url.urlopen(ISS)

ISS_obj = json.loads(response_ISS.read())

print (ISS_obj['iss_position']['latitude'])
print (ISS_obj['iss_position']['longitude'])
1599500006
48.3707
166.3623

Mapa

Para dibujar nuestro mapa con las corrdenadas obtenidas en el código anterior, usaremos la libreria folium. Primero guardaremos los datos de latitud y longitud en dos variables llamadas lat y longIn [4]:

long=ISS_obj['iss_position']['longitude']
lat=ISS_obj['iss_position']['latitude']

Dibujamos el mapa usando las variables anteriores (lat y long) y usamos las siguientes propiedades:

  • zoom_starter : Nivel de zoom para cargar la previsualización del mapa
  • tiles : Tipo de mapa, en este caso «Vista Satélite»
  • Icon : Le damos un color al icono que nos marcará la posición de la ISS
  • Marker : Ponemos el icono justo en esa posición y le colocamos la etiqueta (tooltip) de ISS
m = folium.Map(location=[lat,long],zoom_start=2,tiles='Stamen Terrain')
icon=folium.Icon(color="red")
folium.Marker([lat,long], tooltip="ISS",icon=icon).add_to(m)
m

Los astronautas

En esta segunda parte de la practica usaremos la API para conocer el número de astronautas abordo de la ISS y sus nombres

  • Usando url.Request llamamos a la Web para obtener el número de astronautas y sus nombres de la ISS en este momento. Esto lo haremos con las dos primeras lineas
  • Después leemos los datos en formato JSON usando el comando json.loads
  • Imprimimos el número de astronautas
astros = url.Request("http://api.open-notify.org/astros.json")
response_astros = url.urlopen(astros)

astros_obj = json.loads(response_astros.read())

print (astros_obj['number'])
3

Ahora procedemos a sacar los nombres de los astronautas. Estos nombres están en formato Lista que forma la variable people por ese motivo usamos el comando json.dumps Utilizamos las siguientes propiedades:

  • indent : Ponemos 3 para que marque un espacio de 3 en la sangría del margen
  • sort_keys : Para su ordenación
  • separators : Los caracteres de separación que usaremos entre la variable y el dato
astros_name = json.dumps(astros_obj, indent=3, sort_keys=True, separators =(". ", " = "))
print(astros_name)
{
   "message" = "success". 
   "number" = 3. 
   "people" = [
      {
         "craft" = "ISS". 
         "name" = "Chris Cassidy"
      }. 
      {
         "craft" = "ISS". 
         "name" = "Anatoly Ivanishin"
      }. 
      {
         "craft" = "ISS". 
         "name" = "Ivan Vagner"
      }
   ]
}

Mostrar los nombres de los astronautas usando un bucle

Para esto usamos un bucle FOR que nos permitirá sacar los datos de esa Lista de json e imprimirlos de uno en uno En la ultima linea del bucle introducimos los datos en un array de Python para poder usarlo si fuese necesario (no es el caso de esta actividad)In [9]:

astros_list=[]
for count,item in enumerate(astros_obj, start=0):
    print (astros_obj['people'][count]['name'])
    astros_list.append(astros_obj['people'][count]['name'])
Chris Cassidy
Anatoly Ivanishin
Ivan Vagner

ISS Predicción de Paso

En este ultimo punto de la practica lo que haremos es facilitar un lugar de la tierra por medio de las coordenadas y ver en que momento o fecha la ISS pasará cerca de ese punto.

Cargamos las librerias que nos hacen faltan para gestionar el tiempo y las fechas

from datetime import datetime, timezone

Usamos tres variables para mandarselas a nuestra API, ya que en esta ultima parte de la practica, nuestra consulta a la API necesita de valores para calcular la respuesta. En este caso los valores introducidos son:

  • Latitud y Longitud : Del lugar donde queremos hacer la predicción de paso de la ISS
  • n : Número de veces que queremos que nos diga en el paso por ese lugar
# Latitud y Logitud de la Ciudad de Madrid (usada como ejemplo)
latitud=40.4
longitud=-3.7
n=5 #número de veces que pasará la ISS
  • Usando url.Request llamamos a la Web para obtener la respuesta del paso de la ISS. Esto lo haremos con las dos primeras lineas
  • Es importante destacar que dentro de la petición de la Web introducimos las tres variables anteriormente mencionadas (latitud, longitud y n)
  • Después leemos los datos en formato JSON usando el comando json.loads
  • Imprimimos todos los datos, realmente la respuesta la obtenemos a partir de la variable response
Pass=url.Request('http://api.open-notify.org/iss-pass.json?lat={}&lon={}&n={}'.format(latitud,longitud,n))
response_Pass= url.urlopen(Pass)

Pass_obj = json.loads(response_Pass.read())

print (Pass_obj)
{'message': 'success', 'request': {'altitude': 100, 'datetime': 1599500116, 'latitude': 40.4, 'longitude': -3.7, 'passes': 5}, 'response': [{'duration': 431, 'risetime': 1599515475}, {'duration': 649, 'risetime': 1599521134}, {'duration': 614, 'risetime': 1599526972}, {'duration': 553, 'risetime': 1599532868}, {'duration': 597, 'risetime': 1599538715}]}

Finalmente usamos un bucle FOR para utilizar la misma estructura con la que hemos sacado los nombres de los astronautas.

En la ultima linea, imprimimos los datos convirtiendolos en fechas reales, ya que la API nos devuelve la fecha como risetimeIn [13]:

pass_list=[]
for count,item in enumerate(Pass_obj["response"], start=0):
    pass_list.append(Pass_obj['response'][count]['risetime'])
    print(datetime.fromtimestamp(pass_list[count]).strftime('%d-%m-%Y %H:%M:%S'))
07-09-2020 23:51:15
08-09-2020 01:25:34
08-09-2020 03:02:52
08-09-2020 04:41:08
08-09-2020 06:18:35