반응형

     정보

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

     

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기