정보
-
업무명 : 바이너리 형식인 히마와리 8호 (Himawari-8/AHI) 기상 위성 자료를 이용한 가시화
-
작성자 : 이상호
-
작성일 : 2019-10-22
-
설 명 :
-
수정이력 :
-
2020-02-08 : 소스 코드 명세 추가
-
내용
[개요]
-
안녕하세요? 웹 개발 및 연구 개발을 담당하고 있는 해솔입니다.
-
대기과학에서 제공되는 자료 형식은 "CSV, 바이너리 이진 자료 (Binary), NetCDF, HDF4, HDF5, Grib, Grb2, Bufr" 등이 있습니다.
-
대부분 용도에 맞게 사용하기 때문에 각각 모든 형식에 맞게 자료 전처리 및 가시화는 필연입니다.
-
예를 들면 기상청의 경우 지상 관측 자료와 기상 위성 자료 및 수치예보 그리고 기타의 경우 각각 "CSV 형식"와 "NetCDF, HDF4, HDF5" 및 "Grib, Gr2, Bufr" 그리고 "바이너지 이진 자료 (Binary)"로 배포합니다.
-
오늘은 대기과학에서 사용되는 바이너리 이진 자료 (Binary) 설명뿐만 아니라 Python을 이용하여 자료 전처리 및 가시화를 소개해 드리고자 합니다.
[특징]
-
바이너리 형태인 기상위성 자료를 이해하기 위해 가시화 도구가 필요하며 이 프로그램은 이러한 목적을 달성하기 위해 고안된 소프트웨어
[기능]
-
히마와리 8호 (Himawari-8/AHI) 기상위성 자료를 이용한 가시화
[활용 자료]
-
위성명 : 히마와리 8호 (Himawari-8) 기상위성 자료
-
센서명 : AHI 기상영상기
-
자료종류 : 대기상단에서의 상향단파복사
-
영역 : 전구
-
해상도 : 2 km
-
도법 : GEOS
-
확장자 : 바이너리 (.bin)
-
기간 : 2017년 08월 01일 0000 UTC (0900 KST)
[자료 처리 방안 및 활용 분석 기법]
-
없음
[사용법]
-
입력 자료를 동일 디렉터리 위치
-
소스 코드를 실행 (Jupyter notebook 실행)
-
가시화 결과를 확인
[사용 OS]
-
Window 10
[사용 언어]
-
Python v2.7
소스 코드
[명세]
-
라이브러리 읽기
# Library
import pandas as pd
import numpy as np
import sys
# import iris
import os
import matplotlib.pyplot as plt
from dplython import *
# (DplyFrame, X, diamonds, select, sift, sample_n,
# sample_frac, head, arrange, mutate, group_by, summarize, DelayFunction)
from scipy.stats import linregress
from matplotlib import pyplot as plt
from IPython.display import Image
from mpl_toolkits.basemap import Basemap
from matplotlib.colors import Normalize
import matplotlib
import matplotlib.cm as cm
import seaborn as sns
from scipy.stats import linregress
from matplotlib import rcParams
from netCDF4 import Dataset
import struct
import binascii
from mpl_toolkits.basemap import addcyclic
from netCDF4 import num2date, date2num, date2index
import datetime
from pyhdf.SD import SD, SDC
import h5py
-
이진자료 설정
-
위도 : file_lat
-
경도 : file_lon
-
변수 : 대기상단에서의 상향단파복사 (file_rsr), 지표면에서의 하향단파복사 (file_dsr), 지표면에서의 흡수단파복사 (file_asr)
-
file_lat = 'AHI/Lat_2km.bin'
file_lon = 'AHI/Lon_2km.bin'
file_rsr = 'AHI/himawari8_ahi_le2_rsr_fd020ge_201708010000.bin'
file_dsr = 'AHI/himawari8_ahi_le2_dsr_fd020ge_201708010000.bin'
file_asr = 'AHI/himawari8_ahi_le2_asr_fd020ge_201708010000.bin'
-
이진자료 읽기
-
격자수 (5500 * 5500) 및 32 bit 실수형 (f4)
-
2차원 위/경도, 변수
-
nx, ny = 5500,5500
lat = np.fromfile(file_lat, dtype='f4', count=nx*ny)
lon = np.fromfile(file_lon, dtype='f4', count=nx*ny)
rsr = np.fromfile(file_rsr, dtype='f4', count=nx*ny)
dsr = np.fromfile(file_dsr, dtype='f4', count=nx*ny)
asr = np.fromfile(file_asr, dtype='f4', count=nx*ny)
-
위/경도, 변수에 대해 1차원 변환
-
"dplython"를 이용하기 위해서 1차원 필요
-
2차원 위/경도 (lat, lon), 변수 (rsr, dsr, asr)를 1차원으로 변환
-
lat1D = np.reshape(lat, (1,np.product(lat.shape)))[0]
lon1D = np.reshape(lon, (1,np.product(lon.shape)))[0]
rsr1D = np.reshape(rsr, (1,np.product(rsr.shape)))[0]
dsr1D = np.reshape(dsr, (1,np.product(dsr.shape)))[0]
asr1D = np.reshape(asr, (1,np.product(asr.shape)))[0]
-
Data Frame 설정
-
1차원 위도, 경도, 변수 (rsr1D, dsr1D, asr1D)
-
data = pd.DataFrame( np.column_stack( [lat1D, lon1D, rsr1D, dsr1D, asr1D] ),
columns=['lat', 'lon', 'rsr', 'dsr', 'asr'] )
data.head()
lat lon rsr dsr asr
0 -999.0 -999.0 -999.0 -999.0 -999.0
1 -999.0 -999.0 -999.0 -999.0 -999.0
2 -999.0 -999.0 -999.0 -999.0 -999.0
3 -999.0 -999.0 -999.0 -999.0 -999.0
4 -999.0 -999.0 -999.0 -999.0 -999.0
-
Data Frame를 통해 L1 전처리
-
최근 데이터 분석에서 사용되는 R의 "dplyr" 라이브러리와 유사한 "dplython"를 사용
-
각 변수에 대한 최대값 및 최소값 설정
-
data_L1 = ( DplyFrame(data) >>
sift( (-90 <= X.lat) & (X.lat <= 90) ) >>
sift( (-180 <= X.lon) & (X.lon <= 360) ) >>
sift( (0 <= X.rsr) & (X.rsr <= 1400) ) >>
sift( (0 <= X.dsr) & (X.dsr <= 1400) ) >>
sift( (0 <= X.asr) & (X.asr <= 1400) )
)
data_L1.head()
lat lon rsr dsr asr
1190694 61.321709 138.445206 139.451675 589.101013 412.370697
1190695 61.321381 138.485992 215.651627 505.462738 353.823914
1190696 61.321049 138.526901 269.212860 444.595551 311.216888
1190697 61.320728 138.567703 218.084015 499.766724 349.836700
1190698 61.320412 138.608597 150.531281 576.005920 403.204132
-
L1를 통해 요약 통계량
-
각 변수에 대한 "개수, 평균, 분산, 최소값, 25%, 50%, 75%, 최대값" 확인
-
data_L1.describe()
lat lon rsr dsr asr
count 1.518866e+07 1.518866e+07 1.518866e+07 1.518866e+07 1.518866e+07
mean 4.757568e+00 9.869885e+01 1.819552e+02 6.098126e+02 4.397938e+02
std 2.402730e+01 1.053974e+02 1.580689e+02 2.298630e+02 1.608990e+02
min -5.195493e+01 -1.800000e+02 1.718120e+01 6.617941e+01 4.632558e+01
25% -1.360105e+01 1.226288e+02 7.291244e+01 4.191734e+02 2.934214e+02
50% 4.718064e+00 1.416668e+02 1.248515e+02 6.121706e+02 4.285194e+02
75% 2.324970e+01 1.590288e+02 2.666566e+02 8.142725e+02 5.699908e+02
max 6.132171e+01 1.800000e+02 9.308558e+02 1.177838e+03 8.244866e+02
- 가시화를 위한 설정
- 초기 설정
- 크기 : figure
- 스타일 : style
- 폰트 : rc, rcParams
- 지도 해상도 : Basemap
- 변수 설정
- 위도 (lon), 경도 (lat), 대기상단에서의 상향단파복사 (rsr)
- 그림 설정
- 산점도 : scatter
- 컬러바 : colorbar
- 해안선 : drawcostlines, drawcountries, drawmapboundary
- 수평/수직 그리드 : drawparallels, drawmeridians
- 그림 제목 : title
- 그림 위치에 따른 텍스트 삽입 : annotate
%matplotlib inline
# define plot size in inches (width, height) & resolution(DPI)
plt.figure(figsize=(12, 10))
# style
plt.style.use('seaborn-darkgrid')
# define font size
plt.rc("font", size=22)
rcParams['font.family'] = 'New Century Schoolbook'
# plt.rcParams["font.weight"] = "bold"
# plt.rcParams['axes.labelsize'] = 26
# plt.rcParams['xtick.labelsize'] = 26
# plt.rcParams['ytick.labelsize'] = 26
# plt.rcParams["axes.labelweight"] = "bold"
# plt.rcParams["axes.titleweight"] = "bold"
m = Basemap(projection='cyl', lon_0 = 180, lat_0 = 0)
# m = Basemap(projection='mill', lon_0 = 180, lat_0 = 0)
# X = data_L1["lon"].values
# Y = data_L1["lat"].values
# VAL = data_L1["t2m"].values
# m.scatter(X, Y, c=VAL, s=15, marker="s", zorder=1, vmin=220, vmax=320, cmap=plt.cm.get_cmap('jet'), alpha=1.0)
X, Y = m(*np.meshgrid(lon, lat))
VAL = t2m[0][:][:]
m.pcolormesh(X, Y, VAL, shading='flat', vmin=220, vmax=320, cmap=plt.cm.get_cmap('jet'), alpha=1.0)
# m.colorbar(location='right',label='2 Meter Temperature [K]')
m.colorbar(location='bottom',label='2 Meter Temperature [K]', pad=0.5)
m.drawcoastlines()
m.drawcountries()
m.drawmapboundary(fill_color='white')
m.drawparallels(np.arange(-90,91,30), labels=[1,0,0,0], dashes=[2,2])
m.drawmeridians(np.arange(0,361,60), labels=[0,0,0,1], dashes=[2,2])
plt.title('ECMWF / ERA : %04d-%02d \n' %( data_L1.year[0].astype('int'), data_L1.month[0].astype('int') ) )
# plt.savefig("FIG/Scane_analysis_Himawari-8_AHI_RSR.png")
plt.show()
[전체]
참고 문헌
[논문]
- 없음
[보고서]
- 없음
[URL]
- 없음
문의사항
[기상학/프로그래밍 언어]
- sangho.lee.1990@gmail.com
[해양학/천문학/빅데이터]
- saimang0804@gmail.com
'프로그래밍 언어 > Python' 카테고리의 다른 글
[Python] 파이썬 HDF 형식인 천리안위성 1A호 (COMS/MI) 기상위성 자료를 이용한 가시화 (4) | 2019.10.23 |
---|---|
[Python] 파이썬 Grib 및 Grb2 형식인 수치예측모델 (ECMWF) 자료를 이용한 가시화 (0) | 2019.10.23 |
[Python] 파이썬 라디오 미터 및 라디오 존데 관측 자료를 이용한 고도별 온/습도 등고선 가시화 (0) | 2019.09.07 |
[Python] 파이썬 라디오미터 밝기온도 자료를 이용한 시계열 그래프 (0) | 2019.09.07 |
[Python] 파이썬 과학 기술 계산 및 처리에 유용한 패키지 소개 (0) | 2019.09.05 |
최근댓글