정보
-
업무명 : "raster" 패키지 및 NetCDF 형식인 NOAA 최적 내삽 자료를 이용하여 데이터 프레임 (Data Frame)으로 변환 처리 및 가시화 (1)
-
작성자 : 이상호
-
작성일 : 2020-02-13
-
설 명 :
-
수정이력 :
내용
[개요]
-
안녕하세요? 기상 연구 및 웹 개발을 담당하고 있는 해솔입니다.
-
일반적인 인공 위성 센서의 해양 및 환경 변수는 대부분 NetCDF 형식으로 저장합니다. 이러한 NetCDF 파일은 데이터의 내용 및 형식을 설명하는 일반적인 배열과 메타 데이터로 구성되어 1개 이상의 변수를 포함하고 있습니다.
-
예를 들어 위도, 경도, 해수면 온도의 함수인 "Surface Sea Temperature"라는 변수가 있을 수 있습니다. 이러한 NetCDF 파일에는 변수 배열의 범위를 설명하는 차원도 포함됩니다.
-
앞서 예시와 같이 NetCDF 파일을 읽고 쓸 수있는 패키지 및 출력은 데이터의 배열 또는 행렬이며 위도, 경도, 시간 및 해수면 온도와 같은 다른 변수의 원자 벡터입니다.
-
불행하게도 배열이나 행렬은 R의 기본 데이터 형식이 아닙니다. 그 대신 데이터 프레임 (Data Frame)은 기본 형식으로서 데이터를 조작/변환/분석이 가능합니다. 마찬가지로 대부분의 가시화 패키지는 그림을 그리기 위해 데이터 프레임을 사용합니다.
-
따라서 이 포스팅에서는 NetCDF 파일을 이용하여 데이터 프레임으로 변환 처리 및 가시화을 소개해드리고자 합니다.
[특징]
-
R에서 NetCDF 파일을 처리하기 위해서 데이터 프레임으로 변환 처리가 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 소프트웨어
[기능]
-
투영법 정의
-
NetCDF 자료를 데이터 프레임으로 변환
[활용 자료]
-
자료명 : sst.wkmean.1990-present.nc
-
자료 종류 : 최적 내삽 해수면 온도
-
확장자 : NetCDF
-
영역 : 전지구
-
기간 : 1989년 12월 31일 - 2020년 02월 20일
-
시간 해상도 : 일 1개 (21시)
-
제공처 : ESRL | Physical sciences Division
[자료 처리 방안 및 활용 분석 기법]
-
없음
[사용법]
-
소스 코드 참조
[사용 OS]
-
Windows 10
[사용 언어]
-
R v3.6.2
-
R Studio v1.2.5033
소스 코드
[명세]
-
전역 설정
-
최대 10 자리 설정
-
메모리 해제
-
영어 인코딩 설정
-
폰트 설정
-
# Set Option
memory.limit(size = 9999999999999)
options(digits = 10)
Sys.setlocale("LC_TIME", "english")
font = "Palatino Linotype"
-
라이브러리 읽기
# Library Load
library(extrafont)
library(ncdf4)
library(tidyverse)
library(ncdump)
library(RNetCDF)
library(tidyverse)
library(lubridate)
library(gganimate)
library(insol)
library(spData)
library(raster)
-
NetCDF 파일 설정 및 읽기
-
raster는 행렬 또는 이미지에서 처음부터 raster 레이어를 만드는 것 외에도 NetCDF 파일을 읽기 가능
-
NOAA에서 최적 내삽 해수면 온도 자료를 사용
-
sFileDirName = Sys.glob("INPUT/sst.wkmean.1990-present.nc")
raData = raster(sFileDirName)
raData
> raData
class : RasterLayer
band : 1 (of 1574 bands)
dimensions : 180, 360, 64800 (nrow, ncol, ncell)
resolution : 1, 1 (x, y)
extent : 0, 360, -90, 90 (xmin, xmax, ymin, ymax)
crs : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
source : /INPUT/sst.wkmean.1990-present.nc
names : Weekly.Mean.of.Sea.Surface.Temperature
z-value : 1989-12-31
zvar : sst
-
투영법 정의
-
전지구 영역 자료이기 때문에 투영법 정의 필요
-
proj4string을 통해 raster 레이어의 좌표를 세계 측지 시스템 (WGS84)으로 변환
-
proj4string(dfData)=CRS("+init=EPSG:4326")
> raData
class : RasterLayer
band : 1 (of 1574 bands)
dimensions : 180, 360, 64800 (nrow, ncol, ncell)
resolution : 1, 1 (x, y)
extent : 0, 360, -90, 90 (xmin, xmax, ymin, ymax)
crs : +init=EPSG:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
source : D:/30. 사업 관리/01. 복사-위성 연구소/사업 program/CERES/INPUT/sst.wkmean.1990-present.nc
names : Weekly.Mean.of.Sea.Surface.Temperature
z-value : 1989-12-31
zvar : sst
-
데이터 프레임 (Data Frame) 변환
-
as.data.frame를 통해 래스터 레이어를 데이터 프레임으로 변환
-
여기서 전달 인자 (xy = TRUE)는 위도와 경도 정보로 반환 옵션
-
dfData = raster::as.data.frame(raData, xy = TRUE)
colnames(dfData) = c("nLon", "nLat", "nVal")
dplyr::tbl_df(dfData)
-
Data Frame을 이용한 L1 전처리
-
위도 변수 (nLon)가 0~360을 -180~180으로 변환
-
# L1 Processing Using Data Frame
dfDataL1 = dfData %>%
dplyr::mutate(nLon180 = metR::ConvertLongitude(nLon, from = 360))
summary(dfDataL1)
-
가시화
-
가시화를 위한 초기 설정
- ggplot2를 이용한 가시화
-
# Set Value for Visualization
font = "Palatino Linotype"
mapData = spData::world
cbOcean = oce::oceColors9A(120)
# Visualization Using ggplot2
ggplot() +
theme_bw() +
geom_tile(data = dfDataL1, aes(x = nLon180, y = nLat, fill = nVal)) +
metR::geom_text_contour(data = dfDataL1, aes(x = nLon180, y = nLat, z = nVal), stroke = 0.2, check_overlap = TRUE, rotate = TRUE, na.rm = TRUE) +
metR::geom_contour2(data = dfDataL1, aes(x = nLon180, y = nLat, z = nVal), color = "black", alpha = 0.3) +
scale_fill_gradientn(colours = cbOcean, limits=c(-5, 35), breaks = seq(-5, 35, 10), na.value = cbOcean[length(cbOcean)]) +
geom_sf(data = mapData, fill = "grey100", col = "black") +
metR::scale_x_longitude(expand = c(0, 0), breaks = seq(-180, 180, 60), limits = c(-180, 180)) +
metR::scale_y_latitude(expand = c(0, 0), breaks = seq(-90, 90, 30), limits = c(-90, 90)) +
labs(
x = ""
, y = ""
, fill = "Sea Surface Temperature [℃]"
, colour = ""
, title = "NOAA Optimum Interpolation (OI) SST V2"
, subtitle = "Period : December 31, 1989"
, caption = "Source : NCEP Climate Modeling Branch"
) +
theme(
plot.title = element_text(face = "bold", size = 18, color = "black")
, axis.title.x = element_text(face = "bold", size = 18, colour = "black")
, axis.title.y = element_text(face = "bold", size =18, colour = "black", angle=90)
, axis.text.x = element_text(face = "bold", size = 18, colour = "black")
, axis.text.y = element_text(face = "bold", size = 18, colour = "black")
, legend.title = element_text(face = "bold", size = 14, colour = "white")
, legend.position = c(0, 1)
, legend.justification = c(0, 0.96)
, legend.key = element_blank()
, legend.text = element_text(size = 14, face = "bold", colour = "white")
, legend.background = element_blank()
, text=element_text(family = font)
, plot.margin = unit(c(0, 8, 0, 0), "mm")
) +
ggsave(filename = paste0("FIG2/Sea_Surface_Temperature.png"), width = 12, height = 8, dpi = 600)
[전체]
참고 문헌
[논문]
- 없음
[보고서]
- 없음
[URL]
- 없음
문의사항
[기상학/프로그래밍 언어]
- sangho.lee.1990@gmail.com
[해양학/천문학/빅데이터]
- saimang0804@gmail.com
'프로그래밍 언어 > R' 카테고리의 다른 글
[R] "RNetCDF" 패키지 및 NetCDF 형식인 NOAA 최적 내삽 자료를 이용하여 데이터 프레임 (Data Frame)으로 변환 처리 및 가시화 (3) (0) | 2020.03.08 |
---|---|
[R] "ncdf4" 패키지 및 NetCDF 형식인 NOAA 최적 내삽 자료를 이용하여 데이터 프레임 (Data Frame)으로 변환 처리 및 가시화 (2) (0) | 2020.03.08 |
[R] sf 패키지를 이용한 지도 투영법 소개 및 가시화 (0) | 2020.03.06 |
[R] 시/공간 자료 처리 및 분석 (Handling and Analyzing Spatio-Temporal Data) 패키지 소개 (0) | 2020.03.05 |
[R] 상자그림을 다채롭게 보여주는 "lvplot" 패키지 (0) | 2020.03.03 |
최근댓글