From 555fad1c4723be27b88dc7d345e00ddce8b975f3 Mon Sep 17 00:00:00 2001 From: Thomas Rushby <t.w.rushby@soton.ac.uk> Date: Mon, 21 Sep 2020 14:05:57 +0100 Subject: [PATCH] open weather API implementation (WIP) --- howTo/APIkeys/owmAPIkey.R | 2 ++ howTo/apiOpenWeather.R | 57 +++++++++++++++++++++++++++++++++ howTo/weatherAPI/Icons/10d.png | Bin 0 -> 2584 bytes 3 files changed, 59 insertions(+) create mode 100644 howTo/APIkeys/owmAPIkey.R create mode 100644 howTo/apiOpenWeather.R create mode 100644 howTo/weatherAPI/Icons/10d.png diff --git a/howTo/APIkeys/owmAPIkey.R b/howTo/APIkeys/owmAPIkey.R new file mode 100644 index 0000000..4b59fce --- /dev/null +++ b/howTo/APIkeys/owmAPIkey.R @@ -0,0 +1,2 @@ +# OpenWeatherMapAPI key +owmAPIkey <- "bda9e4fdac62847c129d8ed3227b7325" \ No newline at end of file diff --git a/howTo/apiOpenWeather.R b/howTo/apiOpenWeather.R new file mode 100644 index 0000000..a4801f8 --- /dev/null +++ b/howTo/apiOpenWeather.R @@ -0,0 +1,57 @@ +# Open Weather API + +library(woRkflow) # load workflow package +woRkflow::setup() # load env.R set up the default paths etc + +reqLibs <- c("httr", + "jsonlite", + "knitr", + "tidyr", + "data.table", # data munching + "here", # here + "lubridate", # dates and times + "ggplot2", # plots + "bookdown" # for making reports (should also install knittr etc) +) +# load them +woRkflow::loadLibraries(reqLibs) + +# Load API key from external file - so can restrict access if required +source(paste0(here::here(),'/howTo/APIkeys/owmAPIkey.R')) # OpenWeatherMapAPI key + +# API request ---- + +# Get hourly weather forecast from Open Weather (use '&units=metric' for celsius) +getURL <- paste0("https://api.openweathermap.org/data/2.5/onecall?lat=50.937337&lon=-1.404147&units=metric&exclude=minutely,daily&appid=",owmAPIkey) +response <- httr::GET(getURL) + +openWeatherData <- fromJSON(rawToChar(response$content)) + +str(openWeatherData) + +# forecast - current +currentWeather <- openWeatherData$current # into own data.frame + +# forecast - 48 hours ahead +hourlyWeather <- openWeatherData$hourly # into own data.frame + +# process data ---- + +procTime <- function(x){ + as.POSIXct(x, origin="1970-01-01") # convert unix time +} + +currentWeather[1:3] <- lapply(currentWeather[1:3],procTime) +hourlyWeather[,1] <- lapply(hourlyWeather[1],procTime) +hourlyWeather <- unnest(hourlyWeather, cols = weather) + +# Outputs and util ---- +# What to do with the data & presentation info +# ..$pop = probablility of precipitation + +# Get icons - URLs +icon <- "10d" +iconURL <- paste0("http://openweathermap.org/img/wn/",icon,"@2x.png") +download.file(iconURL,paste0(here::here(),'/howTo/weatherAPI/icons/',icon,'.png'), mode = 'wb') + +message(paste0("The weather now is: ",currentWeather$weather$main, " and the temperature is ",round(currentWeather$temp)," degrees.")) diff --git a/howTo/weatherAPI/Icons/10d.png b/howTo/weatherAPI/Icons/10d.png new file mode 100644 index 0000000000000000000000000000000000000000..62304fded6be1c5cea4a6a353cf336a98bec4c3f GIT binary patch literal 2584 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 ZCo-yUU7_~tDFXuogQu&X%Q~loCIGjA0fPVl literal 0 HcmV?d00001 -- GitLab