반응형

     정보

    • 업무명     : 바이너리 형식인 히마와리 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()

     

    그림. 히마와리 8호 (Himawari-8/AHI) 기상위성 자료를 이용한 대기 상단에서의 상향단파복사 맵핑.

     

    [전체]

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

    [기상학/프로그래밍 언어]

    • sangho.lee.1990@gmail.com

    [해양학/천문학/빅데이터]

    • saimang0804@gmail.com
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기