# How to find SMAP Satellite acquisiton plan?

I need to know to which time the SMAP Satellite passes over a certain location in the future.

I believe this is called acquisition plan, but I'm not sure. Here for example the sentinel 1 acquisition plan.

I found this web page where you can track the actual position of SMAP and get a 10day prediction but I need a more official source.

• THX @mkennedy That's a better site than I found but I still can't believe that they don't have something like an .kml file for the flight paths of SMAP maybe its not public for some reason... Feb 22 '20 at 18:24
• Can you use even a little Python? I can add a script that will give you something like what you need. It may not be the answer that you want to accept, but it will at least give you something.
– uhoh
Feb 23 '20 at 7:22
• @uhoh Yes python is no problem, it would be nice if you can write a little answer ;) Feb 23 '20 at 7:25
• hang on, doing so now!
– uhoh
Feb 23 '20 at 7:28

As @gerrit pointed out, the Pytroll project has a couple of package which could be useful. To answer your question and get the next overpasses for the next twelve hours above a given location, you can use Pyorbital (https://github.com/pytroll/pyorbital):

from pyorbital.orbital import Orbital
from datetime import datetime
orb = Orbital("SMAP")
orb.get_next_passes(datetime.now(), length=12, lon=16, lat=55, alt=0.05)


with length in hours, lon and lat in degrees, alt in km. And this will display (at the time of writing this):

[(datetime.datetime(2020, 2, 24, 13, 14, 54, 147587),
datetime.datetime(2020, 2, 24, 13, 23, 23, 955297),
datetime.datetime(2020, 2, 24, 13, 19, 8, 924860)),
(datetime.datetime(2020, 2, 24, 14, 48, 41, 249324),
datetime.datetime(2020, 2, 24, 15, 1, 24, 171709),
datetime.datetime(2020, 2, 24, 14, 55, 1, 725148)),
(datetime.datetime(2020, 2, 24, 16, 25, 14, 798347),
datetime.datetime(2020, 2, 24, 16, 39, 0, 109628),
datetime.datetime(2020, 2, 24, 16, 32, 5, 434271)),
(datetime.datetime(2020, 2, 24, 18, 5, 14, 617775),
datetime.datetime(2020, 2, 24, 18, 15, 43, 280401),
datetime.datetime(2020, 2, 24, 18, 10, 27, 671621))]


Each tuple is (rise, fall, highest point).

Now we also have the pytroll-schedule package, in case you need to make a full acquisition plan, that will allow you for example to put priorities on satellites: https://github.com/pytroll/pytroll-schedule

• It's great when a new user stops by and introduces us to a new Earth Science tool! Please keep an eye on the site, I plan on posting a follow-up question in a day or two. Thanks!
– uhoh
Feb 25 '20 at 0:16
• okay, a day or two from now I get behind in my stack exchanging from time to time...
– uhoh
Feb 29 '20 at 1:39

This is not a satellite acquisition plan, but it may be something to get you started. I've used the Python package Skyfield to get the subsatellite point of SMAP based on the most recent two line element set from Celestrak.

Please feel feel free to leave comments with questions if a tweak is needed!

I'm not an expert on dates and times in Python, the times object has several conversion and formatting methods if you want to make a table.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

# mostly from https://rhodesmill.org/skyfield/earth-satellites.html
SMAP = resource_satellites['SMAP']
print(SMAP)
print('epoch of the SMAP TLE found: ', SMAP.epoch.utc_jpl())

days = ts.now() - SMAP.epoch
print('{:.3f} days away from epoch'.format(days))

# still from that example:
bluffton = Topos('40.8939 N', '83.8917 W')
t0 = ts.utc(2020, 2, 23)
t1 = ts.utc(2020, 2, 24)
t, events = SMAP.find_events(bluffton, t0, t1, altitude_degrees=30.0)
for ti, event in zip(t, events):
name = ('rise above 30°', 'culminate', 'set below 30°')[event]
print(ti.utc_jpl(), name)

# WARNING I've hard coded a date here, if you run this later the TLE retrieved
# will be newer and so will be less accurate. You'd like the TLE you use to be within
# a few weeks (if not a few days) of your date for best accuracy.

minutes = range(24*60+1)
times = ts.utc(2020, 2, 24, 0, minutes, 0) # Example; every minute for 24-feb-2020

subsat_pts = SMAP.at(times).subpoint()
lat, lon = subsat_pts.latitude.degrees, subsat_pts.longitude.degrees

subsat_pts_now = SMAP.at(ts.now()).subpoint()
lat_now, lon_now = subsat_pts_now.latitude.degrees, subsat_pts_now.longitude.degrees

# fudging around to keep the plot from wrapping arond the Earth
breakpoints = lon[1:] - lon[:-1] > 10. # for SMAP this means that longitude has wrapped
lat, lon = lat[:-1], lon[:-1]
lon[breakpoints] = np.nan

if True:
plt.figure()
plt.plot(lon, lat)
plt.title('SMAP map every minute for 24-feb-2020, dot is for ts.now()')
plt.xlabel('longitude (degs)')
plt.ylabel('latitude (degs)')
plt.plot([lon_now], [lat_now], 'ok') # put a dot for right now
plt.show()

• Good start, but the sub-satellite point is not enough. SMAP scans at an incidence angle of 40°, so you'd need to simulate where it's actually viewing. Swath width is about 1000 km, so the easiest simulation is to make your lines 1000 km thick. Pytroll may have a package that can help for a more precise answer (pyorbital and pytroll-schedule, perhaps).
– gerrit
Feb 23 '20 at 9:10
• @gerrit oh this looks very interesting! I'm going to take a long look but hopefully the OP can make use of this directly; I'll add a comment above, thanks!
– uhoh
Feb 23 '20 at 9:22
• I've pinged the pytroll-schedule experts in their slack, perhaps one of them can come along to show an example (probably not on Sunday morning, though).
– gerrit
Feb 23 '20 at 9:49
• @gerrit thanks, that would be super!
– uhoh
Feb 23 '20 at 10:01