一、前言
Open Notify 是一个开源项目,旨在为 NASA 的一些出色数据提供简单的编程接口。 open-notify.org 的作者做了一些工作,以获取原始数据并将其转换为与太空和航天器有关的 API。 现在将通过这个接口,获取得到国际空间站的位置,并实时地绘制到地图上。 为了实现该目标,得先安装 ISS_Info:
pip install ISS- Info
二、地图初始化
为了实时展示国际空间站的路径,需要使用 turtle 绘制曲线,因此可以创建一个 turtle 画布,将背景设为地球:
import ISS_Info
import turtle
import time
import json
import 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" )
三、获取空间站的人数
如果能知道空间站上的宇航员人数,就能更加准确的跟踪国际空间站。幸运的是 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 )
四、绘制空间站位置
为了能够绘制空间站的实时位置,需要请求拿到空间站的位置信息。请求的接口是:
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 ) :
iss. penup( )
iss. goto( float ( lon) , float ( lat) )
time. sleep( 5 )
else :
iss. goto( float ( lon) , float ( lat) )
iss. pendown( )
time. sleep( 5 )
我们还可以标出自己目前所处的位置,以查看和国际空间站的距离及空间站经过你上空的时间点(UTC)。
lat = 112.5118928
lon = 23.8534489
prediction = turtle. Turtle( )
prediction. penup( )
prediction. color( 'yellow' )
prediction. goto( lat, lon)
prediction. dot( 5 )
prediction. hideturtle( )
url = 'http://api.open-notify.org/iss-pass.json?lat=' + str ( lat- 90 ) + '&lon=' + str ( lon)
response = urllib. request. urlopen( url)
result = json. loads( response. read( ) )
over = result [ 'response' ] [ 1 ] [ 'risetime' ]
prediction. write( time. ctime( over) , font= style)
不过这里值得注意的是,iss-pass.json 这个接口的纬度计算必须在 -90 到 90 之内,因此深圳的纬度需要减去 90。 最终效果如下: