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