Skyfield 返回不正确的纬度和经度坐标?

Skyfield returning incorrect latitude and longitude coordinates?

我正在尝试制作一个程序,该程序获取国际空间站的纬度和经度坐标(来自 Skyfield API)并将其绘制到散点图上(使用 matplotlib)以显示其估计的轨道路径。问题是当它被绘制到散点图上时,有一堆异常值(最初我认为它们只是随机的,但在为一个轨道的每一秒绘制数据点之后,结果证明是某种其他类型的波模式)。

Skyfield returns 它的纬度和经度坐标采用度分小时 (DMS) 格式,为了将它们绘制到图表上,我将它们转换为十进制度 (DD) 并插入每一对lat lon coords 成一个列表 - 所以也许这可能是一些数学问题?下图显示了国际空间站轨道每一秒的纬度和经度图,代码是 DMS 到 DD 转换器函数,后跟(基本上是默认的 matplotlib 散点图代码。

ISS lat lon scatterplot image

def dms2dd(latdms, londms):
latdd = str(latdms)
for num in range(1, 11):
    if '0' + str(num) in latdd:
        latdd = latdd.replace('0', '')
if ' deg' in latdd or " '" in latdd or ' "' in latdd or ' ."' in latdd:
    latdd = latdd.replace(' deg', '(')
    latdd = latdd.replace(" '", '')
    latdd = latdd.replace(' "', '(')
    latdd = latdd.replace(' ."', '')
if latdd.startswith('-'):
    latdd = latdd.replace('deg', ' + (-')
    latdd = latdd.replace("'", '/60) + (-')
    latdd = latdd.replace('"', '/3600)')
else:
    latdd = latdd.replace('-', '')
    latdd = latdd.replace('deg', ' + (')
    latdd = latdd.replace("'", '/60) + (')
    latdd = latdd.replace('"', '/3600)')
for x in range(0, 4):
    latdd = latdd.removesuffix('+ (-')
    latdd = latdd.removesuffix(' + (')
latdd = latdd.replace(' ', '')
latdd = eval(latdd)

londd = str(londms)
for num in range(1, 11):
    if '0' + str(num) in londd:
        londd = londd.replace('0', '')
if ' deg' in londd or " '" in londd or ' "' in londd or ' ."' in londd:
    londd = londd.replace(' deg', '(')
    londd = londd.replace(" '", '')
    londd = londd.replace(' "', '(')
    londd = londd.replace(' ."', '')
if londd.startswith('-'):
    londd = londd.replace('deg', ' + (-')
    londd = londd.replace("'", '/60) + (-')
    londd = londd.replace('"', '/3600)')
else:
    londd = londd.replace('-', '')
    londd = londd.replace('deg', ' + (')
    londd = londd.replace("'", '/60) + (')
    londd = londd.replace('"', '/3600)')
for x in range(0, 4):
    londd = londd.removesuffix('+ (-')
    londd = londd.removesuffix(' + (')
londd = londd.replace(' ', '')
londd = eval(londd)

return latdd, londd



plt.style.use('_mpl-gallery')

# datalat and datalon are just the list versions of the latitude and longitude coords
y = datalat
x = datalon
colors = np.random.uniform(15, 80, len(x))
fig, ax = plt.subplots()
ax.scatter(x, y, s=5, c=colors, vmin=100, vmax=100)
ax.set(xlim=(-180, 180), xticks=np.arange(-180, 180),
       ylim=(-90, 90), yticks=np.arange(-180, 180))
plt.show()

幸运的是,Skyfield 将十进制度直接用于经度和纬度,因此您无需解析字符串。根据此处的文档,经度和纬度都是 Angle class 的实例:

https://rhodesmill.org/skyfield/api-topos.html#skyfield.toposlib.GeographicPosition.latitude

Angle 直接提供度数、小时和弧度:

https://rhodesmill.org/skyfield/api-units.html#skyfield.units.Angle

所以给定一个地理位置 g,你应该可以求出它的 g.longitude.degreesg.latitude.degrees 并直接使用这些十进制数。