Прямая трансляция местоположения международной космической станции на карте Картопы - PullRequest
0 голосов
/ 28 марта 2020

Я работаю над простым сценарием для определения местоположения МКС на карте мира с использованием картопий. Вот код и его вывод

import requests
from datetime import datetime
import cartopy.crs as ccrs
import matplotlib.pyplot as plt

# finding the current location   
url = 'http://api.open-notify.org/iss-now.json'

r = requests.get(url)
data = r.json()

dt = data['timestamp']
lat = data['iss_position']['latitude']
lon = data['iss_position']['longitude']

print('Date and time : ',datetime.fromtimestamp(dt))
print('Latitude :',lat)
print('Longitude :',lon)

# plotting the location on map
plt.figure(figsize=(10,8))   
ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img()

# lon lat
plt.scatter(float(lon),float(lat),color='blue', marker='o')
plt.show()

Эта часть работает нормально, а вот вывод.

Currently ISS is near Australia

Теперь, что я хочу, чтобы через каждые 30 секунд делался запрос к URL-адресу, и наносили на карту местоположение на карте, очищая предыдущее местоположение. Можно ли это сделать с matplotlib. Я не знаю много о matplotlib. Пожалуйста, помогите.

Мой текущий код создает новые графики каждый раз с разбросами по ним. Я хочу, чтобы только одна карта с текущим местоположением и предыдущим местоположением была стерта.

Вот мой текущий код

import requests
import matplotlib.pyplot as plt
import time
import cartopy.crs as ccrs

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

plt.figure(figsize=(10,8))

ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img()

plt.ion()

while True:
    r = requests.get(url)
    data = r.json()

    dt = data['timestamp']
    lat = data['iss_position']['latitude']
    lon = data['iss_position']['longitude']

    plt.scatter(float(lon),float(lat),color='blue', marker='o')
    plt.show()
    time.sleep(30)

1 Ответ

0 голосов
/ 29 марта 2020

matplotlib.animation.FuncAnimation существует специально для этого вида участка. Попробуйте это

import requests
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import time
import cartopy.crs as ccrs

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

plt.figure(figsize=(10,8))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img()

plt.ion()
plt.show()
s = plt.scatter([], [], color='blue', marker='o')

def animate(i):
    r = requests.get(url)
    data = r.json()

    dt = data['timestamp']
    lat = data['iss_position']['latitude']
    lon = data['iss_position']['longitude']

    s.set_offsets([float(lon), float(lat)])
    time.sleep(30)

anim = FuncAnimation(plt.gcf(), animate)
plt.show()

Это покажет (ускорился для демонстрации):

enter image description here

...