정보
-
업무명 : R을 이용하여 국가기상위성센터의 위성영상 자료 다운로드 하기
-
작성자 : 해솔
-
작성일 : 2021-02-06
-
설 명 :
-
수정이력 :
내용
[개요]
-
R은 통계 분석 및 시각화 등의 기능을 갖춘 프로그래밍 언어 내지 통계 분석 환경입니다.
-
통계 분석 기능으로 통계 검정, 선형 회귀 분석, 시계열 데이터 분석, 클러스터링 등을 지원하고 있습니다.
-
또한 최신 논문에서 발표된 같은 새로운 기술도 R로 구현되는 경우가 많습니다.
-
특히 시각화 기능으로 히스토그램, 막대 그래프, 선 그래프, 산포도, 나무 모양 그림이나 히트맵 등 기본적인 그래프가 기본으로 지원하고 있습니다.
-
또한 ggplot2 등의 패키지를 사용하여 더 높은 수준의 그림을 가시화할 수 있습니다.
[특징]
-
국가기상위성센터의 위성자료 (전구/동아시아/한반도) 영역 다운로드
-
특정 날짜의 자료를 다운로드 할 수 있음
-
다운로드 받는 이미지의 종류는 각각 10.5um 적외영상 / day-night 합성영상임
-
따라서 결과적으로 총 6개 종류의 영상 (적외/합성 - 전구/동아시아/한반도)을 다운로드 할 수 있음
[기능]
-
위성자료 이미지 다운로드
[활용 자료]
-
없음
[자료 처리 방안 및 활용 분석 기법]
-
없음
[사용법]
-
소스 코드 예시 참조
[사용 OS]
-
Windows 10
[사용 언어]
-
R v4.0.3
소스 코드
[rule 파일 생성]
-
모든 이미지에는 그에 맞는 URL 패턴이 있으므로 템플릿에 해당하는 파일을 생성 후 미리 csv 파일을 만들어 줌
-
해당 CSV 파일을 R 프로그램을 통해 읽은 후 템플릿을 읽어 적절한 형태로 URL을 변형한 후 이미지를 다운로드 하는 방식임
-
RULE 파일의 예시는 아래의 이미지와 같음
[소스코드]
-
라이브러리 로드 및 rule 파일 읽기
library(purrr)
library(magick)
library(dplyr)
library(llubridate)
library(data.table)
library(stringr)
library(animation)
library(ndtv)
library(parallel)
# READ RULE #
rule_data = read.csv("./rule.csv")
head(rule_data)
-
다운로드 받을 범위의 시간 지정 (KST 기준 지정)
-
자료를 다운받을 시작시간 - 끝 시간을 지정해줌 (KST 기준)
-
지정 이후 이를 KST로 변화시킨 후 1분 간격으로 시간정보를 생성함
-
# SET DATE #
StartDate = "2021-01-31 00:00:00" # set start time (character type)
EndDate = "2021-01-31 23:59:00" # set end time (character type)
# make target date and make format (yyyy-mm-dd hh:mm:ss -> yyyymmddhh)
date_kst = seq(as.POSIXct(StartDate,tz = "./asia/seoul"),as.POSIXct(EndDate,tz = "./asia/seoul"),by="min")
date_kst_to_utc = format(date_kst, tz="UTC",format = "%Y%m%d%H%M")
# day
date_kst_to_utc_day = unique(format(date_kst,format = "%Y%m%d"))[1]
-
위성자료 다운로드
-
본문에서는 6종류의 모든 영상 자료를 다운 받는 것으로 지정 하였으며 디렉토리 생성 명령어는 윈도우를 기준으로 작성됨
-
즉 loop문으로부터 rule 파일을 모두 참조 한다는 것
-
만약 특정 계열의 위성영상만 다운 받고자 하는 경우 rule 파일의 행을 삭제 하거나, loop 문을 컨트롤 해 주는 것으로 조정 가능하다
-
for (i in 1:dim(rule_data)[1]) {
TYPE = rule_data$TYPE[i]
TYPE2 = rule_data$TYPE2[i]
AREA = rule_data$AREA[i]
OUT_PATH = paste0("./OUT/",TYPE,"/",TYPE2,"/",AREA,"/",date_kst_to_utc_day,"/")
# 디렉토리 생성
dir.create(OUT_PATH,recursive=TRUE)
for (times in date_kst_to_utc) {
YYYYMM = str_sub(times,1,6)
DD = str_sub(times,7,8)
HH = str_sub(times,9,10)
YYYYMMDDHHMN = str_sub(times,1,12)
#### URL 치환 ####
RESULT_URL = str_replace_all(rule_data$URL_PATTERN[i],pattern = "\\{TYPE\\}",replacement = TYPE)
RESULT_URL = str_replace_all(RESULT_URL,pattern = "\\{AREA\\}",replacement = AREA)
RESULT_URL = str_replace_all(RESULT_URL,pattern = "\\{YYYYMM\\}",replacement = YYYYMM)
RESULT_URL = str_replace_all(RESULT_URL,pattern = "\\{DD\\}",replacement = DD)
RESULT_URL = str_replace_all(RESULT_URL,pattern = "\\{HH\\}",replacement = HH)
RESULT_URL = str_replace_all(RESULT_URL,pattern = "\\{YYYYMMDDHHMN\\}",replacement = YYYYMMDDHHMN)
#### URL 치환 ####
OUT_PATH_FILE = paste0(OUT_PATH,YYYYMMDDHHMN,".png")
download_list_part = data.frame(url = RESULT_URL,dfile = OUT_PATH_FILE)
download_list = rbind(download_list,download_list_part)
# 파일 다운로드
download.file(url = RESULT_URL, destfile = OUT_PATH_FILE, mode="wb", quiet = TRUE)
## 용량 체크를 통해 그림이 올바로 다운로드 되었는지 확인
sizeis = file.info(OUT_PATH_FILE)$size
# 파일 사이즈가 작은 경우 제거
if(sizeis < 5000) {
file.remove(OUT_PATH_FILE)
} else {
next
}
}
}
[위성자료 다운로드 세부 설명]
-
i 루프 (첫번째 반복문) 수행 및 rule 파일로부터 정보 불러오기
-
첫번째 반복문의 경우 처음에 읽었던 rule 파일의 행 수 만큼 반복되는 명령어이다.
-
해당 반복문으로부터 rule 파일 내에 들어있는 TYPE (위성 자료의 레벨) / TYPE2 (위성 자료의 종류) / AREA (위성 자료의 영역) 을 불러오게 됨
-
...
for (i in 1:dim(rule_data)[1]) {
TYPE = rule_data$TYPE[i]
TYPE2 = rule_data$TYPE2[i]
AREA = rule_data$AREA[i]
cat(paste0("TYPE : ",TYPE," \n","TYPE2 : ",TYPE2, " \n","AREA : ",AREA )) # 결과 출력
...
-
출력할 path 지정 및 path를 통한 디렉토리 생성
-
다음으로 상기 TYPE(1,2) / AREA 등의 정보 및 수집되는 날짜 정보를 이용하여 디렉토리를 생성함
-
생성되는 디렉토리의 최종 경로는 날짜(yyyymmdd) 형태로 생성되며, 만약 여러 날짜에 걸쳐서 이미지를 다운로드 하는 경우 날짜의 리스트 중 첫번째 정렬되는 날짜가 생성되는 디렉토리의 이름이 됨
-
OUT_PATH = paste0("./OUT/",TYPE,"/",TYPE2,"/",AREA,"/",date_kst_to_utc_day,"/")
print(OUT_PATH) # 출력
# 디렉토리 생성 명령
dir.create(OUT_PATH,recursive=TRUE)
-
두번째 루프 (time) 실행 및 이미지 주소에 해당하는 URL 생성
-
time 에 대한 두번째 루프 실행
-
time의 경우 시작 시각 - 종료 시각까지 1분 간격으로 만들어지게 됨
-
또한 그와 동시에 이미지 주소에 해당하는 template 로부터 실제 이미지 주소를 만들어 줌
-
이렇게 생성된 이미지 주소를 download.file 명령어를 통해 다운로드 받음
-
...
for (times in date_kst_to_utc) {
YYYYMM = str_sub(times,1,6)
DD = str_sub(times,7,8)
HH = str_sub(times,9,10)
YYYYMMDDHHMN = str_sub(times,1,12)
#### URL 치환 ####
RESULT_URL = str_replace_all(rule_data$URL_PATTERN[i],pattern = "\\{TYPE\\}",replacement = TYPE)
RESULT_URL = str_replace_all(RESULT_URL,pattern = "\\{AREA\\}",replacement = AREA)
RESULT_URL = str_replace_all(RESULT_URL,pattern = "\\{YYYYMM\\}",replacement = YYYYMM)
RESULT_URL = str_replace_all(RESULT_URL,pattern = "\\{DD\\}",replacement = DD)
RESULT_URL = str_replace_all(RESULT_URL,pattern = "\\{HH\\}",replacement = HH)
RESULT_URL = str_replace_all(RESULT_URL,pattern = "\\{YYYYMMDDHHMN\\}",replacement = YYYYMMDDHHMN)
#### URL 치환 ####
OUT_PATH_FILE = paste0(OUT_PATH,YYYYMMDDHHMN,".png")
print(paste0("OUT_PATH_FILE : ",OUT_PATH_FILE))
print(paste0("RESULT_URL : ",RESULT_URL))
# 파일 다운로드
download.file(url = RESULT_URL, destfile = OUT_PATH_FILE, mode="wb", quiet = TRUE)
...
-
다운로드 받은 파일의 용량 채크 및 삭제여부 결정
-
위와 같이 코드를 수행하는 경우 time에 대한 loop 가 1분 간격으로 수행 되기 때문에 결과적으로 실제 위성 영상의 자료 생성 주기보다 더 많은 파일을 다운로드 받게 되며 이는 의미가 없는 파일이다.
-
여기서 정해진 시간 이외의 이미지 주소 자료가 다운로드 되는 경우 에러 페이지로 연결되며, 이는 png 타입이 아닌 html 문서 그 자체를 다운로드 받게 된다. (하단의 이미지 참조)
-
-
해당 에러 페이지의 경우 실제 용량이 1000byte 가 조금 넘는 수준이다. 반면 위성 영상의 경우 기본적으로 1Mb 를 넘어가는데 이를 이용하여 본문에서는 다운받은 파일의 용량을 체크하여 만약 5000byte 가 넘어가는 경우 해당 파일을 다시 삭제함으로서 결과적으로 위성 영상에 해당하는 이미지만 남도록 조정하였다.
...
# 파일 다운로드
download.file(url = RESULT_URL, destfile = OUT_PATH_FILE, mode="wb", quiet = TRUE)
## 용량 체크를 통해 그림이 올바로 다운로드 되었는지 확인
sizeis = file.info(OUT_PATH_FILE)$size
# 파일 사이즈가 작은 경우 제거
if(sizeis < 5000) {
file.remove(OUT_PATH_FILE)
} else {
next
}
}
}
...
[프로그램 실행 결과 예시]
참고 문헌
[논문]
- 없음
[보고서]
- 없음
[URL]
- 없음
문의사항
[기상학/프로그래밍 언어]
- sangho.lee.1990@gmail.com
[해양학/천문학/빅데이터]
- saimang0804@gmail.com
'프로그래밍 언어 > R' 카테고리의 다른 글
[R] RSelenium을 이용한 네이버 쇼핑몰 댓글 스크래핑 (0) | 2021.05.18 |
---|---|
[R] 2019년 주요 도시의 월별 오존 농도 데이터를 이용하여 계절별 오존 농도 차이 여부 검정 (0) | 2021.02.26 |
[R] R 및 flourish studio 를 이용하여 국가별 탄소 배출량 레이싱 차트 만들기 (0) | 2021.02.01 |
[R] 격자정보 및 U,V,풍속 정보를 이용하여 동아시아 지도에 매핑하기 (0) | 2021.01.30 |
[R] WRF 모델자료 후처리 시퀀스1 - nc 파일을 풀어 txt 형태로 떨어뜨리기 (0) | 2021.01.27 |
최근댓글