用Python跟蹤國際空間站的實時位置,并繪制在地圖上

一扎酷、介紹


本項目中使用一項 web 服務(wù)來查找國際空間站 (ISS) 的當前位置并在地圖上繪制其位置。

最終的效果如圖:


image

本項目來自于樹莓派(raspberrypi)官網(wǎng)學習項目遏匆。


二法挨、獲取國際空間站中宇航員的信息


首先需要用到提供國際空間站實時信息的web服務(wù)。

http://api.open-notify.org/astros.json

該服務(wù)返回的是json格式

{
  "message": "success",
  "number": 3,
  "people": [
    {
      "craft": "ISS",
      "name": "Yuri Malenchenko"
    },
    {
      "craft": "ISS",
      "name": "Timothy Kopra"
    },
    {
      "craft": "ISS",
      "name": "Timothy Peake"
    }
  ]
}

接下來創(chuàng)建python文件幅聘,使用python分析打印出空間站宇航員的信息凡纳。

導(dǎo)入 urllib.request 和 json 模塊。

import json
import urllib.request

獲取web服務(wù)返回的結(jié)果

# 將請求地址放入變量中
url = "http://api.open-notify.org/astros.json"
# 調(diào)用web服務(wù)
response = urllib.request.urlopen(url)
# 保存返回的json結(jié)果
result = json.loads(response.read())
# 打印出結(jié)果
print(result)

在控制臺打印出的結(jié)果為

{'people': [{'craft': 'ISS', 'name': 'Alexey Ovchinin'}, {'craft': 'ISS', 'name': 'Nick Hague'}, {'craft': 'ISS', 'name': 'Christina Koch'}], 'number': 3, 'message': 'success'}

可以看出這是一個有3個鍵的字典

將字典中people(宇航員)的信息單獨取出來


# 打印空間站當前人數(shù)

number = result['number']
print("現(xiàn)在空間中有 %s 人:" % number)

# 將people放入字典中
people = result['people']

# 將people單獨打印出來
for p in people:
    # 獲取宇航員姓名
    name = p["name"] 
    # 獲取宇航員所在飛行器
    craft = p['craft']

    print("宇航員 %s 在飛行器 %s 里" % (name,craft))

打印結(jié)果為

現(xiàn)在空間中有 3 人:
宇航員 Alexey Ovchinin 在飛行器 ISS 里
宇航員 Nick Hague 在飛行器 ISS 里
宇航員 Christina Koch 在飛行器 ISS 里

三帝蒿、獲取國際空間站的位置


國際空間站處于環(huán)繞地球的軌道內(nèi)荐糜。它每隔大約一個半小時繞地球運行一周。ISS 以平均每秒 7.66 km 的速度運行葛超。速度很快暴氏!

獲取國際空間站實時位置的web服務(wù)地址為:

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

返回的json格式為

{
    "timestamp": 1561455890,
    "message": "success",
    "iss_position": {
        "longitude": "-136.1358",
        "latitude": "-37.3534"
    }
}

該結(jié)果包含ISS當前所處位置投影到地球上的點的坐標。

經(jīng)度是東-西位置绣张,范圍是 -180 到 180答渔。0 指貫穿英國倫敦格林威治的本初子午線。

緯度是南-北位置侥涵,范圍是 90 到 -90沼撕。0 指赤道。

同樣用python將國際空間站位置提取出來

# 獲取國際空間站位置

# 將請求地址放入變量中
url = "http://api.open-notify.org/iss-now.json"
# 調(diào)用web服務(wù)
response = urllib.request.urlopen(url)
# 保存返回的json結(jié)果
result = json.loads(response.read())
# 獲取位置信息
position = result['iss_position']
# 獲取經(jīng)度
longitude = position['longitude']
# 獲取緯度
latitude = position['latitude']

#打印
print("當前空間站的位置為:")
print("經(jīng)度:",longitude)
print("維度:",latitude)

打印結(jié)果為:

當前空間站的位置為:
經(jīng)度: -121.3688
維度: 6.2800

四芜飘、將位置信息顯示在地圖上


首先要用到兩張圖片資源

一張是世界地圖

image

一張是空間站

image

需要導(dǎo)入繪圖庫

import tuytle

加載一張世界地圖作為背景圖

# 將位置信息顯示在地圖上
# 加載一張世界地圖作為背景圖
screen = turtle.Screen()
#設(shè)置圖片大小
screen.setup(720.360)
# 設(shè)置畫面來匹配坐標
screen.setworldcoordinates(-180,-90,180,90)
screen.bgpic('map.gif')

創(chuàng)建空間站务豺,并將空間站的實際位置顯示在地圖上

# 創(chuàng)建空間站的圖
screen.register_shape('iss.gif')
iss = turtle.Turtle()
iss.shape('iss.gif')
iss.setheading(90)

# 將空間站移動到當前實際位置
iss.penup()
iss.goto(lon,lat)

完整代碼示例

#!/bin/python3

import json
import turtle
import urllib.request

# 將請求地址放入變量中
url = "http://api.open-notify.org/astros.json"
# 調(diào)用web服務(wù)
response = urllib.request.urlopen(url)
# 保存返回的json結(jié)果
result = json.loads(response.read())
# 打印出結(jié)果
print(result)

# 對json數(shù)據(jù)進行分析

# 打印空間站當前人數(shù)

number = result['number']
print("現(xiàn)在空間中有 %s 人:" % number)

# 將people放入字典中
people = result['people']

# 將people單獨打印出來
for p in people:
    # 獲取宇航員姓名
    name = p["name"] 
    # 獲取宇航員所在飛行器
    craft = p['craft']

    print("宇航員 %s 在飛行器 %s 里" % (name,craft))

# 獲取國際空間站位置

# 將請求地址放入變量中
url = "http://api.open-notify.org/iss-now.json"
# 調(diào)用web服務(wù)
response = urllib.request.urlopen(url)
# 保存返回的json結(jié)果
result = json.loads(response.read())
# 獲取位置信息
position = result['iss_position']
# 獲取經(jīng)度
longitude = position['longitude']
# 獲取緯度
latitude = position['latitude']

lon = float(longitude)
lat = float(latitude)
#打印
print("當前空間站的位置為:")
print("經(jīng)度:",lon)
print("維度:",lat)

# 將位置信息顯示在地圖上
# 加載一張世界地圖作為背景圖
screen = turtle.Screen()
#設(shè)置圖片大小
screen.setup(720.360)
# 設(shè)置畫面來匹配坐標
screen.setworldcoordinates(-180,-90,180,90)
screen.bgpic('map.gif')

# 創(chuàng)建空間站的圖
screen.register_shape('iss.gif')
iss = turtle.Turtle()
iss.shape('iss.gif')
iss.setheading(90)

# 將空間站移動到當前實際位置
iss.penup()
iss.goto(lon,lat)

五 持續(xù)獲取空間站位置


運行一遍上面代碼,只能獲取一次當前的國際空間站信息燃箭。

想要持續(xù)的獲取空間站位置冲呢,并顯示在地圖上,需做一下改進招狸。使用while循環(huán)敬拓,每10秒獲取一次。

#!/bin/python3

import json
import turtle
import urllib.request
import time

# 將請求地址放入變量中
url = "http://api.open-notify.org/astros.json"
# 調(diào)用web服務(wù)
response = urllib.request.urlopen(url)
# 保存返回的json結(jié)果
result = json.loads(response.read())
# 打印出結(jié)果
print(result)

# 對json數(shù)據(jù)進行分析

# 打印空間站當前人數(shù)

number = result['number']
print("現(xiàn)在空間中有 %s 人:" % number)

# 將people放入字典中
people = result['people']

# 將people單獨打印出來
for p in people:
    # 獲取宇航員姓名
    name = p["name"] 
    # 獲取宇航員所在飛行器
    craft = p['craft']

    print("宇航員 %s 在飛行器 %s 里" % (name,craft))


# 將位置信息顯示在地圖上
# 加載一張世界地圖作為背景圖
screen = turtle.Screen()
#設(shè)置圖片大小
screen.setup(720.360)
# 設(shè)置畫面來匹配坐標
screen.setworldcoordinates(-180,-90,180,90)
screen.bgpic('map.gif')

# 創(chuàng)建空間站的圖
screen.register_shape('iss.gif')
iss = turtle.Turtle()
iss.shape('iss.gif')
iss.setheading(90)

# 將空間站移動到當前實際位置


i = 1

while i > 0:
    # 獲取國際空間站位置
    # 將請求地址放入變量中
    url = "http://api.open-notify.org/iss-now.json"
    # 調(diào)用web服務(wù)
    response = urllib.request.urlopen(url)
    # 保存返回的json結(jié)果
    result = json.loads(response.read())
    # 獲取位置信息
    position = result['iss_position']
    # 獲取經(jīng)度
    longitude = position['longitude']
    # 獲取緯度
    latitude = position['latitude']

    lon = float(longitude)
    lat = float(latitude)
    #打印
    print("當前空間站的位置為:")
    print("經(jīng)度:",lon)
    print("維度:",lat)

    # 將空間站移動到當前實際位置
    iss.penup()
    iss.goto(lon,lat)
    # 每10秒執(zhí)行一次
    time.sleep(10)

六裙戏、效果演示


以下是跟蹤國際空間站20多分鐘的運行軌跡乘凸,放快100倍的效果。

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末累榜,一起剝皮案震驚了整個濱河市营勤,隨后出現(xiàn)的幾起案子灵嫌,更是在濱河造成了極大的恐慌,老刑警劉巖葛作,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寿羞,死亡現(xiàn)場離奇詭異,居然都是意外死亡赂蠢,警方通過查閱死者的電腦和手機绪穆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虱岂,“玉大人玖院,你說我怎么就攤上這事〉卺” “怎么了难菌?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔑滓。 經(jīng)常有香客問我郊酒,道長,這世上最難降的妖魔是什么键袱? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任猎塞,我火速辦了婚禮,結(jié)果婚禮上杠纵,老公的妹妹穿的比我還像新娘。我一直安慰自己钩骇,他們只是感情好比藻,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著倘屹,像睡著了一般银亲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纽匙,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天务蝠,我揣著相機與錄音,去河邊找鬼烛缔。 笑死馏段,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的践瓷。 我是一名探鬼主播院喜,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晕翠!你這毒婦竟也來了喷舀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎硫麻,沒想到半個月后爸邢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡拿愧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年杠河,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赶掖。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡感猛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奢赂,到底是詐尸還是另有隱情陪白,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布膳灶,位于F島的核電站咱士,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏轧钓。R本人自食惡果不足惜序厉,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毕箍。 院中可真熱鬧弛房,春花似錦、人聲如沸而柑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽媒咳。三九已至粹排,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涩澡,已是汗流浹背顽耳。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妙同,地道東北人射富。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像粥帚,于是被迫代替她去往敵國和親辉浦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容