利用NASA的数据接口制作国际空间站实时跟踪器

Crossin的编程教室

共 3064字,需浏览 7分钟

 ·

2021-02-01 23:20




大家好,欢迎来到 Crossin的编程教室 !

今天给大家分享一个开源项目:Open Notify。它的目的是将 NASA(美国国家航空航天局)的一些数据开放为简单的编程接口。

open-notify.org 的作者做了一些工作,以获取原始数据并将其转换为与太空和航天器有关的API。

本文将通过这个接口,获取得到国际空间站的位置,并实时地绘制到地图上:

感谢 cr0sis/Real-time-International-space-station-tracker 的贡献。

为了实现本文的目标,你得先安装 ISS_Info:

pip install ISS-Info


下面分步骤讲解整套绘制流程

1.地图初始化

为了实时展示国际空间站的路径,需要使用turtle绘制曲线,因此可以创建一个turtle画布,将背景设为地球:

import ISS_Infoimport turtleimport timeimport jsonimport urllib.request
screen = turtle.Screen()screen.setup(720,360)screen.setworldcoordinates(-180,-90,180,90)screen.bgpic("map.png")screen.bgcolor("black")screen.register_shape("isss.gif")screen.title("Real time ISS tracker")
iss = turtle.Turtle()iss.shape("isss.gif")

2.获取空间站的人数

如果能知道空间站上的宇航员人数,我们就能更加准确的跟踪国际空间站。幸运的是open-notify确实提供了这样的接口。

为了获取人数信息,我们必须向下列接口求拿到数据,并将相应的宇航员名字写在左上角
http://api.open-notify.org/astros.json

astronauts = turtle.Turtle()astronauts.penup()astronauts.color('black')astronauts.goto(-178,86)astronauts.hideturtle()url = "http://api.open-notify.org/astros.json"response = urllib.request.urlopen(url)result = json.loads(response.read())print("There are currently " + str(result["number"]) + " astronauts in space:")print("")astronauts.write("People in space: " + str(result["number"]), font=style)astronauts.sety(astronauts.ycor() - 5)
people = result["people"]
for p in people: print(p["name"] + " on: " + p["craft"]) astronauts.write(p["name"] + " on: " + p["craft"], font=style)    astronauts.sety(astronauts.ycor() - 5)



3.绘制空间站位置

为了能够绘制空间站的实时位置,我们需要请求拿到空间站的位置信息。请求的接口是:
http://api.open-notify.org/iss-now.json

不过作者将其封装成了一个函数,我们直接调用 iss_current_loc 即可,循环获取国际空间站位置:

while True:      location = ISS_Info.iss_current_loc()    lat = location['iss_position']['latitude']    lon = location['iss_position']['longitude']    print("Position: \n latitude: {}, longitude: {}".format(lat,lon))    pos = iss.pos()     posx = iss.xcor()    if iss.xcor() >= (179.1):           ### Stop drawing at the right edge of          iss.penup()                     ### the screen to avoid a         iss.goto(float(lon),float(lat)) ### horizontal wrap round line        time.sleep(5)    else:      iss.goto(float(lon),float(lat))      iss.pendown()      time.sleep(5)


我们还可以标出自己目前所处的位置,以查看和国际空间站的距离及空间站经过你上空的时间点(UTC)。

while True:      location = ISS_Info.iss_current_loc()    lat = location['iss_position']['latitude']    lon = location['iss_position']['longitude']    print("Position: \n latitude: {}, longitude: {}".format(lat,lon))    pos = iss.pos()     posx = iss.xcor()    if iss.xcor() >= (179.1):           ### Stop drawing at the right edge of          iss.penup()                     ### the screen to avoid a         iss.goto(float(lon),float(lat)) ### horizontal wrap round line        time.sleep(5)    else:      iss.goto(float(lon),float(lat))      iss.pendown()      time.sleep(5)


不过这里值得注意的是,iss-pass.json这个接口的纬度计算必须在-90到90之内,因此深圳的纬度需要减去90.

最终效果如下:


在公众号Crossin的编程教室回复关键字“国际空间站”可获取本文完整源码

作者:Ckend
来源:Python实用宝典


_往期文章推荐_

模拟“嫦娥五号”探月小游戏【附源码】




浏览 39
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报