Python 3 + 기상청 위성/레이더 영상 API 샘플 코드

Python 3에서 공공데이터포털(https://data.go.kr/)의 기상청 위성영상 조회 서비스(https://data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15058167)와 기상청 레이더 관측 자료 조회 서비스(https://data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15057166)에 접근하는 샘플 코드이다. 각 API 문서에 나와 있는 Python 3 샘플 코드는 urllib을 사용하도록 구현되어 있어서 requests로 구현했다.

기상청 위성영상 조회 서비스 API 샘플

import requests
from datetime import datetime
import xml.etree.ElementTree as ET

key = ''

params = {
	'ServiceKey': key,
	'pageNo': '1',
	'numOfRows': '10',
	'dataType': 'XML',
	'sat': 'G2',
	'data': 'ir105',
	#적외영상(ir105) 가시영상(vi006) 수증기영상(wv069) 단파적외영상(sw038) RGB 컬러(rgbt) RGB 주야간합성(rgbdn)
	'area': 'ko',
	'time': datetime.now().strftime("%Y%m%d")
}

def download(url, filename='result.png'):
	r = requests.get(url)
	with open(filename, 'wb') as f:
		f.write(r.content)

def parse_xml(xml):
	return [dict([(j.tag, (j.text or list(filter(lambda l: l, [k.text for k in j.iter()])))) for j in i]) for i in ET.fromstring(xml)]

r = requests.get('http://apis.data.go.kr/1360000/SatlitImgInfoService/getInsightSatlit', params=params)
result = parse_xml(r.text)

#가장 최근 이미지의 URL을 받아옴
url = result[1]['items'][-1]
#가장 최근 이미지 다운로드
download(url)

레이더 관측 자료 조회 서비스 API 샘플

import requests
from datetime import datetime
import xml.etree.ElementTree as ET

key = ''

params = {
	'ServiceKey': key,
	'pageNo': '1',
	'numOfRows': '10',
	'dataType': 'XML',
	'data': 'CMP_WRC',
	'time': datetime.now().strftime("%Y%m%d")
}

def download(url, filename='result.png'):
	r = requests.get(url)
	with open(filename, 'wb') as f:
		f.write(r.content)

def parse_xml(xml):
	return [dict([(j.tag, (j.text or list(filter(lambda l: l, [k.text for k in j.iter()])))) for j in i]) for i in ET.fromstring(xml)]

r = requests.get('http://apis.data.go.kr/1360000/RadarImgInfoService/getCmpImg', params=params)
result = parse_xml(r.text)

#가장 최근 이미지의 URL을 받아옴
url = result[1]['items'][-1]
#가장 최근 이미지 다운로드
download(url)

각 코드에 API key를 넣고 돌리면 아래와 같은 이미지가 다운로드된다.

두 API 모두 JSON 구현에 문제가 있는데, JSON으로 API 데이터를 요청하면 결과값이 정상적인 JSON 배열이 아니라 string으로 만들어진 JSON 데이터로 반환된다. 때문에 비록 Python에서는 XML에 비해 JSON 데이터를 다루는 것이 더 편리하지만 XML 요청으로 구현했다.

Leave a Reply

Your email address will not be published. Required fields are marked *