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.degrees
和 g.latitude.degrees
并直接使用这些十进制数。
我正在尝试制作一个程序,该程序获取国际空间站的纬度和经度坐标(来自 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.degrees
和 g.latitude.degrees
并直接使用这些十进制数。