使用JPL提供的HORIZONS服务查询太阳系天体轨道参数
需要对网络做一些设置,也需要对源代码做一些改变。
在Python里使用系统安装的Shadowsocks穿墙
系统的ShadowsocksX在运行时,会自动在本机开启代理服务,端口号是1080。
通过下面的代码可以让urllib
通过这个代理连接外网:
1
2
3
4
import socks
import socket
socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 1080)
socket.socket = socks.socksocket
测试:
1
2
3
4
5
import urllib
res = urllib.request.urlopen(
'https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/de432s.bsp',
timeout=50)
r = res.read()
在命令行使用ShadowsocksX的代理,测试ShadowsocksX有没有起作用:
1
curl --socks5 127.0.0.1:1080 http://cip.cc
可以与下面命令的结果比较:
1
curl http://cip.cc
对比上面两个命令的结果应该可以看出差别;第一个命令的输出应该出现ShadowsocksX服务器的地址。
修改astropy源代码
在使用astropy
连接JPL的HORIZONS服务时,需要对源代码做少量修改。
astropy/coordinates/solar_system.py
:
把
1
2
value = ('http://naif.jpl.nasa.gov/pub/naif/generic_kernels'
'/spk/planets/{:s}.bsp'.format(value.lower()))
里的http
改成https
。
astropy/utils/iers/iers.py
:
把
1
IERS_A_URL = 'http://maia.usno.navy.mil/ser7/finals2000A.all'
里的maia.usno.navy.mil
改成199.211.133.23
;这是由于域名解析问题。
查询HORIZONS并画图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
pmo_dlh = {'lon': 97.56,
'lat': 37.37,
'elevation': 3.2}
obj = Horizons(id='900543', # Comet 46P
location=pmo_dlh,
epochs={'start': '2018-12-14',
'stop': '2018-12-18',
'step': '10m'})
eph = obj.ephemerides()
fig = plt.figure(figsize=(8, 8))
ax = fig.add_axes((0.1, 0.57, 0.85, 0.4))
ax.plot(eph['datetime_jd'], eph['delta_rate'])
ax.set_ylabel(r'Velocity$_{\rm obs}$ (km/s)')
ax.yaxis.set_minor_locator(ticker.AutoMinorLocator())
ax.xaxis.set_minor_locator(ticker.AutoMinorLocator(n=4))
days = ['2018-12-'+str(d) for d in range(14, 31)]
xticks = [Time(t).jd for t in days]
ax.set_xticks(xticks)
ax.set_xticklabels([])
ax.grid(axis='both', which='major', color=(0,0,0))
ax.grid(axis='both', which='minor', color=(0.6,0.6,0.6))
ax = fig.add_axes((0.1, 0.15, 0.85, 0.4))
ax.plot(eph['datetime_jd'], eph['delta'])
ax.set_xlabel('Date')
ax.set_ylabel(r'Distance (AU)')
xticks = [Time(t).jd for t in days]
ax.set_xticks(xticks)
ax.set_xticklabels(days)
ax.xaxis.set_minor_locator(ticker.AutoMinorLocator(n=4))
for tick in ax.xaxis.get_ticklabels():
tick.set_rotation(60)
ax.grid(axis='both', which='major', color=(0,0,0))
ax.grid(axis='both', which='minor', color=(0.6,0.6,0.6))