정보
-
업무명 : NetCDF 형식 및 NCL 구조
-
작성자 : 이상호
-
작성일 : 2020-02-27
-
설 명 :
-
수정이력 :
내용
[개요]
-
안녕하세요? 웹 개발 및 연구 개발을 담당하고 있는 해솔입니다.
-
NCL (NCAR Command Language)은 미국의 NCAR (National Center for Atmospheric Research)에서 개발된 언어로서 지구과학/대기과학 분야에서 특화되었습니다. 이는 다양한 분야에서 널리 사용되는 Matlab과 비교할 때 라이브러리를 통해 쉽게 계산할 수 있습니다.
-
특히 예전에 자주 사용되는 소프트웨어인 GrADS는 간단한 인터페이스로 초보자도 빨리 익힐 수 있으나 소프트웨어의 유연성이 떨어집니다.
-
따라서 이러한 NCL에서 NetCDF 형식 및 NCL 변수를 소개드리고자 합니다.
[특징]
-
NetCDF 자료를 이해하기 위해서 NCL 변수 이해가 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 소프트웨어
[기능]
-
NetCDF 형식
-
NetCDF 다운로드
-
세부 내용 보기
-
NCL 파일 읽기
-
-
변수 구조
-
관용구
-
배열 인덱스
-
변수 속성
-
[활용 자료]
-
파일명 : air.2014.nc
-
자료 종류 : NCEP 재분석 자료 중에서 기온
-
확장자 : nc
-
기간 : 2014년
-
제공처 : 미국 NOAA 공식 홈페이지 (ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/air.2014.nc)
[자료 처리 방안 및 활용 분석 기법]
-
없음
[사용법]
-
작업 환경 구축
-
동일한 디렉터리에 "air.2014.nc" 및 "Test02.ncl"를 위치
-
-
소스 코드 실행 (ncl Test02.ncl)
-
실행 결과 확인
[사용 OS]
-
Linux (CentOS v7.0)
-
VMware Workstation Pro v15.5
[사용 언어]
-
NCL v6.3.0
세부 내용
[NetCDF 형식?]
-
형식과 비교할 때 가장 일반적인 과학 데이터는 이진 (Binary) 형식으로 저장됩니다.
-
일반적으로 이진 자료는 아스키보다 하드 디스크 공간과 데이터 전송 시간을 절약 할 수 있습니다.
-
두 가지 형식의 ASCII 및 이진 자료 (Binary)의 차이점을 모르는 경우 단계별로 설명하십시오 .
-
원도우 (Windows) 운영체제에서 메모장 또는 리눅스 (Linux)에서 vi 편집기를 통해 아스키 및 이진 자료 여부를 확인할 수 있습니다 예를 들어 vi로 이진 형식 파일을 강제로 열면 다음과 같이 깨진 문자를 확인할 수 있습니다.
[1 단계] NetCDF 자료 다운로드
-
빅 데이터를 과학적으로 처리할 경우 많은 공간을 차지하는 아스키 형식보다 이진 자료를 사용합니다.
-
이진 자료의 입/출력 (I/O)은 과학 연구에서 기본적으로 사용됩니다. 이러한 중요성을 고려하여 크로스 플랫폼, 소프트웨어 간의 입/출력 등을 포함하는 또 다른 특수 바이너리 형식인 NetCDF가 있습니다.
-
이러한 NetCDF 형식은 NCL에서 매우 간단하게 읽을 뿐만 아니라 수치예측 모델 (ECMWF, WRF 등)의 출력 파일로 사용되고 있습니다 (위성 영상 자료의 경우 HDF 형식 사용).
-
NCL에서 NetCDF를 읽는 방법은 HDF와 유사합니다.
[root linux@/SYSTEM/NCL]# wget "ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/air.2014.nc"
--2020-02-26 16:21:36-- ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/air.2014.nc
=> ‘air.2014.nc’
Resolving ftp.cdc.noaa.gov (ftp.cdc.noaa.gov)... 140.172.38.117
Connecting to ftp.cdc.noaa.gov (ftp.cdc.noaa.gov)|140.172.38.117|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done. ==> PWD ... done.
==> TYPE I ... done. ==> CWD (1) /Datasets/ncep.reanalysis.dailyavgs/pressure ... done.
==> SIZE air.2014.nc ... 110340178
==> PASV ... done. ==> RETR air.2014.nc ... done.
Length: 110340178 (105M) (unauthoritative)
100%[=====================================>] 110,340,178 1.56MB/s in 3m 1s
2020-02-26 16:24:41 (595 KB/s) - ‘air.2014.nc’ saved [110340178]
[2 단계] 세부 내용 보기
-
확인 결과 air.2004.nc 파일에는 5개 변수 (평균 기온, 고도, 위도, 경도, 시간)가 있습니다.
-
즉 위도는 -90-90, 경도는 0-357.5, 고도는 1000-10 hPa의 전역 변수임을 알 수 있습니다.
-
그리고 좌표는 144 x 73 x 17 격자이며 시간에 따라 365개의 정보가 있습니다.
-
주요 변수인 평균 기온 (예 : air)은 명명되어 있습니다.
[root localhost@/SYSTEM/NCL]# ncl_filedump air.2014.nc
Copyright (C) 1995-2015 - All Rights Reserved
University Corporation for Atmospheric Research
NCAR Command Language Version 6.3.0
The use of this software is governed by a License Agreement.
See http://www.ncl.ucar.edu/ for more details.
Variable: f
Type: file
filename: air.2014
path: air.2014.nc
file global attributes:
Conventions : COARDS
title : mean daily NMC reanalysis (2014)
history : created 2013/12 by Hoop (netCDF2.3)
description : Data is from NMC initialized reanalysis
(4x/day). It consists of most variables interpolated to
pressure surfaces from model (sigma) surfaces.
platform : Model
References : http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html
dataset_title : NCEP-NCAR Reanalysis 1
dimensions:
level = 17
lat = 73
lon = 144
time = 365 // unlimited
variables:
float level ( level )
units : millibar
actual_range : ( 1000, 10 )
long_name : Level
positive : down
GRIB_id : 100
GRIB_name : hPa
axis : Z
float lat ( lat )
units : degrees_north
actual_range : ( 90, -90 )
long_name : Latitude
standard_name : latitude
axis : Y
float lon ( lon )
units : degrees_east
long_name : Longitude
actual_range : ( 0, 357.5 )
standard_name : longitude
axis : X
double time ( time )
long_name : Time
delta_t : 0000-00-01 00:00:00
standard_name : time
axis : T
avg_period : 0000-00-01 00:00:00
units : hours since 1800-01-01 00:00:0.0
actual_range : ( 1875888, 1884624 )
float air ( time, level, lat, lon )
long_name : mean Daily Air temperature
units : degK
precision : 2
least_significant_digit : 1
GRIB_id : 11
GRIB_name : TMP
var_desc : Air temperature
dataset : NCEP Reanalysis Daily Averages
level_desc : Multiple levels
missing_value : -9.96921e+36
valid_range : ( 150, 350 )
actual_range : ( 180.77, 318.27 )
statistic : Mean
parent_stat : Individual Obs
_FillValue : -9.96921e+36
[3 단계] NetCDF 파일 읽기
-
다음과 같이 NCL 스크립트에서 .nc를 읽습니다.
-
상기 "내용의 사용법"에서와 같이 실행합니다.
-
해당 실행 소스 코드 (Test02.ncl)에 대해 자세히 드리자면
-
ncFile = addfile("air.2014.nc", "r")에서 NetCDF 파일 (air.2014.nc)을 읽는 준비가 되었음을 알려줍니다
-
Temp = ncFile->air에서 변수를 읽기 전에 변수의 이름 (예 : air)을 알아야합니다. 2 단계의 내용 보기를 참조하여 변수의 이름을 확인할 수있습니다.
-
printVarSummary(Temp)은 매우 유용한 함수로서 Temp 변수의 구조와 속성을 알 수 있습니다. 즉 Temp는 총 4개의 차원과 15개의 속성을 가지고 있습니다.
-
여기서 NetCDF가 편리한 위치를 확인할 수 있습니다. 하나의 명령으로 읽은 변수에는 할당된 좌표 축과 유효하지 않은 값 (_FillValue)이 포함되어 있습니다.
-
추후에 가시화할 때 별도로 지정할 필요가 없습니다. NCL은 각 온도가 맵에 있어야하는 위치를 알고 있습니다. 데이터가없는 경우, 즉 특정 그물의 온도 값이 유효하지 않은 값인 경우 NCL 그리기없이 건너 뛰기 (예 : 평균)를 계산할 때 NCL은 유효하지 않은 포인트도 자동으로 건너 뜁니다.
-
begin
ncFile = addfile("air.2014.nc","r")
Temp = ncFile->air
printVarSummary(Temp)
print(Temp@units)
print(Temp!0)
print(Temp!1)
print(Temp!2)
print(Temp!3)
print("All Done.")
end
[변수 구조]
-
관용구
-
~, !, &, @ 관용구는 "일반 인식"순서와 반대입니다. 예를 들면 NCEP 재분석 자료는 "시간 x 레벨 x 위도 x 경도"인 4 차원 좌표로서 일반적인 순서는 "X * Y * Z * T"이어야 합니다.
-
변수의 좌표 정보는 크게 2가지로 나타낼 수 있습니다. 우선 좌표 축 이름은 "! "으로 접근합니다. 예를 들어 시간은 Temp의 1 번째 좌표로서 print(Temp!0)을 사용하여 변수의 좌표 축 이름을 변경하거나 지정할 수 있습니다 (Temp!0 = "day" 또는 Temp!1 = "pressure").
-
마지막으로 좌표축 값은 &를 사용하여 접근합니다. 예를 들어 Temp는 자오선 위에 144 격자가 있으나 위/경도는 0-360도 또는 -180-180 입니까? 각 셀의 간격이 동일합니까? 이때 출력 (Temp & lon)를 사용하여 모든 경도 좌표를 표시할 수 있습니다.
-
동일한 방법을 사용하여 좌표 값을 설정할 수 있습니다. 예를 들면 Temp & lon = fspan (0, 360, -2.5, 144)와 같이 설정할 수 있습니다.
-
.nc 파일을 읽을 경우 대부분 좌표축 이름과 값은 미리 설정되어 있기 때문에 걱정할 필요가 없습니다. 그러나 새 변수를 계산하거나 일부 이진 파일을 읽을 때는 변수의 좌표 정보를 수동으로 설정해야합니다.
-
! 및 &는 필요한 기능입니다.
-
-
배열 인덱스
-
Test02.ncl에서 Temp!0에서 Temp!3까지 사용합니다.
-
NCL에서 배열의 1 번째 인덱스가 1이 아니라 0임을 알 수 있습니다. 예를 들어 17 개 요소로 구성된 배열 (level)의 경우 인덱스는 1-17이 아니라 0-16입니다.
-
level은 Temp의 2 번째 차원이나 Temp!2는 위도, Temp!1은 고도입니다.
-
Matlab과 같은 소프트웨어와 상호 작용할 때 때때로 혼동되기 때문에 (Matlab에서 배열 인덱스는 1부터 시작하고 좌표 순서는 X x Y x Z x T) 나중에 바이너리를 소개합니다.
-
형식 및 플랫폼 변환시 자세한 정보가 있습니다.
-
-
변수 속성
-
대부분의 속성이 사용자에게 표시되어 변수의 소스 코드, 프로세스, 정확성 등을 사용자에게 상기시킵니다. NCL은 유효하지 않은 값 (_FillValue)이 계산에 참여하지 않거나 가시화할 때 제목명 (long_name) 및 단위 (Unit)가 그래프의 좌측 상단 및 우측 상단에 배치되도록 사전 설정되는 것과 같은 소수의 특수 속성만 사용합니다.
-
이러한 속성은 @로 제어할 수 있습니다. Test02.ncl에서 print(Temp@units)는 Temp 변수의 단위를 볼 수 있습니다.
-
또한 이 방법을 통해 속성을 추가 및 수정할 수 있습니다. 예를 들면 Temp@long_name = "NCEP에서 공기 온도", Temp@today = "2015/03/09"
-
그 밖에 delete(Temp@var_desc)와 같이 속성을 삭제할 수 있습니다.
-
참고 문헌
[논문]
- 없음
[보고서]
- 없음
[URL]
- 없음
문의사항
[기상학/프로그래밍 언어]
- sangho.lee.1990@gmail.com
[해양학/천문학/빅데이터]
- saimang0804@gmail.com
'프로그래밍 언어 > NCL' 카테고리의 다른 글
[NCL] 쉘 스크립트 (Shell Script)에서 명령 줄 입력 파라메타 설정 및 NCL 실행 (0) | 2020.12.03 |
---|---|
[NCL] 텍스트 (TXT) 형식인 기온 자료를 이용한 시각화 (0) | 2020.12.03 |
[NCL] 전지구 기온 자료를 이용한 가시화 : 기본 구조 및 세부 내용 (0) | 2020.02.28 |
[NCL] 대화식 및 스크립트 모드 소개 (0) | 2020.01.21 |
[NCL] 온라인/오프라인 리눅스 (Linux) 환경에 따른 NCL 설치 방법 (0) | 2020.01.15 |
최근댓글