Ich habe das Python-Paket HorizonJPL im Python Package Index gefunden , aber es sieht so aus, als wäre es auf Aktivitäten im Jahr 2013 beschränkt ist ziemlich spärlich, und die beiden Links dort führen auf Japanisch in eine Sackgasse (unten).
Gibt es eine Möglichkeit , von einem Python-Skript aus auf JPL Horizons für Datentabellen zuzugreifen (wie ich es hier tue )? Mit anderen Worten, ich möchte eine URL-Abfrage erstellen und im Gegenzug mit urllib
oder einen JSON-Text mit Zustandsvektoren erhalten urllib2
.
Update: Dies ist ein typisches Beispiel dafür, was ich tun möchte:
Dies ist, was auf der pypi-Site angezeigt wird - es scheint Namen/Handles zu geben, aber ich weiß nicht, wie ich sie abfragen soll.
API-Dokumentation
https://docs.google.com/document/d/1g9q3ln9LVAATOZ15986HLTCaqcAj_Jd8e_jOGS3YWrE/pub
Ressourcen
Planetarisches Datensystem: http://pds.nasa.gov/
Jet Propulsion Labs: http://www.jpl.nasa.gov/
HORIZON-Benutzerhandbuch: http://ssd.jpl.nasa.gov/?horizons_doc
Mitwirkende
Matthew Mihok (@mattmattmatt)
Dexter Jagula (@djagula)
Siddarth Kalra (@SiddarthKalra)
Tiago Moreira (@Kamots)
Folgendes passiert, wenn ich die Links im Google-Dokument ausprobiere :
callhorizons ist jetzt veraltet und verweist auf die Python-Bibliothek astroquery
, die jetzt der richtige Weg zu sein scheint.
astroquery ( GitHub , readthedocs ) ist „ein mit Astropy verbundenes Paket, das eine Sammlung von Tools enthält, um online auf astronomische Daten zuzugreifen. Jeder Webdienst hat sein eigenes Unterpaket“, wobei das Erstellen von Horizons-Abfragen nur eine von vielen Optionen ist. Es ist Teil des größeren Astropy-Projekts , das „eine Gemeinschaftsanstrengung zur Entwicklung eines gemeinsamen Kernpakets für Astronomie in Python und zur Förderung eines Ökosystems interoperabler Astronomiepakete“ ist.
Ich empfehle, die Dokumentationsseite für JPL Horizons-Abfragen für Astroquery zu lesen, die hier zu finden ist: https://astroquery.readthedocs.io/en/latest/jplhorizons/jplhorizons.html Es listet einige gute Beispiele auf, z.
from astroquery.jplhorizons import Horizons
obj = Horizons(id='Ceres', location='568',
epochs={'start':'2010-01-01', 'stop':'2010-03-01', 'step':'10d'})
eph = obj.ephemerides()
print(eph)
targetname datetime_str datetime_jd ... GlxLat RA_3sigma DEC_3sigma
--- --- d ... deg arcsec arcsec
---------- ----------------- ----------- ... --------- --------- ----------
1 Ceres 2010-Jan-01 00:00 2455197.5 ... 24.120057 0.0 0.0
1 Ceres 2010-Jan-11 00:00 2455207.5 ... 20.621496 0.0 0.0
1 Ceres 2010-Jan-21 00:00 2455217.5 ... 17.229529 0.0 0.0
1 Ceres 2010-Jan-31 00:00 2455227.5 ... 13.97264 0.0 0.0
1 Ceres 2010-Feb-10 00:00 2455237.5 ... 10.877201 0.0 0.0
1 Ceres 2010-Feb-20 00:00 2455247.5 ... 7.976737 0.0 0.0
Ich empfehle auch, die Dokumente der HorizonsClass zu überfliegen . Insbesondere war ich anfangs verwirrt, dass das Festlegen des Ziels id=399
nicht auf die Erde abzielte, aber das lag daran, dass die Klasse auch ein id-type
Argument akzeptiert, das standardmäßig smallbody
(Asteroiden und dergleichen) ist und in geändert werden musste majorbody
.
Es scheint sehr einfach zu bedienen und ist jetzt eindeutig der richtige Weg.
PS: Ich möchte erwähnen, dass ich einen Fehler KeyError: 'Obsrv-lon'
für meine spezielle Abfrage erhalten habe, aber das Problem wird untersucht.
Jetzt gibt es einen! Ich bin gerade auf das Python-Paket callhorizons in github und Python Package Index gestoßen .
Es gibt weitere Informationen in readthedocis.io , die erklären, wie man Abfragen durchführt, wenn man nach Asteroiden/kleineren Körpern sucht, für die es Millionen gibt und die Namen Personennamen oder alphanumerische Zeichen sein können.
Ich werde versuchen, es weiter zu testen und hier zu aktualisieren. Es sieht so aus, als ob hier eine Menge Fähigkeiten vorhanden sind, aber ich kann es noch nicht mit Sicherheit sagen. Es gibt einen Blogpost von einem Astronomen , aber er ist von Januar 2016.
Es war eine einzeilige Installation, nämlich pip install callhorizons
. Ich habe dann die einfache Demo oben auf der PyPI-Seite eingegeben und eine Antwort erhalten!
>>> import callhorizons
>>> eros = callhorizons.query('Eros')
>>> eros.set_discreteepochs([2457446.177083, 2457446.182343])
>>> eros.get_ephemerides(568)
2
>>> print(eros['RA'], eros['DEC'])
(array([ 292.46003, 292.46332]), array([-27.44392, -27.44335]))
>>>
Juhu Python!
Die aktuelle Version ist ein reines Python-Skript und enthält den Kommentar:
CALLHORIZONS - a Python interface to access JPL HORIZONS
ephemerides and orbital elements.
This module provides a convenient python interface to the JPL
HORIZONS system by directly accessing and parsing the HORIZONS
website. Ephemerides can be obtained through get_ephemerides,
orbital elements through get_elements. Function
export2pyephem provides an interface to the PyEphem module.
michael.mommert (at) nau.edu, latest version: v1.0.5, 2017-05-05.
This code is inspired by code created by Alex Hagen.
Derzeit generiert es nur die Abfrage-URL für eine Beobachtertabelle, keine Zustandsvektoren, aber es könnte sicherlich leicht angepasst werden, um Zustandsvektoren zu erhalten. Hier ist ein kleiner Teil, zusätzliche Parameter werden der URL-Zeichenfolge hinzugefügt, bevor sie verwendet wird.
### construct URL for HORIZONS query
url = "http://ssd.jpl.nasa.gov/horizons_batch.cgi?batch=l" \
+ "&TABLE_TYPE='OBSERVER'" \
+ "&QUANTITIES='" + str(quantities) + "'" \
+ "&CSV_FORMAT='YES'" \
+ "&ANG_FORMAT='DEG'" \
+ "&CAL_FORMAT='BOTH'" \
+ "&SOLAR_ELONG='" + str(solar_elongation[0]) + "," \
+ str(solar_elongation[1]) + "'" \
+ "&CENTER='"+str(observatory_code)+"'"
OK, versuchen Sie es mit einem Raumschiff, das auch vom Mauna Kea aus gesehen wird. Von JPL Horizons mit folgendem Setup:
ergibt (scrollt horizontal):
**********************************************************************************************************************************
Date_________JDUT, , ,R.A._(ICRF/J2000.0), DEC_(ICRF/J2000.0), APmag, S-brt, delta, deldot, S-O-T,/r, S-T-O,
**********************************************************************************************************************************
$$SOE
2457754.500000000,*,m,20 01 24.54,-56 59 28.4, n.a., n.a., 1.7047550022E+10, 18.9796569, 36.6514,/T, 0.2976,
2457784.500000000,*,m,20 03 22.69,-56 58 00.2, n.a., n.a., 1.7080283550E+10, 6.5439542, 40.6419,/L, 0.3218,
2457814.500000000,*,m,20 05 08.36,-57 01 24.2, n.a., n.a., 1.7082950019E+10, -3.4910462, 59.2751,/L, 0.4270,
2457844.500000000,*,m,20 06 16.02,-57 09 10.1, n.a., n.a., 1.7065586218E+10, -8.4792450, 82.4692,/L, 0.4975,
2457874.500000000,*,m,20 06 30.25,-57 19 39.5, n.a., n.a., 1.7043227392E+10, -7.3046878, 106.0860,/L, 0.4870,
2457904.500000000,*,m,20 05 49.21,-57 30 32.2, n.a., n.a., 1.7031649793E+10, -0.4854246, 127.5819,/L, 0.4048,
2457934.500000000,*,m,20 04 24.98,-57 39 21.6, n.a., n.a., 1.7043463848E+10, 10.1577911, 141.9907,/L, 0.3144,
$$EOE
**********************************************************************************************************************************
Vergleichen Sie mit diesem Skript:
import callhorizons
import numpy as np
JDs = [2457754.5 + 30*i for i in range(7)] # 01-Jan-2017 00:00 UTC + n*30 days
V2 = callhorizons.query(-32, smallbody=False) # -32 for Voyager 2
V2.set_discreteepochs(JDs)
V2.get_ephemerides(568) # 568 for Mauna Kea
radecs = np.vstack((V2['RA'], V2['DEC']))
for JD, radec in zip(JDs, radecs.T):
print JD, radec
Eine Stichprobenkontrolle zeigt, dass diese gleich sind, super! Fyi, die sehr große scheinbare Bewegung ist auf Parallaxe zurückzuführen - die Erde ändert jeden Monat ihre Perspektive. Nach einem Jahr ändert sich die Position tatsächlich nur um wenige Zehntel Grad.
2457754.5 [ 300.35226 -56.99121]
2457784.5 [ 300.84454 -56.96671]
2457814.5 [ 301.28482 -57.0234 ]
2457844.5 [ 301.56676 -57.1528 ]
2457874.5 [ 301.62605 -57.32765]
2457904.5 [ 301.45504 -57.50895]
2457934.5 [ 301.10407 -57.65601]
Wählen Sie Ihre Eingabeparameter in Horizons und klicken Sie dann auf diesen Link (Link von „show batch-file data“ auf der Horizons-Seite): https://ssd.jpl.nasa.gov/horizons.cgi?show=1#results
Sie erhalten so etwas:
!$$SOF
BEFEHL = '-64'
MITTE= '500@0'
MAKE_EPHEM= 'JA'
TABLE_TYPE= 'VEKTOREN'
START_TIME= '2018-10-1'
STOP_TIME= '2018-10-30'
STEP_SIZE= '1 d'
OUT_UNITS= 'AU-D'
REF_PLANE= 'EKLIPPE'
REF_SYSTEM= 'J2000'
VECT_CORR= 'NONE'
VEC_LABELS= 'JA'
VEC_DELTA_T= 'NEIN'
CSV_FORMAT= 'NEIN'
OBJ_DATA= 'JA'
VEC_TABLE= '3'
!$$EOF
Entfernen Sie Zeilen, die mit "!" beginnen.
Kopieren Sie den restlichen Text in Ihren bevorzugten Text+Hex-Editor und nehmen Sie diese Ersetzungen vor:
0d0a --> & (Wagenrücklauf zu "&") ' --> %27 Leerzeichen --> %20
Sie erhalten eine einzelne Zeile, die Sie an diese Teil-URL anhängen können:
https://ssd.jpl.nasa.gov/horizons_batch.cgi?batch=1&
Das Ergebnis ist im "gemischten CSV"-Format (dh CSV mit Müll ...)
Diese Javascript-Quelle konvertiert die Horizons-Ausgabe in eine gültige URL und öffnet sie:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>NASA Horizons URL generator</title>
</head>
<script src="js/jquery.js"></script>
<script>
$( document ).ready(function() { // After page load is complete...
$("#btnGo" ).click(function() { // Associate function to the button to monitor clicking.
commandsText = $('textarea#commands').val(); // Upon clicking, assign textarea content to variable.
commandsText = commandsText.replace(/\r/g,'&'); // Replace carriage returns
commandsText = commandsText.replace(/\n/g,'&'); // Replace carriage returns
commandsText = commandsText.replace(/ /g,"%20"); // Replace spaces
commandsText = commandsText.replace(/\'/g,'%27'); // Replace quotes
var fullURL = "https://ssd.jpl.nasa.gov/horizons_batch.cgi?batch=1&" + commandsText; //* Prepend URL base
$('textarea#URL').val(fullURL)
window.open(fullURL); // Open Url
});
});
</script>
<body>
<a href="https://ssd.jpl.nasa.gov/horizons.cgi">Source</a>:<br>
<textarea id="commands" name="commands" rows = "30" cols = "50"></textarea><br>
<br>
Resulting URL:<br>
<textarea id="URL" name="URL" rows = "30" cols = "50"></textarea><br>
<button id="btnGo" name="btnGo">Go</button>
</body>
</html>
äh
python
Tag ist dort entscheidend.2012rcampion
telnetlib
auf die Telnet-Schnittstelle zuzugreifen?äh
2012rcampion
äh
Magische Oktopus-Urne