[R] 기상 관측소 정보를 이용하여 태양 위치 시간 (일출/일몰/아침 골든/남중/저녁 골든/일몰/항해 박명/천문 박명/밤/아침 박명) 계산

 정보

  • 업무명     : 기상 관측소 정보를 이용하여 태양 위치 시간 (일출/일몰/아침 골든/남중/저녁 골든/일몰/항해 박명/천문 박명/밤/아침 박명) 계산

  • 작성자     : 이상호

  • 작성일     : 2020-01-09

  • 설   명      :

  • 수정이력 :

 

 내용

[개요]

  • 안녕하세요? 기상 연구 및 웹 개발을 담당하고 있는 해솔입니다.

  • 인공위성 알고리즘 개발을 위해서 태양 위치 시간이 요구됩니다. 이러한 경우에 사용할 수 있는 태양과 달의 위치에 대한 계산을 도와주는 R 라이브러리 "suncale"를 소개하고자 합니다.

 

[특징]

  • 인공위성 알고리즘 개발하기 위해서 태양 위치 시간이 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 소프트웨어

 

[기능]

  • 직달 일사량을 이용하여 일조량 산출 및 비교 분석

 

[활용 자료]

  • 자료명 : 기상 관측소

  • 자료 종류 : 관측소 번호, 위도, 경도, 관측소명

  • 확장자 : dat

  • 기간 : 없음

  • 자료 해상도 : 없음

  • 제공처 : 기상개방포털

 

[자료 처리 방안 및 활용 분석 기법]

  • 없음

 

[사용법]

  • 입력 자료를 동일 디렉터리 위치

  • 소스 코드를 실행 (Rscript Calculate_Sun_Position_Time_Using_Weather_Station_Information.R)

  • 계산 결과를 확인

 

[사용 OS]

  • Windows 10

 

[사용 언어]

  • R v3.6.2

  • R Studio v1.2.5033

 

 소스 코드

[명세]

  • 전역 설정

    • 최대 10 자리 설정

    • 메모리 해제

# Set Option
options(digits = 10)
memory.limit(size = 9999999999999)

 

  • 라이브러리 읽기

# Library Load
library(data.table)
library(tidyverse)
library(lubridate)
library(suncalc)
library(DT)

 

  • 파일 읽기

# File Read
dfStation = fread("INPUT/Station_Information.dat", sep = "\t", header = FALSE, skip = 1)
colnames(dfStation) = c("station", "lon", "lat", "stationName") 

dplyr::tbl_df(dfStation)

 

etc-image-0

 

  • Data Frame 설정

    • 날짜 선정

# Set Data Frame
dfData = dfStation %>%
   dplyr::mutate(date = lubridate::ymd("2020-01-09"))

dplyr::tbl_df(dfData) 

 

blob

 

  • Data Frame를 통해 L1 전처리

    • getSunlightTimes 속성을 통해 태양 위치 시간 계산 (아래 속성 참조)

    • 기상 관측소의 위도 및 경도를 기준으로 좌측 조인

 

속성

설명

sunrise

일출 시간 (태양의 머리가 수평선에서 나타나는 시간)

sunriseEnd

일출 시간 (태양의 모든 수평선에서 나타나는 시간)

goldenHourEnd

아침 골든 종료 시간

solarNoon

남중 시각 (태양의 고도가 가장 높은 위치에 있는 시간)

goldenHour

저녁 골든 시작 시간

sunsetStart

일몰 시간 (태양이 수평선에 나타나는 시간)

sunset

일몰 시간 (태양의 모든 수평선에 가라 앉는 시간) / 시민 박명 시작 시간 (태양이 숨어서 밖에서 활동할 수있는 시간)

dusk

항해 박명 시작 시간

nauticalDusk

천문 박명 시작 시간

night

밤의 시작 시간

nadir

밤의 가장 어두운 시간의 시작 시간

nightEnd

밤의 종료 시간

nauticalDawn

아침의 항해 박명 시작 시간

dawn

아침의 항해 박명 종료 시간

 

# L1 Processing Using Data Frame
dfDataL1 = getSunlightTimes(
   data = dfData
   , keep = c("night", "nadir", "nightEnd", "nauticalDawn", "dawn", "sunrise", "sunriseEnd", "goldenHourEnd", "solarNoon", "goldenHour", "sunsetStart", "sunset", "dusk", "nauticalDusk")
   ,  tz = "Asia/Seoul"
   ) %>% 
   dplyr::left_join(dfStation, by=c("lat" = "lat", "lon" = "lon"))

datatable(dfDataL1)
dfDataL1

 

etc-image-2

 

etc-image-3

 

  • L1 자료를 통해 출력

# Write Using L1 Data Frame
data.table::fwrite(
   dfDataL1
   , sep = ","
   , file = "OUTPUT/dfTimeDataL1.csv"
   , append = FALSE
   , row.names = FALSE
   , col.names = TRUE
   , dateTimeAs = "write.csv"
   , na = NA
)

 

etc-image-4

 

[전체]

#===============================================================================================
# Routine : Main R program
#
# Purpose : Calculate_Sun_Position_Time_Using_Weather_Station_Information
#
# Author : MS. Sang-Ho Lee
#
# Revisions: V1.0 January 09, 2020 First release (MS. Sang-Ho Lee)
#===============================================================================================
# Set Option
options(digits = 10)
memory.limit(size = 9999999999999)
# Library Load
library(data.table)
library(tidyverse)
library(lubridate)
library(suncalc)
library(DT)
# File Read
dfStation = fread("INPUT/Station_Information.dat", sep = "\t", header = FALSE, skip = 1)
colnames(dfStation) = c("station", "lon", "lat", "stationName")
dplyr::tbl_df(dfStation)
# Set Data Frame
dfData = dfStation %>%
dplyr::mutate(date = lubridate::ymd("2020-01-09"))
dplyr::tbl_df(dfData)
# L1 Processing Using Data Frame
dfDataL1 = getSunlightTimes(
data = dfData
, keep = c("night", "nadir", "nightEnd", "nauticalDawn", "dawn", "sunrise", "sunriseEnd", "goldenHourEnd", "solarNoon", "goldenHour", "sunsetStart", "sunset", "dusk", "nauticalDusk")
, tz = "Asia/Seoul"
) %>%
dplyr::left_join(dfStation, by=c("lat" = "lat", "lon" = "lon"))
datatable(dfDataL1)
dplyr::glimpse(dfDataL1)
# Write Using L1 Data Frame
data.table::fwrite(
dfDataL1
, sep = ","
, file = "OUTPUT/dfTimeDataL1.csv"
, append = FALSE
, row.names = FALSE
, col.names = TRUE
, dateTimeAs = "write.csv"
, na = NA
)

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

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

  • sangho.lee.1990@gmail.com

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

  • saimang0804@gmail.com