📜  如何使用Python跟踪 ISS(国际空间站)?

📅  最后修改于: 2022-05-13 01:54:37.915000             🧑  作者: Mango

如何使用Python跟踪 ISS(国际空间站)?

在本文中,我们将讨论如何跟踪ISS(国际空间站)的当前位置,然后绘制位置图。我们将编写一个脚本来显示国际空间站的当前位置以及在职人员的姓名。它适用于 API,它以纬度和经度的形式获取 ISS 的当前位置,然后将该值定位到地图上。它在非常 5 秒时从网站获取值,然后更新纬度和经度的值,从而也在世界地图上移动 ISS 图标。可见的运动非常小,但您可以在下面的 gif 中注意到该运动。这可以通过使用Python的一些模块(如 JSON、urllib.requests、Webbrowser、Geocoder 等)来实现。许多函数用于创建此脚本。

需要的模块:

  • JSON 它是 JavaScript Object Notation, Python通过一个名为 JSON 的内置包支持 JSON。它只是类似于Python中的字典。要使用此模块的功能,请将 JSON 模块导入脚本。
pip install jsonlib
  • Turtle Python海龟库包含创建我们的设计和图像所需的所有方法和函数。
pip install turtle
  • urllib : urllib.request 是一个用于获取URL (统一资源定位器)的Python模块。该模块以 urlopen函数的形式提供了一个非常简单的接口。它结合了几个模块来预处理 URL 这能够使用各种不同的协议来获取 URL。
pip install urllib3
  • 时间:该模块执行各种与时间相关的功能。另请参阅日期时间和日历模块以了解相关功能。
pip install times
  • Webbrowser:用户可以使用提供高级界面的 webbrowser 模块查看基于 Web 的文档。该模块包括用于交互式浏览器应用程序的 URL 打开功能。
pip install pycopy-webbrowser
  • 地理编码器:该模块将各种地名描述转换为地球表面上的位置。因为每个地理编码提供程序都有自己的 JSON 模式,所以有时可能很难解析它们。在这里,这个模块将帮助我们使用简单的函数来检索纬度和经度。
pip install geocoder

入门

所以现在跟踪国际空间站存在问题,因为它以近 28000 公里/小时的速度行进。因此,绕地球转一圈只需90分钟。在这样的速度下,锁定精确坐标变得非常困难。于是就有了解决这个问题的API。 API充当网站和程序之间的中介,从而为程序提供当前时间数据。

在我们的例子中,API 将为我们提供 ISS 在地球轨道上的当前位置,因此请访问下面的链接作为宇航员信息的 API 链接。

url = "http://api.open-notify.org/astros.json" 

访问数据:

使用 urllib.request.urlopen()函数打开 API url 和 json.loads(.read())函数从 url 读取数据。

Python3
import json  
import turtle
import urllib.request 
import time 
import webbrowser 
import geocoder
  
url = "http://api.open-notify.org/astros.json" 
response = urllib.request.urlopen(url) 
result = json.loads(response.read())
result


Python3
file = open("iss.txt", "w") 
file.write(
  "There are currently " + str(result["number"]) + 
  " astronauts on the ISS: \n\n")
  
people = result["people"]
for p in people:
    file.write(p['name'] + " - on board" + "\n")


Python3
# print long and lat
g = geocoder.ip('me') 
file.write("\nYour current lat / long is: " + str(g.latlng))
file.close()
webbrowser.open("iss.txt")


Python3
screen = turtle.Screen()
screen.setup(1280, 720)
screen.setworldcoordinates(-180, -90, 180, 90)


Python3
# load the world map image
screen.bgpic("images\map.gif")
screen.register_shape("images\iss.gif")
iss = turtle.Turtle()
iss.shape("images\iss.gif")
iss.setheading(45)
iss.penup()


Python3
# load the current status of the ISS in real-time
url = "http://api.open-notify.org/iss-now.json"
response = urllib.request.urlopen(url)
result = json.loads(response.read())
  
# Extract the ISS location
location = result["iss_position"]
lat = location['latitude']
lon = location['longitude']
  
# Output lon and lat to the terminal in the 
# float format
lat = float(lat)
lon = float(lon)
print("\nLatitude: " + str(lat))
print("\nLongitude: " + str(lon))


Python3
# Update the ISS location on the map
iss.goto(lon, lat)
  
# Refresh each 5 seconds
time.sleep(5)


Python3
# json convert the python dictionary 
# above into a json
import json  
import turtle
  
# urllib.request fetch URLs using
# a variety of different protocols
import urllib.request 
import time 
  
# webbrowser provides a high-level interface
# to allow displaying Web-based documents 
# to users
import webbrowser 
  
# geocoder takes the data and locate these
# locations in the map
import geocoder
  
url = "http://api.open-notify.org/astros.json" 
response = urllib.request.urlopen(url) 
result = json.loads(response.read())
file = open("iss.txt", "w") 
file.write("There are currently " +
            # prints number of astronauts
           str(result["number"]) + " astronauts on the ISS: \n\n")
people = result["people"]
  
# prints names of crew 
for p in people:
    file.write(p['name'] + " - on board" + "\n") 
# print long and lat
g = geocoder.ip('me') 
file.write("\nYour current lat / long is: " + str(g.latlng))
file.close()
webbrowser.open("iss.txt")
  
# Setup the world map in turtle module
screen = turtle.Screen()
screen.setup(1280, 720)
screen.setworldcoordinates(-180, -90, 180, 90)
  
# load the world map image
screen.bgpic("images/map.gif")
screen.register_shape("images\iss.gif")
iss = turtle.Turtle()
iss.shape("images\iss.gif")
iss.setheading(45)
iss.penup()
  
while True:
    
    # load the current status of the ISS in real-time
    url = "http://api.open-notify.org/iss-now.json"
    response = urllib.request.urlopen(url)
    result = json.loads(response.read())
  
    # Extract the ISS location
    location = result["iss_position"]
    lat = location['latitude']
    lon = location['longitude']
  
    # Ouput lon and lat to the terminal
    lat = float(lat)
    lon = float(lon)
    print("\nLatitude: " + str(lat))
    print("\nLongitude: " + str(lon))
  
    # Update the ISS location on the map
    iss.goto(lon, lat)
  
    # Refresh each 5 seconds
    time.sleep(5)


输出:

{'people': [{'name': 'Mark Vande Hei', 'craft': 'ISS'},
  {'name': 'Oleg Novitskiy', 'craft': 'ISS'},
  {'name': 'Pyotr Dubrov', 'craft': 'ISS'},
  {'name': 'Thomas Pesquet', 'craft': 'ISS'},
  {'name': 'Megan McArthur', 'craft': 'ISS'},
  {'name': 'Shane Kimbrough', 'craft': 'ISS'},
  {'name': 'Akihiko Hoshide', 'craft': 'ISS'},
  {'name': 'Nie Haisheng', 'craft': 'Tiangong'},
  {'name': 'Liu Boming', 'craft': 'Tiangong'},
  {'name': 'Tang Hongbo', 'craft': 'Tiangong'}],
 'number': 10,
 'message': 'success'}

为宇航员信息创建.txt 文件:在写入模式下使用 open()函数创建 iss.text 文件,并将结果(宇航员的姓名和编号)作为数据写入文件中。

蟒蛇3

file = open("iss.txt", "w") 
file.write(
  "There are currently " + str(result["number"]) + 
  " astronauts on the ISS: \n\n")
  
people = result["people"]
for p in people:
    file.write(p['name'] + " - on board" + "\n")

用户当前纬度和经度:

使用 geocoder.ip('me') 了解您当前的纬度和经度位置,然后使用将数据写入文件,然后使用 file.close()函数关闭文件。

蟒蛇3

# print long and lat
g = geocoder.ip('me') 
file.write("\nYour current lat / long is: " + str(g.latlng))
file.close()
webbrowser.open("iss.txt")

设置世界地图:

使用turtle.screen()函数访问屏幕,然后使用screen.setup()设置输出窗口的大小和位置。使用screen.setworldcoordinates()函数设置 x, y 轴上所有 4 个角的坐标,以便当 iss 从reach 伸出时,它们再次从另一个边缘出现。

蟒蛇3

screen = turtle.Screen()
screen.setup(1280, 720)
screen.setworldcoordinates(-180, -90, 180, 90)

使用 screen.bgpic()函数将地图设置为背景图片,使用screen.register_shape()函数函数iss 图像设置为海龟形状。将其用作对象并使用 iss.shape() 函数将其指定为形状,然后使用 iss.setheading()函数设置函数的角度。 iss.penup()函数表示他们的绘图。于是,乌龟停了下来。

该文件可以下载:

  • 地图.gif
  • iss.gif

代码:

蟒蛇3

# load the world map image
screen.bgpic("images\map.gif")
screen.register_shape("images\iss.gif")
iss = turtle.Turtle()
iss.shape("images\iss.gif")
iss.setheading(45)
iss.penup()

使用以下 API 访问 ISS 的当前状态:

url = "http://api.open-notify.org/iss-now.json"

从上述 API 中提取 ISS 当前位置的经纬度。下面的脚本在 while 循环内运行,因此您可以看到 ISS 的更新位置和移动,直到您停止程序。

蟒蛇3

# load the current status of the ISS in real-time
url = "http://api.open-notify.org/iss-now.json"
response = urllib.request.urlopen(url)
result = json.loads(response.read())
  
# Extract the ISS location
location = result["iss_position"]
lat = location['latitude']
lon = location['longitude']
  
# Output lon and lat to the terminal in the 
# float format
lat = float(lat)
lon = float(lon)
print("\nLatitude: " + str(lat))
print("\nLongitude: " + str(lon))

通过从 API 刷新纬度和经度值,每 5 秒更新一次 ISS 的位置。

蟒蛇3

# Update the ISS location on the map
iss.goto(lon, lat)
  
# Refresh each 5 seconds
time.sleep(5)

下面是完整的实现。

蟒蛇3

# json convert the python dictionary 
# above into a json
import json  
import turtle
  
# urllib.request fetch URLs using
# a variety of different protocols
import urllib.request 
import time 
  
# webbrowser provides a high-level interface
# to allow displaying Web-based documents 
# to users
import webbrowser 
  
# geocoder takes the data and locate these
# locations in the map
import geocoder
  
url = "http://api.open-notify.org/astros.json" 
response = urllib.request.urlopen(url) 
result = json.loads(response.read())
file = open("iss.txt", "w") 
file.write("There are currently " +
            # prints number of astronauts
           str(result["number"]) + " astronauts on the ISS: \n\n")
people = result["people"]
  
# prints names of crew 
for p in people:
    file.write(p['name'] + " - on board" + "\n") 
# print long and lat
g = geocoder.ip('me') 
file.write("\nYour current lat / long is: " + str(g.latlng))
file.close()
webbrowser.open("iss.txt")
  
# Setup the world map in turtle module
screen = turtle.Screen()
screen.setup(1280, 720)
screen.setworldcoordinates(-180, -90, 180, 90)
  
# load the world map image
screen.bgpic("images/map.gif")
screen.register_shape("images\iss.gif")
iss = turtle.Turtle()
iss.shape("images\iss.gif")
iss.setheading(45)
iss.penup()
  
while True:
    
    # load the current status of the ISS in real-time
    url = "http://api.open-notify.org/iss-now.json"
    response = urllib.request.urlopen(url)
    result = json.loads(response.read())
  
    # Extract the ISS location
    location = result["iss_position"]
    lat = location['latitude']
    lon = location['longitude']
  
    # Ouput lon and lat to the terminal
    lat = float(lat)
    lon = float(lon)
    print("\nLatitude: " + str(lat))
    print("\nLongitude: " + str(lon))
  
    # Update the ISS location on the map
    iss.goto(lon, lat)
  
    # Refresh each 5 seconds
    time.sleep(5)

输出:

船员信息:这是有关船上船员及其姓名的信息。

国际空间站位置:这是移动国际空间站的屏幕截图,即绕地球运行。您可以通过放大屏幕截图来查看它。

ISS 移动外观:在这里您可以看到 ISS 每 5 秒移动一次。