티스토리 뷰
(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 | 강수형태 | 코드값 | -1 | 4 |
R06 | 6시간 강수량 | 범주 (1 mm) | -1 mm | 8 |
REH | 습도 | % | -1 % | 8 |
S06 | 6시간 신적설 | 범주(1 cm) | -1 cm | 8 |
SKY | 하늘상태 | 코드값 | -1 | 4 |
T3H | 3시간 기온 | ℃ | -50 ℃ | 10 |
TMN | 일최저기온 | ℃ | -50 ℃ | 10 |
TMX | 일최고기온 | ℃ | -50 ℃ | 10 |
UUU | 풍속(동서성분) | m/s | -100 m/s | 12 |
VVV | 풍속(남북성분) | m/s | -100 m/s | 12 |
WAV | 파고 | M | -1 m | 8 |
VEC | 풍향 | m/s | -1 | 10 |
WSD | 풍속 | 1 | -1 | 10 |
총 14가지의 항목값을 조회할 수 있다. 14가지 항목이 모두 필요한게 아니니, 당연히 필터를 통해 원하는 데이터만 얻도록 하자.
위에서 사용한 api 주소값 뒤에 get 방식으로 다음을 추가하도록 하자.
&category= {{ 항목,항목,항목 }}
카테고리라는 변수이름으로 우리가 원하는 값들만 필터링해서 불러올 수 있다.
그리고 api 이기 때문에 지저분한?! 값들이 조금 섞여 있다. 적절하게 불필요한 부분을 날려서 사용하면 된다.
'[ETC] Developing' 카테고리의 다른 글
생활지수계산 알고리즘 - 기상청 (0) | 2017.03.07 |
---|---|
Bootstrap - 사이트 모음 (0) | 2017.03.07 |
[CSS] Web front-end 110 CSS Menu (Free) (0) | 2017.02.13 |
[GRIB] GRIB data analysis api (0) | 2017.02.08 |
- Total
- Today
- Yesterday
- css
- Django
- API
- s3
- OpenAPI
- admin
- grib
- 기상청
- uWSGI
- project
- swift3.0
- IOS
- nginx
- FTP
- pycon
- lib
- serverless
- CocoaPods
- jupyter
- boto3
- code review
- ubuntu
- Python
- Apple
- lambda
- 개발
- 파이썬
- Swift
- app
- AWS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |