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한테 해석을 부탁했다.
뽑아온 데이터에 대한 설명
- 시간 정보
"Beginning (UTC Time)"
: 유성우가 관측되기 시작한 시간, UTC 기준으로 제공되어 있음."Duration (sec)"
: 유성우가 관측된 지속 시간.
- 위치 정보
"LatBeg (+N deg)"
,"LonBeg (+E deg)"
: 유성우가 처음 관측된 위치의 위도와 경도."LatEnd (+N deg)"
,"LonEnd (+E deg)"
: 유성우가 관측을 종료할 때의 위치."HtBeg (km)"
,"HtEnd (km)"
: 유성우가 처음 관측된 높이와 끝날 때의 높이 (단위: km).
- 속도 및 경로
"Vgeo (km/s)"
: 지구 상대 속도, 유성우가 지구 대기권에서의 속도를 의미."Vhel (km/s)"
: 태양 기준의 속도."RAgeo (deg)"
,"DECgeo (deg)"
: 지구 기준의 적경(Right Ascension)과 적위(Declination), 천체의 위치를 나타내는 좌표 값."Azim +E (of N deg)"
: 유성우가 관측된 시점에서의 방위각.
- 물리적 특성
"Mass kg (tau=0.7%)"
: 추정된 유성우의 질량 (kg 단위)."Peak (AbsMag)"
: 유성우가 가장 밝을 때의 절대 등급(밝기). 이 값이 낮을수록 유성우가 더 밝음."MedianFitErr (arcsec)"
: 관측 결과의 오차를 나타내는 값 (단위: 각초).
- 참여 관측소
"Participating (stations)"
: 해당 유성우가 관측된 관측소의 목록. 여러 관측소에서 동시에 관측된 경우 신뢰도와 정확도가 높아짐.
- 궤도 요소
"a (AU)"
,"e"
,"i (deg)"
,"node (deg)"
,"peri (deg)"
,"q (AU)"
: 유성체의 궤도를 정의하는 주요 매개변수들로, 이 정보들을 통해 해당 유성체의 궤도를 태양 중심으로 이해할 수 있어."a (AU)"
: 궤도 긴반지름, 천문단위(AU)로 표현됨."e"
: 궤도 이심률."i (deg)"
: 궤도 경사, 태양계 이클립틱면과 유성체의 궤도면 사이의 각도.
이 데이터에서 중요한 포인트는 유성우의 위치와 속도, 관측 시작 및 종료 시점, 그리고 관측된 밝기와 질량 같은 물리적인 특성들임. 이를 활용하여 사용자가 이해할 수 있는 간단한 정보(예: 관측 위치, 가장 밝았던 시각, 속도 등)로 가공하여 제공할 수 있음.
이렇다고 한다.
그럼 여기서 내가 필요한 정보만을 뽑아오면 된다는거지? 근데 데이터량이 너무 많아서 이걸 어떻게 처리해야지 좋을지 잘 모르겠다. 일단 정리를 해보자면
- 사용자 위치와 유성우 위치 비교:
- 유성우 데이터에서
"LatBeg (+N deg)"
,"LonBeg (+E deg)"
등의 정보를 사용해서 사용자의 위도와 경도를 기준으로 가까운 위치에 있는 유성우인지 판단해야 해야함.
- 유성우 데이터에서
- 일출 및 일몰 시간 확인:
- 이미 만든 일출 및 일몰 API (
get_sunrise_sunset
)를 사용해서 사용자가 위치한 지역의 일출과 일몰 시간을 확인해야함. - 유성우 관측 가능 시간은 일몰 후부터 일출 전까지이므로, 해당 시간 범위 내에 유성우가 발생하는지 확인할 수 있음.
- 이미 만든 일출 및 일몰 API (
- 시간 변환 및 비교:
- 유성우 발생 시간 (
"Beginning (UTC Time)"
)을 사용자 로컬 시간으로 변환해, 사용자가 관측할 수 있는 시간에 유성우가 발생하는지 체크해야 해야함. - 이를 위해
get_timezone_info
를 사용해서 시간 변환을 진행해야함.
- 유성우 발생 시간 (
그럼 일단.. 해보자..
'Coding History > Team Project' 카테고리의 다른 글
팀플) 행성의 가시성 정보 API와 엮어서 상세하게 한 것 검증. (0) | 2024.10.16 |
---|---|
팀플) 유성우 데이터 정제하기 (유성우 폐기 정밀 예측 현실적으로 불가능, 새로운 우주 이벤트 고민, 행성의 가시성 공신력 더하기) (4) | 2024.10.15 |
팀플) REST API 별자리 데이터 구체화 일단 완료. (3) | 2024.10.13 |
팀플) REST API 별자리 데이터 구체화중 (api 호출 효율적으로 설계) (2) | 2024.10.13 |
팀플) REST API 행성 데이터 (3) | 2024.10.13 |