정보

    • 업무명     : NetCDF 형식인 NPP/CERES SSF 기상위성 자료를 이용하여 아스키 (ASCII) 형식으로 처리

    • 작성자     : 이상호

    • 작성일     : 2019-12-27

    • 설   명      :

    • 수정이력 :

     

     내용

    [특징]

    • NetCDF 형태인 기상위성 자료를 가시화하기 위해서 ASC 형태로 변환이 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 소프트웨어

     

    [기능]

    • NPP/CERES SSF 기상위성 자료를 이용하여 ASC 형태로 처리

     

    [활용 자료]

    • 위성명 : NPP 기상위성

    • 센서명 : CERES

    • 자료 레벨 : SSF

    • 자료 종류 : 날짜, 시간, 위도, 경도, 태양 천정각, 대기 상단에서의 상향단파복사, 대기 상단에서의 하향단파복사, 지표면 특성, 운량

    • 영역 : 전지구

    • 해상도 : 20 km

    • 확장자 : NetCDF

    • 기간 : 2012년 03월 15일 0000-2300 UTC

     

    [자료 처리 방안 및 활용 분석 기법]

    • 없음

     

    [사용법]

    • 입력 자료를 동일 디렉터리 위치

    • 소스 코드를 실행 (Rscript Processing_Using_NetCDF_Format_of_NPP_CERES_SSF_Data.R)

    • ASC 형태인 결과를 확인

     

    [사용 OS]

    • Windows10

     

    [사용 언어]

    • R v3.6.2

    • R Studio v1.2.5033

     

     소스 코드

    [명세]

    • 메모리 해제

    # Set Option
    memory.limit(size = 9999999999999)

     

    • 라이브러리 읽기

    # Library Load
    library(RNetCDF)
    library(tidyverse)
    library(lubridate)

     

    • 파일 읽기

    # File Read
    sInputFileDirName = "INPUT_SSF15/*.nc"
    sFileDirName = Sys.glob(sInputFileDirName)
    
    length(sFileDirName)
    sFileDirName

     

     

    • NetCDF 파일 읽기

    # NetCDF File Open
    ncFile = open.nc(sFileDirName[iCount])

     

    • 출력을 위한 파일명 초기화

    # Set Output File Name
    sFileDirNameSplit = unlist(str_split(string = sFileDirName[iCount], pattern = "_|/|\\."))
       
    sOutputFileDirName = paste0('OUTPUT/', sFileDirNameSplit[5], "_", sFileDirNameSplit[8], ".OUT")

     

     

    • NetCDF 파일 읽기

    # NetCDF File Read
    ncData = read.nc(ncFile)

     

    • NetCDF 파일 갯수 및 Time 단위 가져오기

    # Get Time Unit
    nFileNumber = dim.inq.nc(ncFile, "time")$length
    sTimeUnit = att.get.nc(ncFile, "time", "units")

     

     

    • NetCDF 변수 가져오기

    # Get Variable
    nDateTime = utcal.nc(sTimeUnit, ncData$time)
    nLon  = ncData[["lon"]]
    nLat  = ncData[["lat"]]
    nSza  = ncData[["CERES_solar_zenith_at_surface"]]
    nRsr  = ncData[["CERES_SW_TOA_flux___upwards"]]
    nInsw = ncData[["TOA_Incoming_Solar_Radiation"]]
    nDsr  = ncData[["CERES_downward_SW_surface_flux___Model_B"]]
    nSurfaceType = ncData[["Surface_type_index"]][1, ]
    nClearFraction = ncData[["Clear_layer_overlap_percent_coverages"]][1, ]

     

    • NetCDF 변수들을 Data Frame 형태로 초기화

    # Set Data Frame
    dfData = data.frame(nDateTime, nLat, nLon, nSza, nRsr, nInsw, nDsr, nSurfaceType, nClearFraction)
    
     # Print Data Frame
    dplyr::tbl_df(dfData)

     

     

    • Data Frame를 통해 L1 전처리

      • 각 변수에 따라 최소값/최대값 설정

    # L1 Processing Using Data Frame
    dfDataL1 = dfData %>%
       dplyr::filter(
          between(nLat, -90.0, 90.0)
          , between(nLon, -180.0, 180.0)
          , between(nSza, 0.0, 180.0)
          , between(nRsr, 0.0, 1400.0)
          , between(nInsw, 0.0, 1400.0)
          , between(nDsr, 0.0, 1400.0)
          , between(nSurfaceType, 1, 120)
          , between(nClearFraction, 0, 100)
       )
       
    # Print Data Frame
    dplyr::tbl_df(dfDataL1)

     

     

    • L1 자료를 이용해서 L2 전처리

      • NA 제거

    # Delete NA Using L1 Data Frame
    dfDataL2 = na.omit(dfDataL1)
       
    # Print Data Frame
    dplyr::tbl_df(dfDataL2)

     

     

    • L2 자료를 출력

      • 옵션 설명

        • sep : 구분자

        • file : 출력 파일명

        • append : 이어쓰기 여부

        • row.names : 행 이름 포함 여부 

        • col.names : 열 이름 포함 여부

     # Write Using L2 Data Frame
    write.table(
       dfDataL2
       , sep = " "
       , file = sOutputFileDirName
       , append = FALSE
       , row.names = FALSE
       , col.names = FALSE
    )

     

     

     

    [전체]

     

     

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

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

    • sangho.lee.1990@gmail.com

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

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