Skip to content
Snippets Groups Projects
jpl_data_query.py 1.31 KiB
Newer Older
nguyed99's avatar
nguyed99 committed
This module contains functions to query and parse JPL Horizons 
on-line solar system data (see https://ssd-api.jpl.nasa.gov/doc/horizons.html).
"""

import re
import requests

import numpy as np


def query_data(input_file: str) -> str:
    """
    Send request to the Horizons API with settings for the desired ephemeris results saved in an input file.
    """
    with open(input_file, 'r') as f:
        file = f.read()

    url = "https://ssd.jpl.nasa.gov/api/horizons_file.api"
    r = requests.post(url, data={'format': 'json'}, files={'input': file})

    return r.json()['result']


def parse_output(output: str) -> np.ndarray:
    """
    Parse output of API calls for positions and velocities
    """

    output = list(filter(bool, output.split("\n")))
    vector_list = [line.split(",") for line in output if line[1:4] == "XYZ"]
    vector_list = [list(map(float, re.findall(r"[-+]?\d*\.?\d+(?:[Ee][-+]?\d+)?", i[0]))) for i in vector_list]

    r = np.zeros((len(vector_list), 3), dtype=float)
    v = np.zeros((len(vector_list), 3), dtype=float)

    for i, vector in enumerate(vector_list):
        r[i][0] = float(vector[0])
        r[i][1] = float(vector[1])
        r[i][2] = float(vector[2])
        v[i][0] = float(vector[3])
        v[i][1] = float(vector[4])
        v[i][2] = float(vector[5])

    return r, v