Source code for satnogsclient.observer.orbital

from __future__ import absolute_import, division, print_function

import logging
import sys
from datetime import datetime

import ephem
import pytz

LOGGER = logging.getLogger(__name__)


[docs]def pinpoint(observer_dict, satellite_dict, timestamp=None): """Provides azimuth and altitude of tracked object. args: observer_dict: dictionary with details of observation point. satellite_dict: dictionary with details of satellite. time: timestamp we want to use for pinpointing the observed object. returns: Dictionary containing azimuth, altitude and "ok" for error detection. """ # pylint: disable=assigning-non-slot # Disable until pylint 2.4 is released, see # https://github.com/PyCQA/pylint/issues/2807 # observer object if all(x in observer_dict for x in ('lat', 'lon', 'elev')): LOGGER.debug('Observer data: %s', observer_dict) observer = ephem.Observer() observer.lon = str(observer_dict['lon']) observer.lat = str(observer_dict['lat']) observer.elevation = float(observer_dict['elev']) else: LOGGER.error('Something went wrong: %s', observer_dict) return {'ok': False} # satellite object if all(x in satellite_dict for x in ('tle0', 'tle1', 'tle2')): LOGGER.debug('Satellite data: %s', satellite_dict) tle0 = str(satellite_dict['tle0']) tle1 = str(satellite_dict['tle1']) tle2 = str(satellite_dict['tle2']) try: satellite = ephem.readtle(tle0, tle1, tle2) except ValueError: LOGGER.error('Something went wrong: %s', satellite_dict) LOGGER.error(sys.exc_info()[0]) return {'ok': False} else: return {'ok': False} # time of observation if not timestamp: timestamp = datetime.now(pytz.utc) # observation calculation observer.date = timestamp.strftime('%Y-%m-%d %H:%M:%S.%f') satellite.compute(observer) calculated_data = { 'alt': satellite.alt, 'az': satellite.az, 'rng': satellite.range, 'rng_vlct': satellite.range_velocity, 'ok': True } LOGGER.debug('Calculated data: %s', calculated_data) return calculated_data