python - Skyfield 中地球的形状似乎不对 - 我的 python 正确吗?

标签 python numpy skyfield

使用 Skyfield 映射从地球中心到各种 (lat, lon) 位置的距离显示随纬度变化但与经度无关(亚毫米)。这可能是包中记录的近似值、我的脚本中的错误,或者其他的东西。我在这里做错了什么吗? (此外,当然,使用 jet )

uhoh topo

import numpy as np
import matplotlib.pyplot as plt
from skyfield.api import load, now

data  = load('de421.bsp')
earth = data['earth']
jd    = now()

epos = earth.at(jd).position.km

lats = np.linspace( -90,  90, 19)
lons = np.linspace(-180, 180, 37)
LATS, LONS = np.meshgrid(lats, lons)

s = LATS.shape

points = zip(LATS.flatten(), LONS.flatten())

rr = []
for point in points:
    la, lo = point
    pos = earth.topos(la, lo).at(jd).position.km
    r   = np.sqrt( ((pos-epos)**2).sum() )
    rr.append(r)

surf = np.array(rr).reshape(s)

extent = [lons.min(), lons.max(), lats.min(), lats.max()]

plt.figure()
plt.imshow(surf.T, origin='lower', extent=extent)
plt.colorbar()
plt.title('uhoh topo')
plt.savefig('uhoh topo')
plt.show()

作为交叉检查,我尝试了一些具有相同纬度的随机位置对:

pe = earth.at(jd).position.km
for i in range(10):

    lon1, lon2 = 360.*np.random.random(2)-180
    lat = float(180.*np.random.random(1)-90.)

    p1  = earth.topos(lat, lon1).at(jd).position.km
    p2  = earth.topos(lat, lon2).at(jd).position.km

    r1   = np.sqrt( ((p1-pe)**2).sum() )
    r2   = np.sqrt( ((p2-pe)**2).sum() )

    print lat, lon1, lon2, r2-r1

得到了这个(第四列显示了微米的差异):

45.8481950437 55.9538249618 115.148786114 1.59288902069e-08
-72.0821405192 4.81264755835 172.783338907 2.17096385313e-09
51.6126938075 -54.5670258363 -134.888403816 2.42653186433e-09
2.92691713179 -178.553103457 134.648099589 1.5916157281e-10
-78.7376163827 -55.0684703115 125.714124504 -6.13908923697e-10
48.5852207923 -169.061708765 35.5374862329 7.60337570682e-10
42.3767785876 130.850223447 -111.520896867 -1.62599462783e-08
11.2951212126 -60.0296460731 32.8775784623 6.91579771228e-09
18.9588262131 71.3414406837 127.516370219 -4.84760676045e-09
-31.5768658495 173.741960359 90.3715297869 -6.78483047523e-10

最佳答案

topos() 方法包含您未指定的 elevation_m=0.0。因此,在您的每次调用中,它都采用默认值 0.0 米海拔。并且“海平面”的定义不随经度而变化——在给定的纬度下,海平面在整个世界范围内与地心的距离是固定的。

我不确定为什么您将微米级误差称为“相当大的近似值”,但当您减去两个距离约为 1 时,您确实遇到了机器 64 位 float 学的有限精度au 的长度——您在最后一两位看到舍入误差。

关于python - Skyfield 中地球的形状似乎不对 - 我的 python 正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34870588/

相关文章:

python - 使用 opencv 和 ffmpeg 制作视频。如何找到合适的颜色格式?

python - scikit-learn 的 adaboost 中的权重问题

python - 使用 Pandas groupby 迭代和修改数据框

python - 为什么 brew 安装 python 包而不是 pip 安装(反之亦然)?

macos - 如何找到我的IDLE的Python,然后将pip升级应用到它使用的包?

satellite - 从瞬时开普勒元素生成 TLE(双线元素)文件是否合法?

python - x[::-1] 实际上是如何工作的?

Python for 和 if 在一行

python - 尝试使用 matplotlib 绘制大型数组时出现内存错误

python - 为什么 scipy.optimize.minimize(默认)报告成功而不用 Skyfield 移动?