세계기상:gts_전문자료
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판다음 판 | 이전 판 | ||
| 세계기상:gts_전문자료 [2026/04/21 01:41] – [① 기본관측 및 수집 (Primary Collection)] admin | 세계기상:gts_전문자료 [2026/05/06 08:28] (현재) – [4. 자료의 활용 (Applications)] admin | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| ======세계기상 데이터====== | ======세계기상 데이터====== | ||
| + | |||
| + | [[세계기상: | ||
| =====1. 개요 (Overview)===== | =====1. 개요 (Overview)===== | ||
| 세계기상기구(WMO) 정보시스템은 전세계 기상기후 데이터를 실시간으로 교환하기 위한 핵심 인프라입니다. 대한민국 기상청(KMA)은 세계적 수준의 기상 기술력을 인정받아, | 세계기상기구(WMO) 정보시스템은 전세계 기상기후 데이터를 실시간으로 교환하기 위한 핵심 인프라입니다. 대한민국 기상청(KMA)은 세계적 수준의 기상 기술력을 인정받아, | ||
| - | • GTS(Global Telecommunication System): 1960년대부터 운영된 전용망기반의 통신체계입니다. 전 세계 기상 관측자료를 폐쇄형 네트워크를 통해 실시간으로 주고받는 전통적인 통로입니다. | + | |
| - | • WIS(WMO Information System): GTS를 확장한 통합 정보 시스템입니다. 기상뿐만 아니라 수문, 해양 등 WMO의 모든 데이터를 통합관리하며, | + | |
| - | • WIS2.0: 2025년부터 도입된 차세대 시스템입니다. 클라우드와 인터넷 표준기술(Web API, MQTT등)을 활용하여 고해상도 기상데이터를 더욱 빠르고 개방적으로 공유하는 것을 목표로 합니다. | + | |
| - | • 전문(專文)의 개념: 통신 효율을 극대화하기 위해 약속된 부호와 형식으로 압축된 데이터 메시지입니다. | + | |
| =====2. 관측 및 데이터 수집 (Observation & Collection)===== | =====2. 관측 및 데이터 수집 (Observation & Collection)===== | ||
| GTS는 전 세계 기상 관측 자료를 실시간으로 수집하고 교환하기 위해 구축된 WMO의 중추적인 전용 통신망입니다. 이 시스템은 정해진 규격과 경로를 통해 데이터의 신뢰성과 즉시성을 보장합니다. | GTS는 전 세계 기상 관측 자료를 실시간으로 수집하고 교환하기 위해 구축된 WMO의 중추적인 전용 통신망입니다. 이 시스템은 정해진 규격과 경로를 통해 데이터의 신뢰성과 즉시성을 보장합니다. | ||
| - | ====① 데이터 수집원 (Data Sources)==== | + | ====2.1 데이터 수집원 (Data Sources)==== |
| GTS를 통해 수집되는 관측 자료는 전 지구적 관측 시스템(GOS)으로부터 발생하며, | GTS를 통해 수집되는 관측 자료는 전 지구적 관측 시스템(GOS)으로부터 발생하며, | ||
| - | • 지상 및 해양 관측: 전 세계 기상관측소(ASOS), | + | |
| - | • 고층 및 위성관측: | + | |
| - | ====② 보조관측 및 수집 | + | ====2.2 수집 |
| - | WMO의 차세대 정보시스템인 WIS(WMO Information System)를 통해 전 세계로부터 수신하는 데이터입니다. | + | |
| - | | + | |
| - | | + | |
| - | + | ||
| - | • 타국 수치예보 모델 결과: 유럽중기예보센터(ECMWF), 미국(NCEP) 등의 전 지구 예보 모델 산출물(GRIB 포맷)을 수신하여 분석 | + | |
| {{세계기상: | {{세계기상: | ||
| 줄 35: | 줄 34: | ||
| =====3. 산출물 (Data Products)===== | =====3. 산출물 (Data Products)===== | ||
| - | GTS 전문자료는 | + | 수집된 |
| - | • TAC(Traditional Alphanumeric Codes) 전문: 사람이 읽을 수 있는 문자/ | + | |
| - | | + | * **SYNOP**: 지상 종관 관측 보고. |
| - | | + | * **TEMP**: 고층 기상 관측(레윈존데) 보고. |
| - | | + | * **METAR/SPECI**: 항공기 이착륙을 위한 공항 기상 실황 및 특별 보고. |
| - | • BUFR(Binary Universal Form for the Representation): | + | |
| - | • GRIB(General Regularly-distributed Information in Binary): 수치예보 모델의 격자 데이터를 전송하기 위한 표준 이진 포맷입니다. 기상청의 수치모델 결과물도 이 형식으로 세계에 공유됩니다. | + | |
| =====4. 자료의 활용 (Applications)===== | =====4. 자료의 활용 (Applications)===== | ||
| 줄 53: | 줄 52: | ||
| 전 지구 GTS 전문자료는 현대 기상학의 모든 분야에서 ' | 전 지구 GTS 전문자료는 현대 기상학의 모든 분야에서 ' | ||
| - | • 수치예보 모델 입력(Data Assimilation): | + | • **수치예보 모델 입력(Data Assimilation)**: 기상청 전 지구 수치예보 모델(KIM)의 초기값을 생성하기 위해 전 세계의 GTS 자료를 입력합니다. 자료가 많고 정확할수록 예보의 정확도가 기하급수적으로 상승합니다. |
| + | |||
| + | • **국제 항공 및 해상 안전**: 전 세계 공항의 METAR 정보를 실시간 확인하여 장거리 비행의 연료 산정 및 비행 경로를 결정합니다. 해상의 부이 및 선박 자료는 선박의 안전 항해(Weather Routing)에 직결됩니다. | ||
| + | |||
| + | • **기후 변화 감시**: 전 지구적 기온 상승 추세 및 이상 기후(엘니뇨, | ||
| + | |||
| + | • **학술 및 산업 연구**: 해외 수출입 물류 기업, 글로벌 신재생 에너지 기업 등이 해외 지점의 기후 리스크를 분석하는 데 기초 자료로 사용합니다. | ||
| + | |||
| + | ===== 5. 활용방안 ===== | ||
| + | |||
| + | 소스코드: | ||
| + | |||
| + | ==== 5.1. 라이브러리 설치 및 기본 설정 ==== | ||
| + | |||
| + | GTS 지상관측 자료 조회 및 기온 비교 그래프 생성을 위한 라이브러리를 설치합니다. | ||
| + | |||
| + | <code py> | ||
| + | pip install requests pandas matplotlib | ||
| + | </ | ||
| + | |||
| + | <code py> | ||
| + | import requests | ||
| + | import pandas as pd | ||
| + | import matplotlib | ||
| + | matplotlib.use(" | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | from io import StringIO | ||
| + | from datetime import datetime, timedelta, timezone | ||
| + | </ | ||
| + | |||
| + | API 인증키와 API 주소, 조회할 도시 및 시간 조건을 설정합니다. | ||
| + | |||
| + | <code py> | ||
| + | AUTH_KEY = " | ||
| + | |||
| + | BASE_URL = " | ||
| + | |||
| + | STATIONS = { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | |||
| + | END_TM_UTC = " | ||
| + | DTM_HOURS = 24 | ||
| + | PLOT_INTERVAL_HOURS = 3 | ||
| + | |||
| + | OUTPUT_PNG = " | ||
| + | </ | ||
| + | |||
| + | BASE_URL은 (신)기상자료개방포털 > API > 세계기상 > GTS관측 > "GTS 지상관측 조회(BUFR자료를 TAC 형태로 변환)" | ||
| + | 메뉴의 호출 URL을 사용합니다. | ||
| + | |||
| + | STATIONS에는 비교할 도시명과 GTS 지점번호를 입력합니다. | ||
| + | |||
| + | END_TM_UTC는 조회 종료시각이며 UTC 기준으로 입력합니다. | ||
| + | |||
| + | ==== 5.2. GTS 지상관측 자료 조회 및 정리 ==== | ||
| + | |||
| + | API를 호출하여 각 도시의 GTS 지상관측 자료를 조회합니다. | ||
| + | |||
| + | <code py> | ||
| + | def fetch_station_text(stn_id, | ||
| + | params = { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | |||
| + | response = requests.get(BASE_URL, | ||
| + | response.raise_for_status() | ||
| + | |||
| + | return response.text | ||
| + | </ | ||
| + | |||
| + | API 응답에는 설명 줄과 실제 데이터 줄이 함께 포함되어 있습니다. \\ | ||
| + | 설명 줄은 #으로 시작하고, | ||
| + | |||
| + | <code py> | ||
| + | def extract_data_lines(text): | ||
| + | data_lines = [] | ||
| + | |||
| + | for raw_line in text.splitlines(): | ||
| + | line = raw_line.strip() | ||
| + | |||
| + | if not line: | ||
| + | continue | ||
| + | |||
| + | if line[0].isdigit(): | ||
| + | data_lines.append(line) | ||
| + | |||
| + | return data_lines | ||
| + | </ | ||
| + | |||
| + | 추출한 데이터 줄을 pandas DataFrame으로 변환합니다.\\ | ||
| + | 이때 시간 컬럼은 UTC 기준으로 읽은 뒤, 한국시간(KST) 컬럼도 함께 생성합니다. | ||
| + | |||
| + | <code py> | ||
| + | COLUMNS = [ | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | |||
| + | def parse_text_to_dataframe(text): | ||
| + | data_lines = extract_data_lines(text) | ||
| + | |||
| + | if len(data_lines) == 0: | ||
| + | return pd.DataFrame() | ||
| + | |||
| + | table_text = " | ||
| + | |||
| + | df = pd.read_csv( | ||
| + | StringIO(table_text), | ||
| + | sep=r" | ||
| + | header=None, | ||
| + | names=COLUMNS, | ||
| + | engine=" | ||
| + | ) | ||
| + | |||
| + | for col in COLUMNS: | ||
| + | if col != " | ||
| + | df[col] = pd.to_numeric(df[col], | ||
| + | |||
| + | df[" | ||
| + | df[" | ||
| + | format=" | ||
| + | errors=" | ||
| + | ) | ||
| + | |||
| + | kst = timezone(timedelta(hours=9)) | ||
| + | df[" | ||
| + | df[" | ||
| + | |||
| + | return df | ||
| + | </ | ||
| + | |||
| + | 여러 도시의 자료를 조회한 뒤 하나의 DataFrame으로 합칩니다. | ||
| + | |||
| + | <code py> | ||
| + | def collect_all_cities(stations, | ||
| + | all_frames = [] | ||
| + | |||
| + | for city, stn_id in stations.items(): | ||
| + | text = fetch_station_text(stn_id, | ||
| + | df = parse_text_to_dataframe(text) | ||
| + | |||
| + | if df.empty: | ||
| + | continue | ||
| + | |||
| + | df = df[df[" | ||
| + | df[" | ||
| + | |||
| + | all_frames.append(df) | ||
| + | |||
| + | if len(all_frames) == 0: | ||
| + | return pd.DataFrame() | ||
| + | |||
| + | result = pd.concat(all_frames, | ||
| + | result = result.sort_values([" | ||
| + | |||
| + | return result | ||
| + | </ | ||
| + | |||
| + | ==== 5.3. 기온 자료 저장 및 그래프 표출 ==== | ||
| + | |||
| + | 수집한 자료 중 도시명, 지점번호, | ||
| + | |||
| + | <code py> | ||
| + | def build_temperature_table(df): | ||
| + | out = df[[" | ||
| + | out = out.sort_values([" | ||
| + | |||
| + | return out | ||
| + | </ | ||
| + | |||
| + | 기온 비교용 자료를 CSV 파일로 저장합니다. | ||
| + | |||
| + | <code py> | ||
| + | def save_csv(df, | ||
| + | df.to_csv(filename, | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | 도시별 기온 변화를 선 그래프로 저장합니다. | ||
| + | |||
| + | <code py> | ||
| + | def plot_temperature(temp_df): | ||
| + | plot_df = temp_df.pivot_table( | ||
| + | index=" | ||
| + | columns=" | ||
| + | values=" | ||
| + | aggfunc=" | ||
| + | ) | ||
| + | |||
| + | plt.figure(figsize=(12, | ||
| + | |||
| + | for city in plot_df.columns: | ||
| + | plt.plot( | ||
| + | plot_df.index, | ||
| + | plot_df[city], | ||
| + | marker=" | ||
| + | linewidth=2, | ||
| + | label=city | ||
| + | ) | ||
| + | |||
| + | plt.title(" | ||
| + | plt.xlabel(" | ||
| + | plt.ylabel(" | ||
| + | plt.grid(True) | ||
| + | plt.legend() | ||
| + | plt.xticks(rotation=45) | ||
| + | plt.tight_layout() | ||
| + | |||
| + | plt.savefig(OUTPUT_PNG, | ||
| + | plt.close() | ||
| + | </ | ||
| + | |||
| + | 전체 실행 코드는 다음과 같습니다. | ||
| + | |||
| + | <code py> | ||
| + | end_tm_str = END_TM_UTC | ||
| + | |||
| + | raw_df = collect_all_cities(STATIONS, | ||
| + | |||
| + | temp_df = build_temperature_table(raw_df) | ||
| + | |||
| + | save_csv(raw_df, | ||
| + | save_csv(temp_df, | ||
| + | |||
| + | plot_temperature(temp_df) | ||
| + | </ | ||
| - | • 국제 항공 및 해상 안전: 전 세계 공항의 METAR 정보를 | + | 실행하면 다음 파일이 생성됩니다. |
| - | • 기후 변화 감시: 전 지구적 기온 상승 추세 및 이상 기후(엘니뇨, | + | ^ city ^ |
| + | | Beijing | 54511 | 2022-11-29 12:00:00+00:00 | 2022-11-29 21: | ||
| + | | Seoul | 47108 | 2022-11-29 12: | ||
| + | | Tokyo | 47662 | 2022-11-29 12: | ||
| + | | Beijing | 54511 | 2022-11-29 15: | ||
| + | | Seoul | 47108 | 2022-11-29 15: | ||
| + | | Tokyo | 47662 | 2022-11-29 15: | ||
| + | | Beijing | 54511 | 2022-11-29 18: | ||
| + | | Seoul | 47108 | 2022-11-29 18: | ||
| + | | Tokyo | 47662 | 2022-11-29 18: | ||
| + | | Beijing | 54511 | 2022-11-29 21: | ||
| + | | Seoul | 47108 | 2022-11-29 21: | ||
| + | | Tokyo | 47662 | 2022-11-29 21: | ||
| + | | Beijing | 54511 | 2022-11-30 00: | ||
| + | | Seoul | 47108 | 2022-11-30 00: | ||
| + | | Tokyo | 47662 | 2022-11-30 00: | ||
| + | | Beijing | 54511 | 2022-11-30 03: | ||
| + | | Seoul | 47108 | 2022-11-30 03: | ||
| + | | Tokyo | 47662 | 2022-11-30 03: | ||
| + | | Beijing | 54511 | 2022-11-30 06: | ||
| + | | Seoul | 47108 | 2022-11-30 06: | ||
| - | • 학술 및 산업 연구: 해외 수출입 물류 기업, 글로벌 신재생 에너지 기업 등이 해외 지점의 기후 리스크를 분석하는 데 기초 자료로 사용합니다. | ||
| + | {{: | ||