File:Interstellar probes trajectory.svg

Original file (SVG file, nominally 512 × 819 pixels, file size: 626 KB)

Summary

Description
English: Plots of heliocentric positions of the interstellar probes (squares), and outer planets, Pluto, Arrokoth and Earth (circles) from 1972 to 2030, and launch and flyby dates by CMG Lee.

Plot 1 is a view of the solar system to scale from north perpendicular to the ecliptic with the First Point of Aries upwards; plots 2 to 4 are third-angle orthographic projections of their trajectories up to 2030 at 20% scale of plot 1.

Markers denote positions on 1 January of each year, with every fifth year labelled. Data is from COHOWeb and Horizons On-Line Ephemeris System.

In the SVG file, hover over a trajectory to highlight it.
Source Own work
Author Cmglee
Other versions

[edit]

SVG development
InfoField
 The SVG code is valid.
 This vector image was created with an unknown SVG tool.
  This file uses embedded text that can be easily translated using a text editor.

Updating data

To populate with new data, visit http://omniweb.gsfc.nasa.gov/coho/helios/heli.html and select List data, object, Solar Ecliptic, Daily, 2 and start and stop years. For Arrokoth, visit http://ssd.jpl.nasa.gov/horizons/app.html and select Observer Table, 486958, 500@10, time and in Table Settings, only Heliocentric ecliptic lon. & lat. and Heliocentric range & range-rate. Save as text files in cohoweb and horizons subfolders, respectively, run the following, and copy the output into the Python script embedded in the SVG.

#!/usr/bin/env python

import re, datetime, collections

bodyss = [
 {'name':'Mercury'     ,'is_probe':False,'is_cohoweb':True },
 {'name':'Venus'       ,'is_probe':False,'is_cohoweb':True },
 {'name':'Earth'       ,'is_probe':False,'is_cohoweb':True },
 {'name':'Mars'        ,'is_probe':False,'is_cohoweb':True },
 {'name':'Jupiter'     ,'is_probe':False,'is_cohoweb':True },
 {'name':'Saturn'      ,'is_probe':False,'is_cohoweb':True },
 {'name':'Uranus'      ,'is_probe':False,'is_cohoweb':True },
 {'name':'Neptune'     ,'is_probe':False,'is_cohoweb':True },
 {'name':'Pluto'       ,'is_probe':False,'is_cohoweb':True },
 {'name':'Ultima Thule','is_probe':False,'is_cohoweb':False},
 {'name':'Pioneer 10'  ,'is_probe':True ,'is_cohoweb':True },
 {'name':'Pioneer 11'  ,'is_probe':True ,'is_cohoweb':True },
 {'name':'Voyager 2'   ,'is_probe':True ,'is_cohoweb':True },
 {'name':'Voyager 1'   ,'is_probe':True ,'is_cohoweb':True },
 {'name':'New Horizons','is_probe':True ,'is_cohoweb':True },
]
yyyymmdd_min = '19700101'
yyyymmdd_max = '20300101'

def tabbify(cellss, separator='|'):
 cellpadss = [list(rows) + [''] * (len(max(cellss, key=len)) - len(rows)) for rows in cellss]
 fmts = ['%%%ds' % (max([len(str(cell)) for cell in cols])) for cols in zip(*cellpadss)]
 return '\n'.join([separator.join(fmts) % tuple(rows) for rows in cellpadss])

## Convert (year, day of year) to (month, day)

month_day_nonleaps = [None]
month_day_leaps    = [None]
for doy in range(1, 365 + 1):
 dt = datetime.datetime.strptime('2001 %d' % (doy), '%Y %j')
 month_day_nonleaps.append((dt.month, dt.day))
for doy in range(1, 366 + 1):
 dt = datetime.datetime.strptime('2000 %d' % (doy), '%Y %j')
 month_day_leaps.append((dt.month, dt.day))
# print(month_day_nonleaps)
# print(month_day_leaps)
def is_leap(year):
 y = year // 100 if (year % 100 == 0) else year
 return y % 4 == 0
def year_doy_to_month_day(year, doy):
 return (month_day_leaps if (is_leap(year)) else month_day_nonleaps)[doy]
# print(year_doy_to_month_day(2018, 365))

## Convert month name to month number

months = collections.OrderedDict()
for month in range(1, 12 + 1):
 index = (month - 1) * 3
 months['JanFebMarAprMayJunJulAugSepOctNovDec'[index:index + 3].upper()] = month
print(months)

## Read files

datasss = {} ## [yyyymmdd][name][au,lat,lon]
for bodys in bodyss:
 name       = bodys['name']
 is_cohoweb = bodys['is_cohoweb']
 is_probe   = bodys['is_probe']
 path = '%s/%s.txt' % ('cohoweb' if (is_cohoweb) else 'horizons',
                       name.replace(' ', '').lower())
 with open(path) as f: lines = [line.strip() for line in f.readlines()]
 # lines = lines[:100]
 is_launch = is_probe # True
 for line in lines:
  if (not re.findall(r'^\d', line)): continue
  fields = line.split()
  if (is_cohoweb):
   year         = int  (fields[0])
   doy          = int  (fields[1])
   au           = float(fields[-3])
   lat          = float(fields[-2])
   lon          = float(fields[-1])
   (month, day) = year_doy_to_month_day(year, doy)
  else: ## not cohoweb
   ymd                =       fields[0]
   if (not '-' in ymd): continue
   au                 = float(fields[4])
   lon                = float(fields[2])
   lat                = float(fields[3])
   (year, month, day) = ymd.split('-')
   (year, month, day) = (int(year), months[month.upper()], int(day))
  if (not (is_launch or day == 1)): continue
  is_launch = False
  yyyymmdd = '%04d%02d%02d' % (year, month, day)
  if (yyyymmdd < yyyymmdd_min): continue
  if (yyyymmdd > yyyymmdd_max): continue
  if (not yyyymmdd in datasss): datasss[yyyymmdd] = {}
  datasss[yyyymmdd][name] = (au, lat, lon)

## Create and write table

outss = [['BODY->'  ] + [bodys['name']     for bodys in bodyss],
         ['YYYYMMDD'] + ['AU  SElat SElon' for bodys in bodyss]]
for yyyymmdd in sorted(datasss):
 outs   = [yyyymmdd]
 datass = datasss[yyyymmdd]
 for bodys in bodyss:
  name = bodys['name']
  outs.append('%.2f%+5.1f%6.1f' % datass[name] if (name in datass) else '')
 outss.append(outs)
# outss = outss[:80]

with open(re.sub(r'py$', r'txt', __file__), 'w') as f:
 f.write('%s\n' % (tabbify(outss)))

Licensing

I, the copyright holder of this work, hereby publish it under the following licenses:
w:en:Creative Commons
attribution share alike
This file is licensed under the Creative Commons Attribution-Share Alike 4.0 International license.
You are free:
  • to share – to copy, distribute and transmit the work
  • to remix – to adapt the work
Under the following conditions:
  • attribution – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
  • share alike – If you remix, transform, or build upon the material, you must distribute your contributions under the same or compatible license as the original.
GNU head Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License.
You may select the license of your choice.

Captions

Add a one-line explanation of what this file represents

Items portrayed in this file

depicts

image/svg+xml

File history

Click on a date/time to view the file as it appeared at that time.

(newest | oldest) View (newer 10 | ) (10 | 20 | 50 | 100 | 250 | 500)
Date/TimeThumbnailDimensionsUserComment
current03:49, 28 November 2025Thumbnail for version as of 03:49, 28 November 2025512 × 819 (626 KB)CmgleeFix frame position and circle stroke width // Editing SVG source code using c:User:Rillke/SVGedit.js
19:17, 26 November 2025Thumbnail for version as of 19:17, 26 November 2025512 × 819 (629 KB)CmgleeAvoid plots overlapping Arrokoth and Pluto labels
17:35, 26 November 2025Thumbnail for version as of 17:35, 26 November 2025512 × 819 (630 KB)CmgleeExtend to 2030
16:10, 26 November 2025Thumbnail for version as of 16:10, 26 November 2025512 × 768 (505 KB)CmgleeWork around stretched text alignment rsvg bug http://phabricator.wikimedia.org/T370044
04:19, 25 November 2025Thumbnail for version as of 04:19, 25 November 2025512 × 768 (510 KB)CmgleeVertically mirror side and front elevation as per http://commons.wikimedia.org/wiki/File_talk:Interstellar_probes_trajectory.svg#Request_to_reconfirm
13:22, 17 November 2019Thumbnail for version as of 13:22, 17 November 2019512 × 768 (504 KB)CmgleeAdd view labels, detail boundary and highlighting of associated objects on hover.
07:04, 13 November 2019Thumbnail for version as of 07:04, 13 November 2019512 × 768 (501 KB)Mrmwen:special:permalink/925906316#Update_needed_on_illustration. // Editing SVG source code using c:User:Rillke/SVGedit.js
01:55, 13 November 2019Thumbnail for version as of 01:55, 13 November 2019512 × 768 (503 KB)ДрейгоричReverted to version as of 23:03, 22 January 2019 (UTC) - Something broke.
01:51, 13 November 2019Thumbnail for version as of 01:51, 13 November 2019744 × 1,052 (511 KB)ДрейгоричUltima Thule ---> Arrokoth.
23:03, 22 January 2019Thumbnail for version as of 23:03, 22 January 2019512 × 768 (503 KB)CmgleeAdd Ultima Thule.
(newest | oldest) View (newer 10 | ) (10 | 20 | 50 | 100 | 250 | 500)

Global file usage

The following other wikis use this file:

Metadata