프로그래밍 언어/R

[R] R을 이용하여 국가기상위성센터의 위성영상 자료 다운로드 하기

abc가나다 2021. 2. 6. 03:12

 정보

  • 업무명     : 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 파일

 

[소스코드]

  • 라이브러리 로드 및 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