데이터 분석가

파이썬 국제 우주 정거장(ISS) 추적 프로그램 본문

파이썬(python) 프로젝트 모음

파이썬 국제 우주 정거장(ISS) 추적 프로그램

PlintAn 2023. 4. 6. 10:00

안녕하세요!

 

국제 우주 정거장(ISS)는 하늘에서 가장 밝은 물체 중 하나라는 것을 알고 있나요??!

서울에서 국제 우주 정거장ISS를 관측해보자 !

 

ISS 국제우주 정거장

 

 

이를 관측하는 프로그램을 만들기 위해 API와 ENDPOINT(URL)의 개념이 선행되어야 한다.

 

https://an-ju-seong-coding.tistory.com/31

 

API와 END POINT(Feat.URL)의 개념

API는 Application Programing Interface의 약자로 : 서로 다른 시스템 간 상호작용을 가능케하는 인터페이스 이를 통해 시스템 간 데이터를 주고받으며 다양한 앱 및 서비스 개발이 가능하다 END POINT 는 API

an-ju-seong-coding.tistory.com

 

 

국제우주정거장(ISS: International Space Station)은 지구 궤도를 도는 인공위성이다

 

ISS미국, 러시아, 유럽, 일본, 캐나다 5개국이 공동으로 개발하여 운영하고 있으며

 

지구의 고도 408km 상공에 위치해 있으며, 속도는 시속 약 28,000km로 지구를 단 90분 만에

 

한 바퀴를 도는 속도이다 !

 

이를 관측하기 위한 추적 프로그램을 만들어 볼 것인데 조건은 두 가지이다.

 

 

첫 번째, 서울에서 관측 가능한 범위의 위도, 경도에 위치해 있어야 한다.

 

두 번째, 관측 가능한 저녁이어야 한다.

 

 

위도 경도 사이트

https://www.latlong.net/

 
지도의 위도 및 경도 찾기 좌표 가져오기위도와 경도는 무엇입니까? 모든 실제 집에 주소(번호, 거리 이름, 도시 등 포함)가 있는 것처럼 지구 표면의 모든 단일 지점은 위도 및 경도 좌표로 지정될 수 있습니다. 따라서 b

www.latlong.net

국제 우주 정거장(ISS)의 위도 경도 API(URL)

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

 

 

필요한 정보들은 갖추어 졌으니 시작해봅시다

 

 

# 필요한 모듈을 가져옵니다
import requests
from datetime import datetime
import smtplib
import time

# 이메일 인증 정보와 현재 위치 좌표를 설정합니다
MY_EMAIL = "이메일아이디@gmail.com"
MY_PASSWORD = "앱 비밀번호"
MY_LAT = 37.566536 # 서울 위치 위도
MY_LONG = 126.977966 # 서울 위치 경도

파이썬 request 모듈은 HTTP 요청 메소드(GET, POST, PUT, DELETE 등) 기능을 지원한다

 

해당 필요한 모듈들을 가져오고, ISS 움직임에 대해 알림을 받을 이메일을 입력한다

 

# ISS가 현재 위치에서 +5 또는 -5도 범위 내에 있는지 확인합니다
def is_iss_overhead():
    response = requests.get(url="http://api.open-notify.org/iss-now.json") # Open Notify API를 호출하여 ISS의 현재 위치를 가져옵니다
    response.raise_for_status() # 응답 상태 코드가 200 OK가 아닌 경우 예외를 발생시킵니다
    data = response.json() # 응답을 JSON 객체로 변환합니다

    iss_latitude = float(data["iss_position"]["latitude"]) # JSON 데이터에서 ISS의 위도를 추출합니다
    iss_longitude = float(data["iss_position"]["longitude"]) # JSON 데이터에서 ISS의 경도를 추출합니다

    if MY_LAT-5 <= iss_latitude <= MY_LAT+5 and MY_LONG-5 <= iss_longitude <= MY_LONG+5:
        # ISS의 위도와 경도가 현재 위치에서 +5 또는 -5도 범위 내에 있는 경우 True를 반환합니다
        return True

def is_iss_overhead():

 

ISS의 움직임을 파악하여 서울 위 상공의 경도, 위도 +- 5 오차의 경우 알림을 줍니다!

 

ISS와 관련된 데이터를 제공하는 API를 GET 메소드로 URL(ENDPOINT)에서 필요한 정보를 가져옵니다.

 

data = response.json() 을 통해 ISS 현재 위치 데이터는 JSON 형식의 문자열(STR)이다

 

이를 다루기 쉬운 딕셔너리(dict) 형식으로 변환하여 추출한 JSON 데이터들을 딕셔너리 형식으로 저장한다

 

    MY_LAT-5 <= iss_latitude <= MY_LAT+5 및 MY_LONG-5 <= iss_longitude <= MY_LONG+5인 경우:

 

관측할 수 있는 범위를 서울의 위도, 경도 +- 5도로 설정하여, True  값이 나오면 

 

다음으로 def is_nighte() 함수로 넘어간다

 

 

# 현재 시간이 현재 위치에서 밤인지 확인합니다
def is_night():
    parameters = {
        "lat" : MY_LAT,
         "lng" : MY_LONG,
         "formatted" : 0 ,
    }
    response = requests.get("https://api.sunrise-sunset.org/json", params=parameters) # Sunrise Sunset API를 호출하여 현재 위치에서 일출 및 일몰 시간을 가져옵니다
    response.raise_for_status() # 응답 상태 코드가 200 OK가 아닌 경우 예외를 발생시킵니다
    data = response.json() # 응답을 JSON 객체로 변환합니다

    sunrise = int(data["results"]["sunrise"].split("T")[1].split(":")[0]) # JSON 데이터에서 일출 시간의 시간 구성 요소를 추출합니다
    sunset = int(data["results"]["sunset"].split("T")[1].split(":")[0]) # JSON 데이터에서 일몰 시간의 시간 구성 요소를 추출합니다

    time_now = datetime.now().hour # 현재 시간의 시간 구성 요소를 가져옵니다

    if time_now >= sunset or time_now <= sunrise:
        # 현재 시간이 일몰 시간 이후 또는 일출 시간 이전인 경우 True를 반환합니다
        return True

첫 번째 조건인 관측 가능한 범위에 위치했으니 

두 번째 조건인 저녁 시간을 설정해보자

 

def is_night():

 

URL(ENDPOINT)  에서 lat, Ing, formatted매개변수를 통하여 서울의 일출 일몰 시간을 추출한다.

 

가져온 데이터를 딕셔너리로 저장시키고, 딕셔너리 형태의 results를 추출한다

 

if tiem_now >= sunset or time_now <= sunrise: 

 

현재 시간이 일몰 시간 이후, 일출 시간 이전인 경우인데, 이는 해가 없는 저녁을 의미한다

 

# ISS가 현재 위치에서 위에 있고 밤인 경우 이메일을 보냅니다
while True:
    time.sleep(60) # 스크립트를 60초 동안 일시 중지합니다
    if is_iss_overhead() and is_night(): # ISS가 현재 위치에서 위에 있고 밤인 경우
        connection = smtplib.SMTP

첫 번째, 서울에서 관측 가능한 범위의 위도, 경도에 위치해 있어야 한다.

 

두 번째, 관측 가능한 저녁이어야 한다.

 

두 번째 조건까지 만족하는 식을 만들었으므로

 

마지막으로, while True:

 

time.sleep(60) 60초마다 해당 반복문을 돌리고, 

 

    if is_iss_overhead() # ISS가 서울 위에 있을 경우 and is_night(): # 일몰 이후, 일출 이전 저녁인 경우

 

메일링을 도와주는 smtplib 모듈을 사용해

 

'smtplib.SMTP' 클래스는 SMTP 서버에 연결하고 메시지 전송

 

 

 

그렇다면, 앞서 설정한 이메일로 정해둔 문구의 메일이 보내질 겁니다 !

 

90분마다 지구 한 바퀴를 도는 ISS는 저녁 시간대에 하루에도 몇번이고 메일을 보내게 할겁니다 !

 

감사합니다 !

 

 

 

Comments