def get_next_passes(satellites, utctime, forward, coords, tle_file=None, aqua_terra_dumps=None): """Get the next passes for *satellites*, starting at *utctime*, for a duration of *forward* hours, with observer at *coords* ie lon (°E), lat (°N), altitude (km). Uses *tle_file* if provided, downloads from celestrack otherwise. Metop-A, Terra and Aqua need special treatment due to downlink restrictions. """ passes = {} if tle_file is None and 'TLES' not in os.environ: fp_, tle_file = mkstemp(prefix="tle", dir="/tmp") os.close(fp_) logger.info("Fetch tle info from internet") tlefile.fetch(tle_file) if not os.path.exists(tle_file) and 'TLES' not in os.environ: logger.info("Fetch tle info from internet") tlefile.fetch(tle_file) for sat in satellites: if not hasattr(sat, 'name'): from trollsched.schedule import Satellite sat = Satellite(sat, 0, 0) satorb = orbital.Orbital(sat.name, tle_file=tle_file) passlist = satorb.get_next_passes(utctime, forward, *coords) if sat.name == "metop-a": # Take care of metop-a passes["metop-a"] = get_metopa_passes(sat, passlist, satorb) elif sat.name in ["aqua", "terra"] and aqua_terra_dumps: # Take care of aqua (dumps in svalbard and poker flat) # Get the Terra/Aqua passes and fill the passes dict: get_terra_aqua_passes(passes, utctime, forward, sat, passlist, satorb, aqua_terra_dumps) else: if sat.name.upper() in VIIRS_PLATFORM_NAMES: instrument = "viirs" elif sat.name.lower().startswith("metop") or sat.name.lower().startswith("noaa"): instrument = "avhrr" elif sat.name.upper() in MERSI2_PLATFORM_NAMES: instrument = "mersi2" else: instrument = "unknown" passes[sat.name] = [ Pass(sat, rtime, ftime, orb=satorb, uptime=uptime, instrument=instrument) for rtime, ftime, uptime in passlist if ftime - rtime > timedelta(minutes=MIN_PASS) ] return set(fctools_reduce(operator.concat, list(passes.values())))
def get_next_passes(satellites, utctime, forward, coords, tle_file=None, aqua_terra_dumps=None, min_pass=MIN_PASS, local_horizon=0): """Get the next passes for *satellites*, starting at *utctime*, for a duration of *forward* hours, with observer at *coords* ie lon (°E), lat (°N), altitude (km). Uses *tle_file* if provided, downloads from celestrack otherwise. Metop-A, Terra and Aqua need special treatment due to downlink restrictions. """ passes = {} if tle_file is None and 'TLES' not in os.environ: fp_, tle_file = mkstemp(prefix="tle", dir="/tmp") os.close(fp_) logger.info("Fetch tle info from internet") tlefile.fetch(tle_file) if not os.path.exists(tle_file) and 'TLES' not in os.environ: logger.info("Fetch tle info from internet") tlefile.fetch(tle_file) for sat in satellites: if not hasattr(sat, 'name'): from trollsched.schedule import Satellite sat = Satellite(sat, 0, 0) satorb = orbital.Orbital(sat.name, tle_file=tle_file) passlist = satorb.get_next_passes(utctime, forward, horizon=local_horizon, *coords) if sat.name.lower() == "metop-a": # Take care of metop-a special case passes["metop-a"] = get_metopa_passes(sat, passlist, satorb) elif sat.name.lower() in ["aqua", "terra"] and aqua_terra_dumps: # Take care of aqua (dumps in svalbard and poker flat) # Get the Terra/Aqua passes and fill the passes dict: get_terra_aqua_passes(passes, utctime, forward, sat, passlist, satorb, aqua_terra_dumps) else: if sat.name.upper() in VIIRS_PLATFORM_NAMES: instrument = "viirs" elif sat.name.lower().startswith( "metop") or sat.name.lower().startswith("noaa"): instrument = "avhrr" elif sat.name.lower() in ["aqua", "terra"]: # when aqua_terra_dumps=False instrument = "modis" elif sat.name.upper() in MERSI_PLATFORM_NAMES: instrument = "mersi" elif sat.name.upper() in MERSI2_PLATFORM_NAMES: instrument = "mersi-2" else: instrument = "unknown" passes[sat.name] = [ Pass(sat, rtime, ftime, orb=satorb, uptime=uptime, instrument=instrument) for rtime, ftime, uptime in passlist if ftime - rtime > timedelta(minutes=MIN_PASS) ] return set(fctools_reduce(operator.concat, list(passes.values())))