티스토리 뷰

[ETC] Developing

[개발노트] 기상청 OPEN API

CodeMath Dev2DHs 2017.02.08 22:59

(1) 기상청 OPEN API

기상청 open api 를 이용하기 위해서는 우선, 공공데이터 포털에 들어가 api key 신청을 해야만 한다.

동네예보조회 서비스를 통해 GPS로 받은 위/경도 값으로 기상값들을 받아오려 한다.

 http://newsky2.kma.go.kr/service/SecndSrtpdFrcstInfoService2/ForecastSpaceData?

여기에 추가적으로 인증 받은 service key 를 넣어줘야 한다. (GET 방식)
ServiceKey={{ service key}}

다음으로 여러가지 파라미터 값들 중에서 기본적으로 사용해야하는 파라미터는 다음과 같다.

base_date={{ YYmmdd }}  # 년월일
base_time= {{ HHMM }} # 시간분
nx = {{ int }} # 가로축 값
ny = {{ int }} # 세로축 값

여기서 가장 의아하게 생각되는 부분이 바로 nx, ny 부분이다. 위/경도 값을 사용하는게 아니라, 격자로 인식한다.
이 격자값은 open api 문서의 엑셀로 데이터화 되어있다. 특정 지역에 따라 격자 값(x,y)이 다르기 때문에 별도로 계산해줘야한다.





우리가 사용자에게 받아오는 값은 기본적으로 GPS 값이다. 이 GPS 값을 해당 지역으로 변환하여 다시 격자값으로 변환해줘야한다.

그나마 가장 편한 방법으로는 다음 API를 이용해서 사용자에게 받은 GPS값을 주소값으로 변환시키는 API를 이용하는 것이다.

https://apis.daum.net/local/geo/coord2addr?apikey={{ api_key }}

&longitude={{ longitude }}
&latitude={{ latitude }}
&inputCoordSystem=WGS84&output=json

api key 를 넣은 다음, 위/경도 값을 넣어 주자. ( 모두 GET 방식이다. ) GPS 방식에 따라 inputCoodSystem의 값을 바꿔주면 된다. (자세한 것은 다음 API 문서를 참조하자.) 출력값을 json으로 받아오자.

그러면 다음과 같이 값이 떨어진다.

서울특별시 강동구 천호1동

첫 번째 구분인 서울특별시와 같이 1차 분류값이다. (예를 들어 인천광역시와 같은 광역시나 충청북도,전라북도,경상북도와 같은 도 )
2차 분류값은 1차 분류값으로 떨어진 2차 분류, 그리고 마지막 읍/면/리/동 과 같은 3차 분류이다.

총 3가지 분류값을 기준으로 공공데이터 포털 open api 에서 제공한 엑셀 문서를 찾아보면 해당 지역의 격자 값을 얻을 수 있다.
(매번 엑셀에서 뒤지는 것 보다, DB에서 조회하는게 더 빠를 것이다. )



다음으로 동네예보조회 서비스에서 잡은 예보 시간에 대한 개념에 대해 먼저 이해를 해야한다.

open api 문서를 읽어보면 3시간 단위로 예보가 업데이트 됨을 알 수 있다.

Base_time : 0200, 0500, 0800, 1100, 1400, 1700, 2000, 2300 (1일 8회)


하지만 base_time을 기준으로 바로 api를 제공하지는 않는다. 30분정도 뒤애야 api 해당 예보를 제공한다.

따라서 현재 시간을 기준으로 어떤 예보파일을 가져와야하는지 체크해야한다.

# newtime : 예보 파일 선택을 위한 시간 값
# newdate : 예보 파일 선택을 위한 날짜 값

if 0 <= int(datetime.now().strftime("%H%M")) < 230:
newdate = (date.today()-timedelta(days=1)).strftime("%Y%m%d")
newtime = '2300'

elif 230 <= int(datetime.now().strftime("%H%M")) < 530:
newdate = date.today().strftime("%Y%m%d")
newtime = '0200'

elif 530 <= int(datetime.now().strftime("%H%M")) < 830:
newdate = date.today().strftime("%Y%m%d")
newtime = '0500'

elif 830 <= int(datetime.now().strftime("%H%M")) < 1130:
newdate = date.today().strftime("%Y%m%d")
newtime = '0800'

elif 1130 <= int(datetime.now().strftime("%H%M")) < 1430:
newdate = date.today().strftime("%Y%m%d")
newtime = '1100'

elif 1430 <= int(datetime.now().strftime("%H%M")) < 1730:
newdate = date.today().strftime("%Y%m%d")
newtime = '1400'

elif 1730 <= int(datetime.now().strftime("%H%M")) < 2030:
newdate = date.today().strftime("%Y%m%d")
newtime = '1700'

elif 2030 <= int(datetime.now().strftime("%H%M")) < 2330:
newdate = date.today().strftime("%Y%m%d")
newtime = '2000'


여기서 newdate 변수를 보면,

예를 들어 현재 시간이 새벽 1시라고 하면 새벽 2시 예보 파일을 가져올 수 없다. ( api 미제공 )
따라서 그 전날의 23시 데이터를 가져와야한다. 그렇다면 지금 새벽 1시의 날짜가 아닌 하루 전날의 날짜로 23시 데이터를 불러와야한다.





해당 api를 이용해서 json으로 값을 받아오면, 여러가지 값들이 나온다.


항목값

항목명

단위

Missing

압축bit
POP강수확률 %-1 %8
PTY강수형태코드값-14
R066시간 강수량범주 (1 mm)-1 mm8
REH습도 %-1 %8
S066시간 신적설범주(1 cm)-1 cm8
SKY하늘상태코드값-14
T3H3시간 기온 -50 ℃10
TMN일최저기온 -50 ℃10
TMX일최고기온 -50 ℃10
UUU풍속(동서성분) m/s-100 m/s12
VVV풍속(남북성분) m/s-100 m/s12
WAV파고 M-1 m8
VEC풍향 m/s-110
WSD풍속1-110


총 14가지의 항목값을 조회할 수 있다. 14가지 항목이 모두 필요한게 아니니, 당연히 필터를 통해 원하는 데이터만 얻도록 하자.

위에서 사용한 api 주소값 뒤에 get 방식으로 다음을 추가하도록 하자.

&category= {{ 항목,항목,항목 }}

카테고리라는 변수이름으로 우리가 원하는 값들만 필터링해서 불러올 수 있다.


그리고 api 이기 때문에 지저분한?! 값들이 조금 섞여 있다. 적절하게 불필요한 부분을 날려서 사용하면 된다.


저작자 표시 비영리 변경 금지
신고
Creative Commons License
Creative Commons License

'[ETC] Developing' 카테고리의 다른 글

생활지수계산 알고리즘 - 기상청  (0) 2017.03.07
Bootstrap - 사이트 모음  (0) 2017.03.07
[CSS] Web front-end 110 CSS Menu (Free)  (0) 2017.02.13
[개발노트] 기상청 OPEN API  (0) 2017.02.08
[GRIB] GRIB data analysis api  (0) 2017.02.08
댓글
댓글쓰기 폼
공지사항
최근에 달린 댓글
Total
4,666
Today
12
Yesterday
97
링크
«   2017/06   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
글 보관함