Basado en el proyecto de la rapsberry pi org ¿Where is the Space Station?
Introducción.
Instrucciones.
¿Quién está en el espacio?
{
"message": "success",
"people": [
{
"name": "Jasmin Moghbeli",
"craft": "ISS"
},
{
"name": "Andreas Mogensen",
"craft": "ISS"
},
{
"name": "Satoshi Furukawa",
"craft": "ISS"
},
{
"name": "Konstantin Borisov",
"craft": "ISS"
},
{
"name": "Oleg Kononenko",
"craft": "ISS"
},
{
"name": "Nikolai Chub",
"craft": "ISS"
},
{
"name": "Loral O'Hara",
"craft": "ISS"
}
],
"number": 7
}
Los datos cambian continuamente, así que seguramente si estás consultando este post verás algo diferente. El formato en el que recibimos los datos se denomina "JSON". Se parecen bastante a los diccionario en Python, aunque ojo que no son iguales.
Vamos a construir un script de Python para poder usar esos datos.
Empieza creando un archivo de python y llámalo como quieras.
Lo primero que haremos es importar las librerías que necesitaremos para nuestro proyecto que son urllib.request, json y turtle
Ahora copia el siguiente código:
""" ¿Donde está la Estación Espacial Internacional? """
import urllib.request
import json
import turtle
# http://open-notify.org/Open-Notify-API/
url = 'http://api.open-notify.org/astros.json'
respuesta = urllib.request.urlopen(url)
astronautas = json.loads(respuesta.read())
print(astronautas)
Salida:
{'message': 'success', 'people': [{'name': 'Jasmin Moghbeli', 'craft': 'ISS'}, {'name': 'Andreas Mogensen', 'craft': 'ISS'}, {'name': 'Satoshi Furukawa', 'craft': 'ISS'}, {'name': 'Konstantin Borisov', 'craft': 'ISS'}, {'name': 'Oleg Kononenko', 'craft': 'ISS'}, {'name': 'Nikolai Chub', 'craft': 'ISS'}, {'name': "Loral O'Hara", 'craft': 'ISS'}], 'number': 7}
Este código utiliza la API (servicio web) de Open Notify para obtener información sobre la Estación Espacial Internacional (ISS, por sus siglas en inglés) y los astronautas que se encuentran en ella en ese momento. Vamos a ver como funciona.
1. `import urllib.request`: Importa el módulo `urllib.request`, que se utiliza para abrir y leer URL.
2. `import json`: Importa el módulo `json`, que se utiliza para trabajar con datos en formato JSON (JavaScript Object Notation).
3. `import turtle`: Importa el módulo `turtle`, que se utiliza para crear gráficos mediante programación.
4. `url = 'http://api.open-notify.org/astros.json'`: Define la URL de la API de Open Notify que proporciona información sobre los astronautas que se encuentran en la Estación Espacial Internacional en ese momento.
5. `respuesta = urllib.request.urlopen(url)`: Abre la URL definida anteriormente y almacena la respuesta en la variable `respuesta`. Es un objeto de Python.
6. `astronautas = json.loads(respuesta.read())`: Lee el contenido de la respuesta HTTP y lo carga como un objeto Python utilizando la función `loads` del módulo `json`. Esto convierte los datos JSON en un diccionario de Python, que se almacena en la variable `astronautas`.
7. `print(astronautas)`: Imprime en la consola el diccionario de Python que contiene la información sobre los astronautas en la ISS.
El diccionario astronautas, como puedes ver, tiene tres claves: message, people y number.
La clave message tiene el valor success lo que nos está diciendo que accedimos correctamente a la información del servicio web. Ten en cuenta que tu verás diferentes valores para la clave people y number dependiendo de quien esté actualmente en el espacio.
""" ¿Donde está la Estación Espacial Internacional? """ import urllib.request import json import turtle # http://open-notify.org/Open-Notify-API/ url = 'http://api.open-notify.org/astros.json' respuesta = urllib.request.urlopen(url) astronautas = json.loads(respuesta.read()) print(f"Número actual de astronautas: {astronautas['number']}") for persona in astronautas['people']: print(persona['name'])
Número actual de astronautas: 7
Jasmin Moghbeli
Andreas Mogensen
Satoshi Furukawa
Konstantin Borisov
Oleg Kononenko
Nikolai Chub
Loral O'Hara
Número actual de astronautas: 7
Jasmin Moghbeli está en ISS
Andreas Mogensen está en ISS
Satoshi Furukawa está en ISS
Konstantin Borisov está en ISS
Oleg Kononenko está en ISS
Nikolai Chub está en ISS
Loral O'Hara está en ISS
¿Dónde está la ISS?
{ "iss_position": { "longitude": "55.8408", "latitude": "4.2601" }, "message": "success", "timestamp": 1711653120 }
#...
url = 'http://api.open-notify.org/iss-now.json'
respuesta = urllib.request.urlopen(url)
iss_posicion = json.loads(respuesta.read())
print(iss_posicion)
{'iss_position': {'longitude': '67.5407', 'latitude': '-36.2401'},
'message': 'success',
'timestamp': 1711659534}
""" ¿Donde está la Estación Espacial Internacional? """
import urllib.request
import json
import turtle
# http://open-notify.org/Open-Notify-API/
url = 'http://api.open-notify.org/astros.json'
respuesta = urllib.request.urlopen(url)
astronautas = json.loads(respuesta.read())
print(f"Número actual de astronautas: {astronautas['number']}")
for persona in astronautas['people']:
print(f"{persona['name']} está en {persona['craft']}")
url = 'http://api.open-notify.org/iss-now.json'
respuesta = urllib.request.urlopen(url)
iss_posicion = json.loads(respuesta.read())
coordenadas = iss_posicion['iss_position']
lat = float(coordenadas['latitude'])
long = float(coordenadas['longitude'])
print(f"Latitud: {lat}, Longitud: {long}")
Posicionando la ISS en un mapa.
# image source:
# map.jpg: https://visibleearth.nasa.gov/view.php?id=57752 Credit: NASA
screen = turtle.Screen()
screen.setup(720, 360)
# map.jpg: https://visibleearth.nasa.gov/view.php?id=57752 Credit: NASA
screen = turtle.Screen()
screen.setup(720, 360)
screen.setworldcoordinates(-180, -90, 180, 90)
screen.bgpic('map.gif')
iss.penup()
iss.goto(long, lat)
""" ¿Donde está la Estación Espacial Internacional? """
import urllib.request
import json
import turtle
# http://open-notify.org/Open-Notify-API/
url = 'http://api.open-notify.org/astros.json'
respuesta = urllib.request.urlopen(url)
astronautas = json.loads(respuesta.read())
print(f"Número actual de astronautas: {astronautas['number']}")
for persona in astronautas['people']:
print(f"{persona['name']} está en {persona['craft']}")
url = 'http://api.open-notify.org/iss-now.json'
respuesta = urllib.request.urlopen(url)
iss_posicion = json.loads(respuesta.read())
coordenadas = iss_posicion['iss_position']
lat = float(coordenadas['latitude'])
long = float(coordenadas['longitude'])
print(f"Latitud: {lat}, Longitud: {long}")
# map.jpg: https://visibleearth.nasa.gov/view.php?id=57752 Credit: NASA
screen = turtle.Screen()
screen.setup(720, 360)
screen.setworldcoordinates(-180, -90, 180, 90)
screen.bgpic('map.gif')
screen.register_shape('station.gif')
iss = turtle.Turtle()
iss.shape('station.gif')
# iss.setheading(90) La tortuga mira a la derecha por defecto.
iss.penup()
iss.goto(long, lat)
Añadiendo datos al mapa.
Escribiendo texto con turtle.
turtle.write('¡Hola!')
turtle.color('deep pink')
turtle.write('¡Hola!')
estilo = ('Courier', 30, 'italic')
turtle.write('Hello!', font=estilo, align='center')
- El nombre de la fuente: "Arial", "Courier" o "Times New Roman".
- El tamaño de la fuente en pixeles.
- El tipo de fuente: "normal", "bold" o"italic".
La ISS en movimiento.
>>> r
<RESPONSE [200]>
import requests
url = "https://www.raspberrypi.org"
r = requests.get(url)
data = r.text
import requests
url = "https://www.raspberrypi.org"
r = requests.get(url)
data = r.json()
"""¿Donde está la Estación Espacial Internacional?."""
import requests
import turtle
import time
# http://open-notify.org/Open-Notify-API/
URL = 'http://api.open-notify.org/astros.json'
with requests.get(URL) as respuesta:
print(respuesta)
print(respuesta.text) # en formato json
astronautas = respuesta.json() # en formato diccionario
print(astronautas)
print(f"Número actual de astronautas: {astronautas['number']}")
for persona in astronautas['people']:
print(f"{persona['name']} está en {persona['craft']}")
# map.jpg: https://visibleearth.nasa.gov/view.php?id=57752 Credit: NASA
screen = turtle.Screen()
screen.setup(720, 360)
screen.setworldcoordinates(-180, -90, 180, 90)
screen.bgpic('map.gif')
screen.register_shape('station.gif')
iss = turtle.Turtle()
iss.shape('station.gif')
# iss.setheading(90) La tortuga mira a la derecha por defecto
iss.penup()
screen.colormode(255)
iss.pencolor(255,255,0)
while True:
URL = 'http://api.open-notify.org/iss-now.json'
with requests.get(URL) as respuesta:
iss_posicion = respuesta.json()
coordenadas = iss_posicion['iss_position']
lat = float(coordenadas['latitude'])
long = float(coordenadas['longitude'])
print(f"Latitud: {lat}, Longitud: {long}")
iss.goto(long, lat)
iss.pendown()
time.sleep(5)
Capturando los datos de vuelo de la ISS.
"""¿Donde está la Estación Espacial Internacional?.""" import requests import turtle import time import csv # http://open-notify.org/Open-Notify-API/ URL = 'http://api.open-notify.org/astros.json' with requests.get(URL) as respuesta: print(respuesta) print(respuesta.text) # en formato json astronautas = respuesta.json() # en formato diccionario print(astronautas) print(f"Número actual de astronautas: {astronautas['number']}") for persona in astronautas['people']: print(f"{persona['name']} está en {persona['craft']}") # map.jpg: https://visibleearth.nasa.gov/view.php?id=57752 Credit: NASA screen = turtle.Screen() screen.setup(720, 360) screen.setworldcoordinates(-180, -90, 180, 90) screen.bgpic('map.gif') screen.register_shape('station.gif') iss = turtle.Turtle() iss.shape('station.gif') # iss.setheading(90) La tortuga mira a la derecha por defecto iss.penup() screen.colormode(255) iss.pencolor(255,255,0) # contador para guardar la long y latitud contador = 0 while True: contador += 1 URL = 'http://api.open-notify.org/iss-now.json' with requests.get(URL) as respuesta: iss_posicion = respuesta.json() coordenadas = iss_posicion['iss_position'] lat = float(coordenadas['latitude']) long = float(coordenadas['longitude']) print(f"Latitud: {lat}, Longitud: {long}") iss.goto(long, lat) iss.pendown() # Escribimos los datos en un archivo csv with open('ejemplo.csv', 'a') as file: datos_a_escribir = csv.writer(file) datos_a_escribir.writerow([lat, long]) time.sleep(5) # La ISS tarda aproximadamente 91 minutos en dar # una vuelta a la tiera. 91*12 = 1092 # Si los datos se toman cada 5 segundos hay que guardar # 60 : 5 = 12 veces cada minuto. if contador == 1092: break
-51.1014,142.0155
-51.0416,142.5997
-50.9841,143.1338
-50.9295,143.6179
-50.8669,144.1493
-50.8017,144.679
-50.7339,145.2071
-50.6635,145.7336
-50.5973,146.2108
...
import csv from math import radians, sin, cos, sqrt, atan2 # Función para calcular la distancia entre dos puntos en la superficie de la Tierra def calcular_distancia(lat1, lon1, lat2, lon2): # Radio de la Tierra en kilómetros radio_tierra = 6371.0 # Convertir coordenadas de grados a radianes lat1 = radians(lat1) lon1 = radians(lon1) lat2 = radians(lat2) lon2 = radians(lon2) # Diferencia de latitud y longitud dlat = lat2 - lat1 dlon = lon2 - lon1 # Fórmula de Haversine a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2 c = 2 * atan2(sqrt(a), sqrt(1 - a)) # Distancia entre los dos puntos distancia = radio_tierra * c return distancia # Coordenadas y tiempo with open('ejemplo.csv', 'r') as file: datos = csv.reader(file) coordenadas = [] for dato in datos: dato_x, dato_y = dato # convertimos las cadenas en numeros dato_x = float(dato_x) dato_y = float(dato_y) coordenadas.append((dato_x,dato_y)) # coordenadas = [ # (-40.2785, 56.2131), # (-40.4843, 56.5698), # # Insertamos nuestras coordenadas reales de esta forma. # ] tiempo_por_punto = 5 # segundos # Calcular la velocidad promedio distancias = [] for i in range(1, len(coordenadas)): lat1, lon1 = coordenadas[i - 1] lat2, lon2 = coordenadas[i] distancia = calcular_distancia(lat1, lon1, lat2, lon2) distancias.append(distancia) # Calcular la velocidad promedio velocidades = [distancia / tiempo_por_punto for distancia in distancias] velocidad_promedio = sum(velocidades) / len(velocidades) print("La velocidad promedio del satélite es:", velocidad_promedio, "km/s")
No hay comentarios:
Publicar un comentario