Track Earth satellites given TLE data, using up-to-date 2020 SGP4 routines.
Project description
This package compiles the official C++ code from Revisiting Spacetrack Report #3 (AIAA 2006-6753) and uses it to compute the positions of satellites in Earth orbit. Orbital elements can be read from either a legacy TLE file or from a modern OMM element set, both of which you can fetch from a site like CelesTrak.
If your machine can’t install or compile the C++ code, then this package falls back to using a slower pure-Python implementation of SGP4. Tests make sure that its positions agree to within 0.1 mm with the standard version of the algorithm — an error far less than the 1–3 km/day by which satellites themselves deviate from the ideal orbits described in TLE files.
An accelerated routine is available that, given a series of times and of satellites, computes a whole array of output positions using a fast C++ loop. See the “Array Acceleration” section below.
Note that the SGP4 propagator returns raw x,y,z Cartesian coordinates in a “True Equator Mean Equinox” (TEME) reference frame that’s centered on the Earth but does not rotate with it — an “Earth centered inertial” (ECI) reference frame. The SGP4 propagator itself does not implement the math to convert these positions into more official ECI frames like J2000 or the ICRS, nor into any Earth-centered Earth-fixed (ECEF) frames like the ITRS, nor into latitudes and longitudes through an Earth ellipsoid like WGS84. For conversions into these other coordinate frames, look for a comprehensive astronomy library, like the Skyfield library that is built atop this one (see the section on Earth satellites in its documentation).
Usage
You will probably first want to to check whether your machine has successfully installed the fast SGP4 C++ code, or is using the slow Python version (in which case this value will be false):
>>> from sgp4.api import accelerated >>> print(accelerated) True
This library uses the same function names as the official C++ code, to help users who are already familiar with SGP4 in other languages. Here is how to compute the x,y,z position and velocity for the International Space Station at 12:50:19 on 29 June 2000:
>>> from sgp4.api import Satrec >>> >>> s = '1 25544U 98067A 19343.69339541 .00001764 00000-0 38792-4 0 9991' >>> t = '2 25544 51.6439 211.2001 0007417 17.6667 85.6398 15.50103472202482' >>> satellite = Satrec.twoline2rv(s, t) >>> >>> jd, fr = 2458827, 0.362605 >>> e, r, v = satellite.sgp4(jd, fr) >>> e 0 >>> print(r) # True Equator Mean Equinox position (km) (-6102.44..., -986.33..., -2820.31...) >>> print(v) # True Equator Mean Equinox velocity (km/s) (-1.45..., -5.52..., 5.10...)
As input, you can provide either:
A simple floating-point Julian Date for jd and the value 0.0 for fr, if you are happy with the precision of a 64-bit floating point number. Note that modern Julian Dates are greater than 2,450,000 which means that nearly half of the precision of a 64-bit float will be consumed by the whole part that specifies the day. The remaining digits will provide a precision for the fraction of around 20.1 µs. This should be no problem for the accuracy of your result — satellite positions usually off by a few kilometers anyway, far less than a satellite moves in 20.1 µs — but if you run a solver that dives down into the microseconds while searching for a rising or setting time, the solver might be bothered by the 20.1 µs plateau between each jump in the satellite’s position.
Or, you can provide a coarse date jd plus a very precise fraction fr that supplies the rest of the value. The Julian Date for which the satellite position is computed is the sum of the two values. One common practice is to provide the whole number as jd and the fraction as fr; another is to have jd carry the fraction 0.5 since UTC midnight occurs halfway through each Julian Date. Either way, splitting the value allows a solver to run all the way down into the nanoseconds and still see SGP4 respond smoothly to tiny date adjustments with tiny changes in the resulting satellite position.
Here is how to intrepret the results:
e will be a non-zero error code if the satellite position could not be computed for the given date. You can from sgp4.api import SGP4_ERRORS to access a dictionary mapping error codes to error messages explaining what each code means.
r measures the satellite position in kilometers from the center of the earth in the idiosyncratic True Equator Mean Equinox coordinate frame used by SGP4.
v velocity is the rate at which the position is changing, expressed in kilometers per second.
If your application does not natively handle Julian dates, you can compute jd and fr from calendar dates using jday().
>>> from sgp4.api import jday >>> jd, fr = jday(2019, 12, 9, 12, 0, 0) >>> jd 2458826.5 >>> fr 0.5
Double-checking your TLE lines
Because TLE is an old punch-card fixed-width format, it’s very sensitive to whether exactly the right number of spaces are positioned in exactly the right columns. If you suspect that your satellite elements aren’t getting loaded correctly, try calling the slow pure-Python version of twoline2rv(), which performs extra checks that the fast C++ doesn’t:
>>> from sgp4.earth_gravity import wgs72 >>> from sgp4.io import twoline2rv >>> assert twoline2rv(s, t, wgs72)
Any TLE formatting errors will be raised as a ValueError.
Using OMM elements instead of TLE
The industry is migrating away from the original TLE format, because it will soon run out of satellite numbers.
Some TLE files now use a new “Alpha-5” convention that expands the range of satellite numbers by using an initial letter; for example, “E8493” means satellite 148493. This library supports the Alpha-5 convention and should return the correct integer in Python.
Some authorities are now distributing satellite elements in an “OMM” Orbit Mean Elements Message format that replaces the TLE format. You can learn about OMM in Dr. T.S. Kelso’s “A New Way to Obtain GP Data” at the CelesTrak site.
You can already try out experimental support for OMM:
>>> from sgp4 import omm
Reading OMM data takes two steps, because OMM supports several different text formats. First, parse the input text to recover the field names and values that it stores; second, build a Python satellite object from those field values. For example, to load OMM from XML:
>>> with open('sample_omm.xml') as f: ... fields = next(omm.parse_xml(f)) >>> sat = Satrec() >>> omm.initialize(sat, fields)
Or, to load OMM from CSV:
>>> with open('sample_omm.csv') as f: ... fields = next(omm.parse_csv(f)) >>> sat = Satrec() >>> omm.initialize(sat, fields)
Either way, the satellite object should wind up properly initialized and ready to start producing positions.
If you are interested in saving satellite parameters using the new OMM format, then read the section on “Export” below.
Epoch
Over a given satellite’s lifetime, dozens or hundreds of different TLE records will be produced as its orbit evolves. Each TLE record specifies the “epoch date” for which it is most accurate. Typically a TLE is only useful for a couple of weeks to either side of its epoch date, beyond which its predictions become unreliable.
Satellite objects natively provide their epoch as a two-digit year and then a fractional number of days into the year:
>>> satellite.epochyr 19 >>> satellite.epochdays 343.69339541
Because Sputnik was launched in 1957, satellite element sets will never refer to an earlier year, so years 57 through 99 mean 1957–1999 while 0 through 56 mean 2000–2056. The TLE format will presumably be obsolete in 2057 and have to be upgraded to 4-digit years.
To turn the number of days and its fraction into a calendar date and time, use the days2mdhms() function.
>>> from sgp4.api import days2mdhms >>> month, day, hour, minute, second = days2mdhms(19, 343.69339541) >>> month 12 >>> day 9 >>> hour 16 >>> minute 38 >>> second 29.363424
The SGP4 library also translates those two numbers into a Julian date and fractional Julian date, since Julian dates are more commonly used in astronomy.
>>> satellite.jdsatepoch 2458826.5 >>> satellite.jdsatepochF 0.69339541
Finally, a convenience function is available in the library if you need the epoch date and time as Python datetime.
>>> from sgp4.conveniences import sat_epoch_datetime >>> sat_epoch_datetime(satellite) datetime.datetime(2019, 12, 9, 16, 38, 29, 363423, tzinfo=UTC)
Array Acceleration
To avoid the expense of running a Python loop when you have many dates and times for which you want a position, you can pass your Julian dates as arrays. The array routine is only faster if your machine has successfully installed or compiled the SGP4 C++ code, so you might want to check first:
>>> from sgp4.api import accelerated >>> print(accelerated) True
To call the array routine, make NumPy arrays for jd and fr that are the same length:
>>> import numpy as np >>> np.set_printoptions(precision=2)
>>> jd = np.array((2458826, 2458826, 2458826, 2458826)) >>> fr = np.array((0.0001, 0.0002, 0.0003, 0.0004))
>>> e, r, v = satellite.sgp4_array(jd, fr)
>>> print(e) [0 0 0 0] >>> print(r) [[-3431.31 2620.15 -5252.97] [-3478.86 2575.14 -5243.87] [-3526.09 2529.89 -5234.28] [-3572.98 2484.41 -5224.19]] >>> print(v) [[-5.52 -5.19 1.02] [-5.49 -5.22 1.08] [-5.45 -5.25 1.14] [-5.41 -5.28 1.2 ]]
To avoid the expense of Python loops when you have many satellites and dates, build a SatrecArray from several individual satellites. Its sgp4() method will expect both jd and fr to be NumPy arrays, so if you only have one date, be sure to provide NumPy arrays of length one. Here is a sample computation for 2 satellites and 4 dates:
>>> u = '1 20580U 90037B 19342.88042116 .00000361 00000-0 11007-4 0 9996' >>> w = '2 20580 28.4682 146.6676 0002639 185.9222 322.7238 15.09309432427086' >>> satellite2 = Satrec.twoline2rv(u, w)
>>> from sgp4.api import SatrecArray >>> a = SatrecArray([satellite, satellite2]) >>> e, r, v = a.sgp4(jd, fr)
>>> np.set_printoptions(precision=2) >>> print(e) [[0 0 0 0] [0 0 0 0]] >>> print(r) [[[-3431.31 2620.15 -5252.97] [-3478.86 2575.14 -5243.87] [-3526.09 2529.89 -5234.28] [-3572.98 2484.41 -5224.19]] <BLANKLINE> [[ 5781.85 2564. -2798.22] [ 5749.36 2618.59 -2814.63] [ 5716.35 2672.94 -2830.78] [ 5682.83 2727.05 -2846.68]]] >>> print(v) [[[-5.52 -5.19 1.02] [-5.49 -5.22 1.08] [-5.45 -5.25 1.14] [-5.41 -5.28 1.2 ]] <BLANKLINE> [[-3.73 6.33 -1.91] [-3.79 6.3 -1.88] [-3.85 6.28 -1.85] [-3.91 6.25 -1.83]]]
Export
If you have a Satrec you want to share with friends or persist to a file, there’s an export routine that will turn it back into a TLE:
>>> from sgp4 import exporter >>> line1, line2 = exporter.export_tle(satellite) >>> line1 '1 25544U 98067A 19343.69339541 .00001764 00000-0 38792-4 0 9991' >>> line2 '2 25544 51.6439 211.2001 0007417 17.6667 85.6398 15.50103472202482'
Happily, these are exactly the two TLE lines that we used to create this satellite object:
>>> (s == line1) and (t == line2) True
Another export routine is available that produces the fields defined by the new OMM format (see the “OMM” section above):
>>> from pprint import pprint >>> fields = exporter.export_omm(satellite, 'ISS (ZARYA)') >>> pprint(fields) {'ARG_OF_PERICENTER': 17.6667, 'BSTAR': 3.8792e-05, 'CENTER_NAME': 'EARTH', 'CLASSIFICATION_TYPE': 'U', 'ECCENTRICITY': 0.0007417, 'ELEMENT_SET_NO': 999, 'EPHEMERIS_TYPE': 0, 'EPOCH': '2019-12-09T16:38:29.363423', 'INCLINATION': 51.6439, 'MEAN_ANOMALY': 85.6398, 'MEAN_ELEMENT_THEORY': 'SGP4', 'MEAN_MOTION': 15.501034720000002, 'MEAN_MOTION_DDOT': 0.0, 'MEAN_MOTION_DOT': 1.764e-05, 'NORAD_CAT_ID': 25544, 'OBJECT_ID': '1998-067A', 'OBJECT_NAME': 'ISS (ZARYA)', 'RA_OF_ASC_NODE': 211.2001, 'REF_FRAME': 'TEME', 'REV_AT_EPOCH': 20248, 'TIME_SYSTEM': 'UTC'}
Gravity
The SGP4 algorithm operates atop a set of constants specifying how strong the Earth’s gravity is. The most recent official paper on SGP4 (see below) specifies that “We use WGS-72 as the default value”, so this Python module uses the same default. But in case you want to use either the old legacy version of the WGS-72 constants, or else the non-standard but more modern WGS-84 constants, the twoline2rv() constructor takes an optional argument:
>>> from sgp4.api import WGS72OLD, WGS72, WGS84 >>> satellite3 = Satrec.twoline2rv(s, t, WGS84)
You will in general get less accurate results if you choose WGS-84. Even though it reflects more recent and accurate measures of the Earth, satellite TLEs across the industry are most likely generated with WGS-72 as their basis. The positions you generate will better agree with the real positions of each satellite if you use the same underlying gravity constants as were used to generate the TLE.
Providing your own elements
If instead of parsing a TLE you want to specify orbital elements directly, you can pass them as floating point numbers to a satellite object’s sgp4init() method. For example, here’s how to build the same International Space Station orbit that we loaded from a TLE in the first code example above:
>>> satellite2 = Satrec() >>> satellite2.sgp4init( ... WGS72, # gravity model ... 'i', # 'a' = old AFSPC mode, 'i' = improved mode ... 25544, # satnum: Satellite number ... 25545.69339541, # epoch: days since 1949 December 31 00:00 UT ... 3.8792e-05, # bstar: drag coefficient (1/earth radii) ... 0.0, # ndot: ballistic coefficient (radians/minute^2) ... 0.0, # nddot: mean motion 2nd derivative (radians/minute^3) ... 0.0007417, # ecco: eccentricity ... 0.3083420829620822, # argpo: argument of perigee (radians) ... 0.9013560935706996, # inclo: inclination (radians) ... 1.4946964807494398, # mo: mean anomaly (radians) ... 0.06763602333248933, # no_kozai: mean motion (radians/minute) ... 3.686137125541276, # nodeo: R.A. of ascending node (radians) ... )
These numbers don’t look the same as the numbers in the TLE, because the underlying sgp4init() routine uses different units: radians rather than degrees. But this is the same orbit and will produce the same positions.
Note that ndot and nddot are ignored by the SGP4 propagator, so you can leave them 0.0 without any effect on the resulting satellite positions. But they do at least get saved to the satellite object, and written out if you write the parameters to a TLE or OMM file (see the “Export” section, above).
To compute the “epoch” argument, take the epoch’s Julian date and subtract 2433281.5 days.
While the underlying sgp4init() routine leaves the attributes epochyr, epochdays, jdsatepoch, and jdsatepochF unset, this library goes ahead and sets them anyway for you, using the epoch you provided.
See the next section for the complete list of attributes that are available from the satellite record once it has been initialized.
Attributes
There are several dozen Satrec attributes that expose data from the underlying C++ SGP4 record. They fall into the following categories.
Identification
These are copied directly from the TLE record but aren’t used by the propagation math.
Orbital Elements
These are the orbital parameters, copied verbatim from the text of the TLE record. They describe the orbit at the moment of the TLE’s epoch and so remain constant even as the satellite record is used over and over again to propagate positions for different times.
You can also access the epoch as a Julian date:
Computed Orbit Properties
These are computed when the satellite is first loaded, as a convenience for callers who might be interested in them. They aren’t used by the SGP4 propagator itself.
Propagator Mode
Result of Most Recent Propagation
The possible error codes are:
No error.
Mean eccentricity is outside the range 0 ≤ e < 1.
Mean motion has fallen below zero.
Perturbed eccentricity is outside the range 0 ≤ e ≤ 1.
Length of the orbit’s semi-latus rectum has fallen below zero.
(No longer used.)
Orbit has decayed: the computed position is underground. (The position is still returned, in case the vector is helpful to software that might be searching for the moment of re-entry.)
Mean Elements From Most Recent Propagation
Partway through each propagation, the SGP4 routine saves a set of “singly averaged mean elements” that describe the orbit’s shape at the moment for which a position is being computed. They are averaged with respect to the mean anomaly and include the effects of secular gravity, atmospheric drag, and — in Deep Space mode — of those pertubations from the Sun and Moon that SGP4 averages over an entire revolution of each of those bodies. They omit both the shorter-term and longer-term periodic pertubations from the Sun and Moon that SGP4 applies right before computing each position.
Gravity Model Parameters
When the satellite record is initialized, your choice of gravity model results in a slate of eight constants being copied in:
Printing satellite attributes
If you want to print out a satellite, this library provides a convenient “attribute dump” routine that takes a satellite and generates lines that list its attributes:
from sys import stdout from sgp4.conveniences import dump_satrec stdout.writelines(dump_satrec(satellite))
If you want to compare two satellites, then simply pass a second argument; the second satellite’s attributes will be printed in a second column next to those of the first.
stdout.writelines(dump_satrec(satellite, satellite2))
Validation against the official algorithm
This implementation passes all of the automated tests in the August 2010 release of the reference implementation of SGP4 by Vallado et al., who originally published their revision of SGP4 in 2006:
Vallado, David A., Paul Crawford, Richard Hujsak, and T.S. Kelso, “Revisiting Spacetrack Report #3,” presented at the AIAA/AAS Astrodynamics Specialist Conference, Keystone, CO, 2006 August 21–24.
If you would like to review the paper, it is available online. You can always download the latest version of their code for comparison against this Python module (or other implementations) at AIAA-2006-6753.zip.
For developers
Developers can check out this full project from GitHub:
https://github.com/brandon-rhodes/python-sgp4
To run its unit tests, install Python 2, Python 3, and the tox testing tool. The tests runing in Python 2 will exercise the fallback pure-Python version of the routines, while Python 3 exercises the fast new C++ accelerated code:
cd python-sgp4 tox
Legacy API
Before this library pivoted to wrapping Vallado’s official C++ code and was operating in pure Python only, it had a slightly quirkier API, which is still supported for compatibility with older clients. You can learn about it by reading the documentation from version 1.4 or earlier:
Changelog
2023-04-27 — 2.22
Added a satnum_str attribute, exposing the fact that the C++ now stores the satellite number as a string; and check that satnum is never greater than 339999.
Fixed the units of the nddot attribute when the value is loaded from an OMM record. (Since the TLE computation itself ignores this attribute, this did not affect any satellite positions.)
Enhanced the fallback Python version of twoline2rv() to verify that TLE lines are ASCII, and added documentation using it to double-check TLEs that might suffer from non-ASCII characters.
If the user doesn’t set a satellite’s classification, it now defaults to 'U' for ‘unclassified’.
2022-04-06 — 2.21
Added dump_satrec() to the sgp4.conveniences module.
Fixed the Satrec attribute .error, which was previously building a nonsense integer from the wrong data in memory.
Removed .whichconst from Python Satrec, to help users avoid writing code that will break when the C++ extension is available.
2021-07-01 — 2.20
Taught sgp4init() to round both epochdays and jdsatepochF to the same 8 decimal places used for the date fraction in a TLE, if the user-supplied epoch itself has 8 or fewer digits behind the decimal point. This should make it easier to build satellites that round-trip to TLE format with perfect accuracy.
Fixed how export_tle() formats the BSTAR field when its value, if written in scientific notation, has a positive exponent.
Fixed the epochyr assigned by sgp4init() so years before 2000 have two digits instead of three (for example, so that 1980 produces an epochyr of 80 instead of 980).
2021-04-22 — 2.19
Extended the documentation on the Python Package Index and in the module docstring so it lists every Satrec attribute that this library exposes; even the more obscure ones might be useful to folks working to analyze satellite orbits.
2021-03-08 — 2.18
If a TLE satellite number lacks the required 5 digits, twoline2rv() now gives the underlying C++ library a little help so it can still parse the classification and international designator correctly.
The Satrec attributes jdsatepoch, jdsatepochF, epochyr, and epochdays are now writeable, so users can adjust their values manually — which should make up for the fact that the sgp4init() method can’t set them with full floating point precision.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for sgp4-2.22-cp311-cp311-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bdd33ec26172600b8669d0fbdab7d3a7fabe0cc8765397ab00082150fbfd4ce2 |
|
MD5 | 27e69cc36536281544e0c02beb5b1f52 |
|
BLAKE2b-256 | f6767f4981fab71042cf8456f7cd5958bdc73d06677c2bf06ab67374d0d64de8 |
Hashes for sgp4-2.22-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2c3d7299aee0a00e639939d1f3dbd9859b368f6757f8ef4b284eb837a4ff95ed |
|
MD5 | f4d1bc60e6e0ca539292dbb79f4f1467 |
|
BLAKE2b-256 | 339dbdb6d25e5d2e0013b4a7d48e28984606ab1684d16a30e55e2c52cb3f1abd |
Hashes for sgp4-2.22-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 37a7b64b1b62c7d529dcac9303c0286223dbaaa34487be25e63361a78a7423b8 |
|
MD5 | 4cf084c38d8f3f7e234f1ce470b8f512 |
|
BLAKE2b-256 | 35e270e29d11e7ce4c80e66b9fba2836f5b259b652b2ea421d84b2eb34b79328 |
Hashes for sgp4-2.22-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c5285da92eb07126f114096fe147e9cea5ae8fed43c8d38c141269bb581bf13e |
|
MD5 | c3b7d32c6d32c2fac36098d7d5bf5ad7 |
|
BLAKE2b-256 | db0a83034c60b93c1e9d709b75d670be3fc6734402ded615fef060837422ef56 |
Hashes for sgp4-2.22-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b163ed791390a058f4f6c3438bbd2a537b3ab159f39a55f814ff52a3e363173c |
|
MD5 | dbf01b243c11d81e2779bd76d5ec7de9 |
|
BLAKE2b-256 | 0aa3c070170881169c52e1ba537096ebcacd9ac7e0aec5b48bb82cc1547a7e08 |
Hashes for sgp4-2.22-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 05b7d2b225ee12feabe31b27b8ef641b428b1d5791bd121a84a6e7adb718d04f |
|
MD5 | 4c3be95f13e6061838d623f853334a6e |
|
BLAKE2b-256 | 67d22792ad22d1b5aaa072e3bec6fc3b52df52b3254803911107dcef202cf217 |
Hashes for sgp4-2.22-cp311-cp311-macosx_10_9_universal2.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 92a1d16fcafb2e8de60ae3a222ed74d348b19436af6fb7f97ed562368ac00c71 |
|
MD5 | a0e55d162a9ded942586fdb9f0f0f740 |
|
BLAKE2b-256 | 70ac1c11fcc3386cbddcd42378fef22cff005823ecec0381c460b50bfd937505 |
Hashes for sgp4-2.22-cp310-cp310-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5d81b1758f4748df725b1b001cbbadda0733110d336207d72f5d2b0ea586ec6b |
|
MD5 | bed30b9c9934302315e207d1f0cf70eb |
|
BLAKE2b-256 | 7f7fc25645e9e7f2a11eeee7796e80011c32b1a452364e846ec37ab9b5bb07cc |
Hashes for sgp4-2.22-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b4a39b599e8a9106dd39081406447210c6f25994cb0f080c28790708071bd3e7 |
|
MD5 | 0f36946d0407ac8531d9de2b8de4f59d |
|
BLAKE2b-256 | 2edf1a9fcf57e14a68c84ecaff3963802cc65193863866ddbb82bd004c81d525 |
Hashes for sgp4-2.22-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b3950366a79cb9e37a8a9a96e02af46b978fe429f60660121b97c4b255f84572 |
|
MD5 | 9c2bb91b02307ae797c5cfc98ccfebc5 |
|
BLAKE2b-256 | 4aeb06e325755e4ef94cd5e3d798a44cbaceef9b042ae87eb8d37482088089e7 |
Hashes for sgp4-2.22-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b84fd226eb4d9802f3627923fff33dffa8b44a819c37bc9f54939095e9ee98e2 |
|
MD5 | e325299c914748b359fe2d8b277c2591 |
|
BLAKE2b-256 | 0a95bf2bd9fb074d096b441e299abf7988b4b653827e4da2d9e00ba0752e11c7 |
Hashes for sgp4-2.22-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e05d6dec89e4d8811bd323bdd28680cd12778d1c8960e9458c7917075c7c1ba1 |
|
MD5 | 2ddf7238a45ef485b26ee3918acfcb7e |
|
BLAKE2b-256 | e194f357edbfc0ce76db0ca43bcab3e0547e2fe64af55171e0d3c97e15c1a057 |
Hashes for sgp4-2.22-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5156e322dcd2d2d84f154b5027c6fb5e8677c854dfe5f82cc838758c3d42e569 |
|
MD5 | 946f280cd91d8cea539930723515feae |
|
BLAKE2b-256 | eac7dc6cc2b759001142b3873938e13a23cd621858cce1d2502be2e2db35ee4b |
Hashes for sgp4-2.22-cp310-cp310-macosx_10_9_universal2.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d7cb988df79a97aa7c2a809f62735fca0c58ca3ae8f49e38400f065b0057f44c |
|
MD5 | 2cdda8cbba4bebae977ac085d56afd4d |
|
BLAKE2b-256 | d30611a39fc9f940b996a0affdb16abf2aab90977d3be8249f94e99f5aa10ccc |
Hashes for sgp4-2.22-cp39-cp39-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 62996bb490bf053dedde398e0b24a86542ac8407f438fc9fb966aa304d7abf43 |
|
MD5 | 9d44a01aba6ad9696ce85539da5c6168 |
|
BLAKE2b-256 | 48217304dd95270e76a23e07d9f583c578e5ed486e69058fde196a06f9211bf8 |
Hashes for sgp4-2.22-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4115e1246d20181d35a041fa82967aea29309ed909527d198ebda17ac10982dc |
|
MD5 | 2937abe3183bba191be6161e60c5146d |
|
BLAKE2b-256 | bffb53965f0891379316ce29d857974125082d0aaa23ffa1da817a9e1d3b9258 |
Hashes for sgp4-2.22-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ad656c06e8c7f956fc23a5b8a052bd078965207baa27bf2ee00761ac666e7d53 |
|
MD5 | c4560e2e045c396884e3ea84f0309598 |
|
BLAKE2b-256 | 2dec2e342865cbb492d94821a9ea2274808d8093edc494e3e606a3d7a31abe84 |
Hashes for sgp4-2.22-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6c7442d512d3b30878ed00f44add8317d1ad396a021d9a0f92a12902caa6d042 |
|
MD5 | ccc0461981b15d71432920048410e4fd |
|
BLAKE2b-256 | 97f4299d781e5956b226ac6a219fa2a5daa5a7f9e18610db77fdb2b6126be5f6 |
Hashes for sgp4-2.22-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b385243f286bd57265a51835d74a4bc4de864330cb482587248ffe134cbf8057 |
|
MD5 | 3e5cbe75af0ff3f9cbeee6cbf3fbd0fb |
|
BLAKE2b-256 | 5a45d4174c8615577daf3b8eab3720da08f2045fdfda2fcba3485e7ca6efc364 |
Hashes for sgp4-2.22-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 125a4d11eb65d4ec21974062e9e4450a2f03aac23773c023b18ad951781faa12 |
|
MD5 | 6661c74e11aeb504b05011506b326512 |
|
BLAKE2b-256 | 27ccaff34e2e971e2676487b24ea7a4c11516f9c2de98bbb133b686ed765d3cb |
Hashes for sgp4-2.22-cp39-cp39-macosx_10_9_universal2.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | cec169fcebfd06f0edfb4e6d22351f4e920f144f2f36a7712cd21bab9eb59abf |
|
MD5 | 98d19dfc58287a74c87ecbd652726358 |
|
BLAKE2b-256 | 330f3dc0de3d952c8e21f68ffb3efeaa12eb8b07aa57f83ab6aa69560e916a18 |
Hashes for sgp4-2.22-cp38-cp38-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c109e20da8fb8d0e1ce4897753cb0e982698ff0515aa44a6982d4920961e5ca5 |
|
MD5 | 641c16a4e64ae5390a540ad23e7e5ce3 |
|
BLAKE2b-256 | 05242f466edd8d245cbab6702e529416ef805574b13c9652ceb99311dd05a6ea |
Hashes for sgp4-2.22-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 780b37daaf6d8ffe3368ebed257bb6deee36fa9c7db7be46492c2b1b7bd47ac9 |
|
MD5 | a809c9473dd9ac6b26651ecaf49df5fe |
|
BLAKE2b-256 | 6d68dfe9099b351ee5363003b70400dc23481c26a6f144207c9690abf402bd66 |
Hashes for sgp4-2.22-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1c683a2a1d693521d40c484db09d25a06661cb417b5a1a7ece04a06ebcae25c7 |
|
MD5 | 8540c4afdaf3b351eec3104ab4505253 |
|
BLAKE2b-256 | 0f63a647d74a73ff524b626d72a0e46342cef9a3cc0fdfa6d70672e2e62ea712 |
Hashes for sgp4-2.22-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b42c0f2497578deb895c7e00a82100b831dde556defe3624521c4f03a799a4a9 |
|
MD5 | 60f9570b54f5311b427e1c382fa13b3f |
|
BLAKE2b-256 | 10eb0f6f03099d2b158aec24fa57b5ea478baa16080bdde73491c12ce0513e42 |
Hashes for sgp4-2.22-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 98ba29f2b9648d72e6eca92b573565cd9385ff439228c54079ec2462b0d1cc4b |
|
MD5 | 3a1d27bce5884626adf4b092db4e6115 |
|
BLAKE2b-256 | ae0556bf7e83910f529ff1d171f8b508686138b48213cf66d643cbe6f108ee88 |
Hashes for sgp4-2.22-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f022bf76668f261e9da64f789fe7a332878efbe166eb6d86550a16bb17d97f1a |
|
MD5 | 6897ff3e167db07f19f5d8223019cce7 |
|
BLAKE2b-256 | f0f1050eefec117297a8ce818be3136726e1996102fa0da62366a47f304dfc62 |
Hashes for sgp4-2.22-cp38-cp38-macosx_10_9_universal2.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e7bec5192cb280ffbe72cf03246cd6af49964b8c25610fa8d57a6f2b3c56e2c9 |
|
MD5 | 799879fc6ff8948904e554497883d7df |
|
BLAKE2b-256 | 49c1410cb4dde0ac68f4e0d0257244236e557fd42adff289e8065eb25fb6db5f |
Hashes for sgp4-2.22-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1f58976a4ad700827d63230627fe236fdd726d886dc849ac1bf228851d4bcfbc |
|
MD5 | f7ff972c8aac6c658dbf41760addbaf7 |
|
BLAKE2b-256 | 15152a30c81bed94a13580afaeaa15b775ccf194c6c87e0401aa4dd7323ddeac |
Hashes for sgp4-2.22-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 577677457a7901301d3634ae028bbd958a4e39ec5dc278a06de6f5933992a20b |
|
MD5 | c251a25fc4c5908f1449561d9072fb3b |
|
BLAKE2b-256 | 1469f4c0a8f48a2f9478183509627d0e7180fe35782d697f49ca1b1a2ba90db8 |
Hashes for sgp4-2.22-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f92a1535f26568a420486d656cba591620425be2a8f475e3780b2393f71aa8c7 |
|
MD5 | fc40b2ffccdb92915dc037bd30cf40e5 |
|
BLAKE2b-256 | 5bd8a8399865d614420ec1217648a20afb58820517b57e78b03bfa27eb77b3a4 |
Hashes for sgp4-2.22-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 114bfdda7ff8e47759d1a2621c679797947ea997ce9a119f44e79f856f0afe1f |
|
MD5 | e15f3896a35a617293e8ddd56a2aefd7 |
|
BLAKE2b-256 | 9c6c9cf4417cb9adf4f196599c2e47ee77fec0f11035e486053a10bc684c1d6f |
Hashes for sgp4-2.22-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e9f04fe3d9d4874e547da471c37223355024d7f8193a97b7e2517cd73ca0e379 |
|
MD5 | fcfe853a6ced14e14eed25fc477f1f7a |
|
BLAKE2b-256 | 0a1c8abe70c03f5f16d24adb26fb8ff6e3a8041ec02c64dd435fefdb3bd52aa3 |
Hashes for sgp4-2.22-cp36-cp36m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d2526e10150beec0bb91b3fa55ef438158a31578417ad257088d0534f6f3de57 |
|
MD5 | 520d4769741bf5aa6fa960cb6f68024c |
|
BLAKE2b-256 | 583c9f4ab85d80339ffaa76927bfd837b6f3581e110949eff24f7a1875d0bea0 |
Hashes for sgp4-2.22-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7882390cc2465d61804ef061a640412b2bfc8f5eb708d44dfd1ba2f5ca229586 |
|
MD5 | 522fb440e0a407b668cbb8286b8565fd |
|
BLAKE2b-256 | 8f3d2d286fe9e16f73ca8cb9ed0d00ba1dcb42cdfb60b287c9e9c156c9ea619d |
Hashes for sgp4-2.22-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3f5033265a813807a1f22c126b1285fdddd288ea2d092563e590c3e059daa189 |
|
MD5 | 427a270ebd515a431ea8e95be934def3 |
|
BLAKE2b-256 | 95b543753c37be41e8e2bdf7f02563d36bc99e38a03a68a55028377bec39a31c |
Hashes for sgp4-2.22-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b121863da32db1ff180ed72c644e33ea8b87cbd441267bd65a8da303f5f195e0 |
|
MD5 | 678a3f8b3751580a247386d1fafe88f7 |
|
BLAKE2b-256 | ae7cf5996edcc1ffb7402372c3a7ac1f0b1060c095a7b819071188575975f6b8 |
Hashes for sgp4-2.22-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6ff82b3a91b5a475a3d91ad1b73f9877351c426530e2263248dc406fbfb35a0b |
|
MD5 | 62151585f814caa1be2bd91dd103fb0d |
|
BLAKE2b-256 | 3311fb7d4c4ba3d566e631826f865abe3f0af59121cc4712d2fbe4f8687b7b4c |