El propósito de esta entrada es realizar una representación gráfica de las posiciones, en una fecha actual, de la constelación de satélites Starlink lanzados por la compañía SpaceX, para proporcionar acceso por internet a amplias zonas del planeta.
# Importación de librerías
import plotly.graph_objects as go
import plotly.io as pio
import pandas as pd
from skyfield.api import Loader
load = Loader('./Datos')
activos_url = 'http://celestrak.com/NORAD/elements/active.txt'
sats = load.tle_file(activos_url)
print('Cargados', len(sats), 'satélites')
Cargados 4165 satélites
Ahora reduciré la lista anterior seleccionando solo los satélites cuyo nombre comienza por "STARLINK":
starlinks = []
for s in sats:
if s.name[0:8] == 'STARLINK':
starlinks.append(s)
len(starlinks)
1429
Es decir, a fecha de hoy (10 de Mayo, 2021), y según la web de Celestrak hay en órbita 1429 satélites Starlink activos.
El paso siguiente va a ser construir una serie de listas que contendrán la información que nos interesa de cada uno de estos satélites:
starlinks_n = [s.name for s in starlinks] # Lista con los nombres de los satélites
starlinks_e = [s.epoch.utc_iso() for s in starlinks] # Lista con los "epoch" de los datos (TLE)
# fecha de hoy para tener la posición de todos los satélites en la misma fecha
ts = load.timescale()
hoy = ts.utc(2021, 5, 10)
# Coordenadas x, y, z de cada satélite en km en la fecha de hoy
starlinks_x = [s.at(hoy).position.km[0] for s in starlinks]
starlinks_y = [s.at(hoy).position.km[1] for s in starlinks]
starlinks_z = [s.at(hoy).position.km[2] for s in starlinks]
Con estas listas vamos a crear un dataframe de Pandas, lo que facilitará la construcción del gráfico con la librería Plotly:
df = pd.DataFrame(
{'Nombre': starlinks_n,
'Epoch': starlinks_e,
'x': starlinks_x,
'y' : starlinks_y,
'z' : starlinks_z}
)
Se pueden examinar los primeros y últimos registros de este DataFrame para comprobar que ha sido construido correctamente:
df.head()
Nombre | Epoch | x | y | z | |
---|---|---|---|---|---|
0 | STARLINK-61 | 2021-05-10T04:02:23Z | 3839.428357 | -5323.109794 | 2068.889237 |
1 | STARLINK-71 | 2021-05-10T08:53:26Z | 4020.264215 | -4039.770870 | 3864.679961 |
2 | STARLINK-43 | 2021-05-10T04:02:43Z | -4707.691410 | -3751.479374 | 3194.294125 |
3 | STARLINK-64 | 2021-05-10T09:41:31Z | -817.425878 | -6187.564658 | -2385.929254 |
4 | STARLINK-68 | 2021-05-10T03:29:21Z | 2159.869495 | -3798.847979 | -5091.650109 |
df.tail()
Nombre | Epoch | x | y | z | |
---|---|---|---|---|---|
1424 | STARLINK-2514 | 2021-05-10T04:00:01Z | -3768.050684 | 5303.554782 | 1608.538739 |
1425 | STARLINK-2511 | 2021-05-10T04:00:01Z | -3791.045106 | 5273.094387 | 1653.609366 |
1426 | STARLINK-2518 | 2021-05-10T04:00:01Z | -3810.674476 | 5246.652343 | 1692.249698 |
1427 | STARLINK-2470 | 2021-05-09T22:00:01Z | -3820.676998 | 5229.674199 | 1714.971748 |
1428 | STARLINK-2441 | 2021-05-10T12:00:01Z | -3839.786990 | 5205.520247 | 1751.896358 |
Ahora se puede construir el gráfico. En primer lugar se va a cargar la figura Plotly que fué creada y salvada tal como se detalló en esta entrada de mi blog. A dicha figura le añadiremos un objeto gráfico de Plotly de tipo Scatter3D para representar los satélites como puntos en las coordenadas x, y, z del DataFrame
fig = pio.read_json('Datos/Tierra')
fig.add_trace(go.Scatter3d(x=df['x'], y=df['y'], z=df['z'],
mode='markers', marker_size=2, marker_color='red',
hovertext=df['Nombre'],hoverinfo='text'))
fig.update_layout(title_text='Constelación Starlink el 10/5/2021', title_x=0.5,
title_xanchor='center', title_y=0.9,
title_font_color='white', title_font_size=18)
El gráfico anterior es un gráfico interactivo, que puede girarse y ampliarse con el ratón. Además, al posar el cursor sobre uno de los puntos se muestra el identificador del satélite correspondiente. Es interesante observar que algunos de estos satélites están dispuestos formando largas cadenas. Se trata de satélites que han sido lanzados en un mismo lote y que aún no han sido colocados en sus ubicaciones definitivas.