Analyzing NEOs

NEO stands for near-Earth object. The Center for NEO Studies (CNEOS) defines NEOs as comets and asteroids that have been nudged by the gravitational attraction of nearby planets into orbits that allow them to enter the Earth’s neighborhood.

And what does “near” exactly mean? In terms of orbital elements, asteroids and comets can be considered NEOs if their perihelion (orbit point which is nearest to the Sun) is less than 1.3 au = 1.945 * 108 km from the Sun.

[1]:
from astropy import time

from poliastro.bodies import Earth
from poliastro.frames import Planes
from poliastro.plotting import StaticOrbitPlotter
from poliastro.twobody.orbit import Orbit
Matplotlib is building the font cache; this may take a moment.

Small Body Database (SBDB)

[2]:
eros = Orbit.from_sbdb("Eros")
eros.plot(label="Eros")
[2]:
[<matplotlib.lines.Line2D at 0x7fd79152ed90>,
 <matplotlib.lines.Line2D at 0x7fd791014be0>]
../_images/examples_Analyzing_NEOs_4_1.png

You can also search by IAU number or SPK-ID (there is a faster neows.orbit_from_spk_id() function in that case, although):

[3]:
ganymed = Orbit.from_sbdb("1036")  # Ganymed IAU number
amor = Orbit.from_sbdb("2001221")  # Amor SPK-ID
eros = Orbit.from_sbdb("2000433")  # Eros SPK-ID

frame = StaticOrbitPlotter(plane=Planes.EARTH_ECLIPTIC)
frame.plot(ganymed, label="Ganymed")
frame.plot(amor, label="Amor")
frame.plot(eros, label="Eros")
[3]:
[<matplotlib.lines.Line2D at 0x7fd790cfb310>,
 <matplotlib.lines.Line2D at 0x7fd790cf9190>]
../_images/examples_Analyzing_NEOs_6_1.png

You can use the wildcards from that browser: * and ?.

Keep it in mind that from_sbdb() can only return one Orbit, so if several objects are found with that name, it will raise an error with the different bodies:

[4]:
try:
    Orbit.from_sbdb("*alley")
except ValueError as err:
    print(err)
7 different objects found:
903 Nealley (A918 RH)
2688 Halley (1982 HG1)
14182 Alley (1998 WG12)
21651 Mission Valley (1999 OF1)
36445 Smalley (2000 QU)
39792 Patrickchevalley (1997 RJ4)
1P/Halley

Note that the epoch is provided by the service itself, so if you need orbit on another epoch, you have to propagate it:

[5]:
eros.epoch.iso
[5]:
'2022-08-09 00:01:09.183'
[6]:
epoch = time.Time(2458000.0, scale="tdb", format="jd")
eros_november = eros.propagate(epoch)
eros_november.epoch.iso
[6]:
'2017-09-03 12:00:00.000'