Coding History/Team Project

팀플) 유성우 정보 추출 전략. (MIT에서 제공하는 gmn-python-api 사용!)

BlackBirdIT 2024. 10. 14. 09:51

NASA API 연결하기.

데이터에 공신력을 갖기 위해, NASA API 연결을 결정했다.

여기서 제일 적절한 것 같은 api는 EONET가 가장 적절해 보인다. 지구에서 관측한다. 자연적인 이벤트를 트랙킹. 이라고 써져 있으니까.

그럼 일단 고민하지말고 바로 연결부터 해보자.

일단 .env 변수로 API KEY 저장부터 하고,

이후에 services.meteor_shower_service.py생성. -> get_meteor_shower_forecast() 작성.

routes에 엔드포인트까지 작성했다.

일단은 내가 요청할 것이 뭔지 정확히 알아야했다.

그래서 읽어봤는데...

엄 메테오는 없는 것 같은데.

데이터를 다 까봐도 없다.

그래서 다른 공신력 있는 정보를 찾아야했다.


웹 뒤져보는중..

한참 뒤지다보니까 "Global Meteor Network" (GMN)라는 것을 찾았다. gmn-python-api라는 파이썬 API를 제공한다.

대학...에서 만든듯?

그럼 뭐 이거 바로 써봐야지. 우선 공식 문서를 확인해보고.. 절차대로 다운을 받아보자고.

다운을 이제 시도를 했는데,

flask 버전 충돌이 일어났다. 나한테 왜그러는데..

해결 방안이 여러가지가 있는데 가상환경을 하나 더 만드는 방법이 있었다.

근데 여기서 문제가 가상환경을 하나 더 만들면 스카이필드 계산 로직에 이결과를 어떻게 집어넣지???

가 문제가 또 생겼다.

난 지금 메모리 누수 때문에 이미 도커 환경을 적용중이라.
이런 방안이 있다고 한다.

  • 도커 컨테이너를 분리하여 사용:

각 역할(예: 유성우 정보, 별자리 계산 등)을 담당하는 도커 컨테이너를 따로 만들고, 컨테이너들 간에 통신을 하도록 설정할 수 있다. 이를 위해서는 도커 네트워크 설정을 통해 컨테이너 간 HTTP 요청을 주고받는 방식으로 API 서버를 구성할 수 있다.

어지럽네 ㅋㅋ

일단 뭐 해봐야지 어떡하냐. 라고 생각했는데

이렇게 하면 정보 처리가 효율적이지 않고 시간이 오래걸리는 문제가 발생할 수도 있다고 해서 일단 그냥 새로 가져올 api에 요구에 맞추기 위해서 flask버전을 낮춰보기로 결정했다.

click==8.0.4
Flask==2.1.3
gmn-python-api==0.0.13
Werkzeug==2.2.3

최종적으론 이렇게 버전을 낮추었고 모든 기능이 문제없이 돌아가는가 테스트 해본 결과 문제 없이 돌아가는 것을 확인했다.

간떨렸네 혹시나 망가질까봐

여튼 원래 meteor_shower로직을 일단 요청할 수 있게 gmn-python-api를 써서 짰다.

그리고 요청을 해보니까.

28만줄 실화냐.

심지어 뭔지 알아먹기도 좀 힘들다.

일단 이걸 GPT한테 해석을 부탁했다.


뽑아온 데이터에 대한 설명

  1. 시간 정보
    • "Beginning (UTC Time)": 유성우가 관측되기 시작한 시간, UTC 기준으로 제공되어 있음.
    • "Duration (sec)": 유성우가 관측된 지속 시간.
  2. 위치 정보
    • "LatBeg (+N deg)", "LonBeg (+E deg)": 유성우가 처음 관측된 위치의 위도와 경도.
    • "LatEnd (+N deg)", "LonEnd (+E deg)": 유성우가 관측을 종료할 때의 위치.
    • "HtBeg (km)", "HtEnd (km)": 유성우가 처음 관측된 높이와 끝날 때의 높이 (단위: km).
  3. 속도 및 경로
    • "Vgeo (km/s)": 지구 상대 속도, 유성우가 지구 대기권에서의 속도를 의미.
    • "Vhel (km/s)": 태양 기준의 속도.
    • "RAgeo (deg)", "DECgeo (deg)": 지구 기준의 적경(Right Ascension)과 적위(Declination), 천체의 위치를 나타내는 좌표 값.
    • "Azim +E (of N deg)": 유성우가 관측된 시점에서의 방위각.
  4. 물리적 특성
    • "Mass kg (tau=0.7%)": 추정된 유성우의 질량 (kg 단위).
    • "Peak (AbsMag)": 유성우가 가장 밝을 때의 절대 등급(밝기). 이 값이 낮을수록 유성우가 더 밝음.
    • "MedianFitErr (arcsec)": 관측 결과의 오차를 나타내는 값 (단위: 각초).
  5. 참여 관측소
    • "Participating (stations)": 해당 유성우가 관측된 관측소의 목록. 여러 관측소에서 동시에 관측된 경우 신뢰도와 정확도가 높아짐.
  6. 궤도 요소
    • "a (AU)", "e", "i (deg)", "node (deg)", "peri (deg)", "q (AU)": 유성체의 궤도를 정의하는 주요 매개변수들로, 이 정보들을 통해 해당 유성체의 궤도를 태양 중심으로 이해할 수 있어.
      • "a (AU)": 궤도 긴반지름, 천문단위(AU)로 표현됨.
      • "e": 궤도 이심률.
      • "i (deg)": 궤도 경사, 태양계 이클립틱면과 유성체의 궤도면 사이의 각도.

이 데이터에서 중요한 포인트는 유성우의 위치와 속도, 관측 시작 및 종료 시점, 그리고 관측된 밝기와 질량 같은 물리적인 특성들임. 이를 활용하여 사용자가 이해할 수 있는 간단한 정보(예: 관측 위치, 가장 밝았던 시각, 속도 등)로 가공하여 제공할 수 있음.


이렇다고 한다.

그럼 여기서 내가 필요한 정보만을 뽑아오면 된다는거지? 근데 데이터량이 너무 많아서 이걸 어떻게 처리해야지 좋을지 잘 모르겠다. 일단 정리를 해보자면

  1. 사용자 위치와 유성우 위치 비교:
    • 유성우 데이터에서 "LatBeg (+N deg)", "LonBeg (+E deg)" 등의 정보를 사용해서 사용자의 위도와 경도를 기준으로 가까운 위치에 있는 유성우인지 판단해야 해야함.
  2. 일출 및 일몰 시간 확인:
    • 이미 만든 일출 및 일몰 API (get_sunrise_sunset)를 사용해서 사용자가 위치한 지역의 일출과 일몰 시간을 확인해야함.
    • 유성우 관측 가능 시간은 일몰 후부터 일출 전까지이므로, 해당 시간 범위 내에 유성우가 발생하는지 확인할 수 있음.
  3. 시간 변환 및 비교:
    • 유성우 발생 시간 ("Beginning (UTC Time)")을 사용자 로컬 시간으로 변환해, 사용자가 관측할 수 있는 시간에 유성우가 발생하는지 체크해야 해야함.
    • 이를 위해 get_timezone_info 를 사용해서 시간 변환을 진행해야함.

그럼 일단.. 해보자..