[R] 동아시아 대기질 이미지 영상을 통해 크롤링 및 애니메이션 구현

 정보

  • 업무명     : 소프트웨어 개발

  • 작성자     : 박진만

  • 작성일     : 2019-12-08

  • 설   명      :  특정 URL 의 이미지를 다운받아 gif 파일을 생성하는 프로그램

  • 수정이력 :

 

 내용

[특징]

  • 일본 미세먼지 예보 사이트 ( http://venus.nies.go.jp)에서 제공하는 초미세먼지 예측 이미지 중 특정 날짜를 선택하여 자동으로 JPG 이미지를 다운로드 한 후 GIF 애니메이션 파일을 생성하는 프로그램.

 

大気汚染予測システム VENUS — 国立環境研究所

<お知らせ>サーバーメンテナンスのため、12/12(木)13:30~16:00 まで本サイトの運用を停止いたします。 このウェブサイトは、光化学オキシダント関連情報提供ホームページ(気象庁・環境省)に基づき、研究成果の発信およびシミュレーションの精度向上のために問題点の指摘や研究上のフィードバックを得る目的で試験的に情報提供しております。 業務として行っているものではありませんので、このウェブサイトの情報を参考にした事象に関して一切の責任を負いません。

venus.nies.go.jp

 

[기능]

  • 타겟이 되는 URL 의 이미지를 다운로드

  • 다운로드한 이미지를 로컬에 저장

  • 저장된 이미지를 종합하여 GIF 애니메이션 파일 생성

 

[프로그램 종류]

  •  데이터 마이닝 프로그램

  • 이미지 처리 프로그램

 

[사용법]

  • 원하는 날짜 선택하는 방법

    • 프로그램 상단의 주석 ( # SET DATE # ) 아래의 'StartDate' 및 EndDate 변수를 원하는 날짜로 수정.

  • gif 이미지 프레임 수 변경 및 루프 변경 방법

    • 프로그램 하단 44째 라인의 image_animate 함수에서 fps(초당 프레임 수) 와 loop (반복횟수, 0=무한반복) 옵션 변경

  • 프로그램 실행 방법 

    • purrr 및 magick 라이브러리 설치 후 아래의 코드 실행

 

[명세]

  •  라이브러리 로드

library(purrr)
library(magick) 

 

  • 다운로드 받을 날짜 (시작 - 끝) 입력

# SET DATE #
StartDate <- "2019-12-01 00:00" # set start time (character type)
EndDate   <- "2019-12-01 23:00" # set end time (character type)

 

  • 시작 - 끝 사이에 시간 간격으로 만든 후 각 설정한 형태에 따라 날짜 포멧 추출

  • vTime은 기존의 yyyy-mm-dd HH:MM:SS 날짜 포멧을 yyyymmddhh 로 만들어주기 위한 작업.

  • vTime 을 기반으로 원하는 부분 (ex : yyyy, mm, yyyymmdd 등) 추출.

# make target date and make format (yyyy-mm-dd hh:mm:ss -> yyyymmddhh)
date <- seq(as.POSIXct(StartDate),as.POSIXct(EndDate),by="hour")

vTime = strptime(date,"%Y-%m-%d %H:%M:%S")

TargetDate <- format(vTime,"%Y%m%d%H")

YYYY <- format(vTime,"%Y") # make YYYY in date Variable
MM <- format(vTime,"%m")  # make MM in date Variable
YYYYMMDD <- format(vTime,"%Y%m%d")
# make target date and make format(yyyy-mm-dd hh:mm:ss -> yyyymmddhh)

 

  • 타겟이 되는 URL 및 저장 디렉토리 생성.

# make Target URL 
URLPath <- paste0("http://venus.nies.go.jp/datadepot/gmtmap/JPN/PM25/",YYYY,"/",MM,"/") #Path
TargetFile <- paste0("JPN_PM25_",TargetDate,".jpg") #File
TargetURL <- paste0(URLPath,TargetFile) # Path + File
# make Target URL 

# make dir #
SavaDirPath <- paste0("./",unique(YYYYMMDD))
dir.create(SavaDirPath)
# make dir #

 

  • loop문을 이용하여 이미지 다운로드.

  • tryCatch 문을 통해 해당 위치에 파일이 없는 경우 예외처리.

# download jpg file in target URL #
for (i in 1:length(TargetURL)) {
  
  #url = URL, destfile = savedirpath, mode = binary option
  tryCatch(
    download.file(url = TargetURL[i], destfile = paste0(SavaDirPath,"/",TargetFile[i]), mode="wb", quiet = FALSE)
    , error = function(e) print(paste(TargetURL[i], 'did not work out'))
    )    

  
}
# download jpg file in target URL #
  • 애니메이션 파일 생성

    • 위 : 다운받아진 LOCAL 파일을 이용하여 GIF 생성 (이미지와 애니메이션 파일 모두 확보 가능)

    • 아래 : 직접 해당 URL에 접근하여 GIF 생성 (애니메이션 파일만 확보 가능)

## make gif file (in downloaded local file)##
list.files(path = paste0(SavaDirPath,"/"), pattern = "*jpg", full.names = T) %>% 
  map(image_read) %>% # reads each path file
  image_join() %>% # joins image
  image_animate(fps=2,loop = 0) %>% # animates, can opt for number of loops (0 = infinite loop)
  image_write(paste0(SavaDirPath,"/OUT.gif")) # write to target dir
## make gif file ##

## make gif file (direct url) ##
TargetURL %>% 
  map(image_read) %>% # reads each path file
  image_join() %>% # joins image
  image_animate(fps=2,loop = 0) %>% # animates, can opt for number of loops (0 = infinite loop)
  image_write(paste0(SavaDirPath,"/OUT.gif")) # write to target dir
## make gif file ##

 

[사용 OS]

  • Windows10

 

[사용 언어]

  • R

 

 소스 코드

 

 

 결과

[가시화]

그림. 프로그램 수행 후 다운받아진 이미지 및 gif 파일.
그림. 결과 gif 이미지 예시.

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

[기상학/프로그래밍 언어]

  • sangho.lee.1990@gmail.com

[해양학/천문학/빅데이터]

  • saimang0804@gmail.com