Python-API für JPL Horizons?

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 urlliboder einen JSON-Text mit Zustandsvektoren erhalten urllib2.


Update: Dies ist ein typisches Beispiel dafür, was ich tun möchte:

Geben Sie hier die Bildbeschreibung ein


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 :

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Wenn dies beispielsweise in einer weiteren Woche keine Hilfe anzieht, ist dies möglicherweise ein guter Kandidat für die Migration zu Stackoverflow zu diesem Zeitpunkt. Das pythonTag ist dort entscheidend.
Haben Sie versucht, mit telnetlibauf die Telnet-Schnittstelle zuzugreifen?
@2012rcampion OK - ich werde mich heute damit befassen! Wenn ich das richtig verstehe, müsste ich ein Python-Skript schreiben, das im Grunde eine Person emuliert, die Befehle eingibt und Eingabeaufforderungen erhält. Es ist möglich, dass jemand hier gute Arbeit geleistet und einen netten Interface-Wrapper geschrieben hat - mein ultimatives Ziel ist es zu sehen, ob jemand so etwas allgemein verfügbar gemacht hat. In der Zwischenzeit werde ich auf jeden Fall versuchen, was Sie vorgeschlagen haben. Vielen Dank!!
Wenn Sie das Skript längere Zeit nicht verwenden möchten, müssen Sie die Eingabeaufforderungen überhaupt nicht verarbeiten. Was ich getan habe, war, einen Datensatz manuell zu erhalten und dann mein Skript im Grunde dieselbe Sitzung mit einem konfigurierbaren Parameter wiedergeben zu lassen.
@2012rcampion OK, verstanden. Das Handbuch ist hilfreich, aber ich suche nach Beispielsitzungen, die für mich leichter zu verdauen sind. Ich habe ein Beispiel hinzugefügt, was ich in der Frage tun möchte. Wenn ich es zum Laufen bekomme, werde ich es als Antwort posten - wenn jemand anderes zuerst eine ähnliche Beispiel-Telnet-Sitzung oder ein Skript postet, werde ich gezwungen sein, es zu akzeptieren ! :)
@uhoh Ich habe tatsächlich versucht, mit einer Java-API dafür zu beginnen, nachdem Sie mich damit vertraut gemacht haben. Der einfachste Weg, eine API zu erstellen, besteht darin, einen Formsniffer zu verwenden und Abfragen für das Formular auf der Seite auszuführen. Sie können die gesendeten Daten abfangen und mit einer POST-Anforderung für die Backend-.cgi-Datei replizieren. Ich bin im Moment im Urlaub, aber wenn Sie möchten, dass ich ein Beispiel poste, wie dies in Python zu tun ist, helfe ich Ihnen gerne. Auch wenn es keine API gibt, können Sie mit Formularen und einfachen HTTP-Anforderungen VIEL tun. Sogar das Telnet könnte sehr gut funktionieren, um etwas zu automatisieren.

Antworten (3)

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=399nicht auf die Erde abzielte, aber das lag daran, dass die Klasse auch ein id-typeArgument 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.

Dies scheint eine potenziell sehr gute Nachricht zu sein! Ich habe gerade gefragt, wie genau man astroquery.jplhorizons verwendet, um die Zustandsvektoren von Merkur und der Parker-Sonnensonde zu erhalten?
Dies sind gute Informationen, aber es würde von etwas mehr Erklärungen im Beitrag profitieren, anstatt nur von einem Link. Hat das Astroquery-Projekt eine Readme oder ein Leitbild, das Sie vielleicht hier zitieren könnten?
Ok, ich habe ein paar mehr Infos hinzugefügt :)

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:

Geben Sie hier die Bildbeschreibung ein

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]
Scheint eine ziemlich coole Bibliothek zu sein! Ich hätte SpiceyPy empfohlen, das eine Schnittstelle zu SPICE ist, und SPICE führt JPL Horizons aus. Aber dann muss man die ganze Logik umschreiben.
@ChrisR Ich werde einen Blick darauf werfen. Können Sie erwägen, eine kurze Antwort zu hinterlassen, in der SpiceyPy erwähnt wird? Kommentare sind per Definition temporär, und selbst wenn sie vielleicht nicht perfekt zu „Python API for JPL Horizons?“ passen. es tut etwas Ähnliches genug, dass zukünftige Leser davon profitieren könnten. Muss keine lange Antwort sein, nur ein Link und eine Erklärung, dass man, wenn man automatisch auf Horizons zugreifen möchte, wirklich nur auf SPICE zugreift und daher sollte man wissen, dass der Mittelsmann von Horizons nicht immer notwendig ist.

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>
Javascript-Quelle hinzugefügt (Sie haben auch gefragt: "Ich möchte eine URL-Abfrage erstellen und im Gegenzug einen JSON-Text mit Zustandsvektoren erhalten"). Leider kann ich in Horizons keine JSON-Ausgabeoption sehen.
oh du hast recht, hab ich! Das war vor 2,5 Jahren, kurz vor dem Start. Ich habe diese Allergie gegen geschweifte Klammern, daher kann ich nur Python verwenden. Ich denke, Ihre Antwort ist hilfreich und ich habe abgestimmt, aber es gibt jetzt mehrere Python-Pakete, die dies tun. Ich würde aber kein JSON mehr verwenden. Danke noch einmal!