From 83507e3b23706022d24206fb1e4d99d5cefe2dec Mon Sep 17 00:00:00 2001 From: Bartosz Czernecki Date: Tue, 18 Jun 2024 10:42:16 +0200 Subject: [PATCH] IMGW telemetry dataset (#86) * issue #80 * bug fixes for precip * fix ogimet break between years * update ogimet_daily * fix ogimet_daily * test pkgdown * new pkgdown * pkgdown pipeline * turn on tests for metadata * missing ogimet tests * ogimet fix potential warning * updates roxygen * adding HALA GASIENICOWA IMGW metadata * meteo_imgw_datastore * draft finished * meteo imgw telemetry * fix: imgw telemetry * imgw telemetry fix * telemetry fix for empty files * string as factors for old R version * assertions for telemetry * add globals to avoid NOTEs * updates docs (#87) * IMGW column encoding and telemetry support * fix: HTML5 * fix: HTML5 * fix: HTML5 * climate 1.2.0 * fix: avoid warnings * fix: run test only if network available * replace R 3.6 with 4.0 * fix: #88 #85 * fix: rename telemetry stations * fix: #93 * imgw station names extended * add github actions for rhub * doc fixes * add stations_meteo_imgw_telemetry gently break * add telemetry tests * imgw telemetry tests --------- Co-authored-by: Jakub Nowosad Co-authored-by: Jakub Nowosad --- .Rbuildignore | 1 + .github/workflows/R-CMD-check.yaml | 2 +- .gitignore | 1 + DESCRIPTION | 19 +- NAMESPACE | 6 + NEWS.md | 7 + R/clean_metadata_meteo.R | 16 +- R/globals.R | 2 + R/imgw_hydro_abbrev.R | 9 +- R/imgw_hydro_stations.R | 8 +- R/imgw_meteo_abbrev.R | 8 +- R/imgw_meteo_stations.R | 10 +- R/meteo_imgw_daily.R | 34 ++-- R/meteo_imgw_datastore.R | 164 ++++++++++++++++++ R/meteo_imgw_hourly.R | 27 ++- R/meteo_imgw_monthly.R | 14 +- R/meteo_metadata_imgw.R | 5 +- R/meteo_shortening_imgw.R | 7 +- R/nearest_stations_ogimet.R | 2 +- R/stations_meteo_imgw_telemetry.R | 55 ++++++ R/stations_ogimet.R | 112 ++++++------ README.md | 2 +- data/imgw_meteo_stations.rda | Bin 35626 -> 54115 bytes inst/CITATION | 6 +- man/climate-package.Rd | 2 +- man/imgw_hydro_abbrev.Rd | 9 +- man/imgw_hydro_stations.Rd | 8 +- man/imgw_meteo_abbrev.Rd | 8 +- man/imgw_meteo_stations.Rd | 10 +- man/meteo_imgw_daily.Rd | 3 +- man/meteo_imgw_datastore.Rd | 65 +++++++ man/stations_meteo_imgw_telemetry.Rd | 20 +++ tests/testthat/test-meteo_imgw.R | 42 +++-- tests/testthat/test-meteo_imgw_daily.R | 43 +++-- tests/testthat/test-meteo_imgw_datastore.R | 19 ++ tests/testthat/test-meteo_metadata_imgw.R | 49 +++--- tests/testthat/test-meteo_ogimet.R | 36 ++-- tests/testthat/test-nearest_stations_noaa.R | 63 ++++--- .../test-stations_meteo_imgw_telemetry.R | 16 ++ vignettes/getstarted.Rmd | 2 +- 40 files changed, 654 insertions(+), 258 deletions(-) create mode 100644 R/globals.R create mode 100644 R/meteo_imgw_datastore.R create mode 100644 R/stations_meteo_imgw_telemetry.R create mode 100644 man/meteo_imgw_datastore.Rd create mode 100644 man/stations_meteo_imgw_telemetry.Rd create mode 100644 tests/testthat/test-meteo_imgw_datastore.R create mode 100644 tests/testthat/test-stations_meteo_imgw_telemetry.R diff --git a/.Rbuildignore b/.Rbuildignore index ba4e423a..0738ebe4 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -15,4 +15,5 @@ vignettes/articles/usecase.Rmd ^pkgdown$ ^.codecov.yml$ +^tests$ \ No newline at end of file diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index c6efaa83..4ad315b0 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -34,7 +34,7 @@ jobs: - {os: windows-latest, r: 'release'} - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} - {os: ubuntu-20.04, r: 'release'} - - {os: ubuntu-20.04, r: '3.6'} + - {os: ubuntu-20.04, r: '4.0'} env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true RSPM: ${{ matrix.config.rspm }} diff --git a/.gitignore b/.gitignore index 449f9e61..bdb97424 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ covr_report.html lib docs pkgdown +.Renviron \ No newline at end of file diff --git a/DESCRIPTION b/DESCRIPTION index ced1fa06..6f73acf4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: climate Title: Interface to Download Meteorological (and Hydrological) Datasets -Version: 1.1.2 +Version: 1.2.0 Authors@R: c(person(given = "Bartosz", family = "Czernecki", role = c("aut", "cre"), @@ -20,28 +20,29 @@ Authors@R: c(person(given = "Bartosz", Description: Automatize downloading of meteorological and hydrological data from publicly available repositories: OGIMET (), University of Wyoming - atmospheric vertical profiling data (), - Polish Institute of Meterology and Water Management - National Research Institute (), + Polish Institute of Meteorology and Water Management - National Research Institute (), and National Oceanic & Atmospheric Administration (NOAA). This package also allows for searching geographical coordinates for each observation and calculate distances to the nearest stations. License: MIT + file LICENSE Encoding: UTF-8 LazyData: true Roxygen: list(markdown = TRUE) -RoxygenNote: 7.2.3 +RoxygenNote: 7.3.0 Depends: - R (>= 3.5.0) + R (>= 4.0.0) Imports: XML, httr, curl, - data.table + data.table, + stringi Suggests: - testthat, - knitr, - rmarkdown, dplyr, + knitr, + maps, + testthat, tidyr, - maps + rmarkdown URL: https://github.com/bczernecki/climate BugReports: https://github.com/bczernecki/climate/issues VignetteBuilder: knitr diff --git a/NAMESPACE b/NAMESPACE index 3eb236c4..cc46cf0a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,6 +7,7 @@ export(hydro_imgw_daily) export(hydro_imgw_monthly) export(meteo_imgw) export(meteo_imgw_daily) +export(meteo_imgw_datastore) export(meteo_imgw_hourly) export(meteo_imgw_monthly) export(meteo_noaa_co2) @@ -19,17 +20,22 @@ export(ogimet_daily) export(ogimet_hourly) export(sounding_wyoming) export(spheroid_dist) +export(stations_meteo_imgw_telemetry) export(stations_ogimet) export(test_url) +import(data.table) import(httr) importFrom(XML,readHTMLTable) importFrom(curl,curl_download) importFrom(curl,has_internet) +importFrom(data.table,as.data.table) importFrom(data.table,fread) importFrom(stats,na.omit) importFrom(stats,runif) +importFrom(stringi,stri_trans_general) importFrom(utils,data) importFrom(utils,download.file) +importFrom(utils,globalVariables) importFrom(utils,packageVersion) importFrom(utils,read.csv) importFrom(utils,read.fwf) diff --git a/NEWS.md b/NEWS.md index 274b7d4d..83219cb7 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,10 @@ +# climate 1.2.0 + +* Corrected encoding problems for some of platforms where IMGW-PIB metadata were not parsed correctly +* Added location of IMGW-PIB telemetry stations within `meteo_imgw_telemetry_stations()` +* Minor bug fixes + + # climate 1.1.1 * Fix problems with downloading `precip` dataset from IMGW-PIB repository after recent changes in metadata diff --git a/R/clean_metadata_meteo.R b/R/clean_metadata_meteo.R index 8821d4c4..d721b2ef 100644 --- a/R/clean_metadata_meteo.R +++ b/R/clean_metadata_meteo.R @@ -6,21 +6,27 @@ #' @param interval temporal interval #' @importFrom utils read.fwf #' @importFrom stats na.omit -#' @keywords internal +#' @importFrom stringi stri_trans_general +#' @keywords internal #' clean_metadata_meteo = function(address, rank = "synop", interval = "hourly") { temp = tempfile() test_url(link = address, output = temp) - a = readLines(temp, warn = FALSE) - a = iconv(a, from = "CP1250", to = "ASCII//TRANSLIT") + + # a = readLines(temp, warn = FALSE, encoding = "CP1250") # doesn't work on mac, + # thus: + # a = iconv(a, from = "CP1250", to = "ASCII//TRANSLIT") + a = read.csv(temp, header = FALSE, stringsAsFactors = FALSE, + fileEncoding = "CP1250")$V1 a = gsub(a, pattern = "\\?", replacement = "") + a = stringi::stri_trans_general(a, 'LATIN-ASCII') # additional workarounds for mac os but not only... a = gsub(x = a, pattern = "'", replacement = "") a = gsub(x = a, pattern = "\\^0", replacement = "") - a = data.frame(V1 = a[nchar(a) > 0], stringsAsFactors = FALSE) + a = data.frame(V1 = a[nchar(a) > 3], stringsAsFactors = FALSE) # this one does not work on windows # a = suppressWarnings(na.omit(read.fwf(address, widths = c(1000), # fileEncoding = "CP1250", stringsAsFactors = FALSE))) @@ -44,8 +50,6 @@ clean_metadata_meteo = function(address, rank = "synop", interval = "hourly") { a$V1 = trimws(substr(a$V1, 1, nchar(a$V1) - 3)) a$V1 = gsub(x = a$V1, pattern = "* ", "") - #strsplit(x = a$V1, split = "/") - #a = a[nchar(a$V1)>2,] # remove empty or almost empty rows a = a[!(is.na(a$field1) & is.na(a$field2)), ] # remove info about status colnames(a)[1] = "parameters" return(a) diff --git a/R/globals.R b/R/globals.R new file mode 100644 index 00000000..d79db94e --- /dev/null +++ b/R/globals.R @@ -0,0 +1,2 @@ +#' @importFrom utils globalVariables +utils::globalVariables(c("i.parameter", "param")) diff --git a/R/imgw_hydro_abbrev.R b/R/imgw_hydro_abbrev.R index 6b1ae49a..e3f82d8d 100644 --- a/R/imgw_hydro_abbrev.R +++ b/R/imgw_hydro_abbrev.R @@ -7,11 +7,10 @@ #' fullname, abbr_eng, and fullname_eng #' #' @format The data contains a data.frame with ca. 20 elements described in three ways: -#' \itemize{ -#' \item{fullname} {original column names as downloaded from the repository} -#' \item{abbr_eng} {shorten column names with abbreviations derived from the most -#' popular scheme used for meteorological parameters} -#' \item{fullname_eng} {detailed description of downloaded meteorological variables} +#' \describe{ +#' \item{fullname}{original column names as downloaded from the repository} +#' \item{abbr_eng}{shorten column names with abbreviations derived from the most popular scheme used for meteorological parameters} +#' \item{fullname_eng}{detailed description of downloaded meteorological variables} #' } #' The object is created mostly to be used altogether with the hydro_shortening_imgw() function #' diff --git a/R/imgw_hydro_stations.R b/R/imgw_hydro_stations.R index fe399c40..2c705118 100644 --- a/R/imgw_hydro_stations.R +++ b/R/imgw_hydro_stations.R @@ -5,10 +5,10 @@ #' coordinates, ID numbers, and elevations #' #' @format The data contains a data.frame with 1304 obs. of 3 variables: -#' \itemize{ -#' \item{id} {Station ID} -#' \item{X} {Longitude} -#' \item{Y} {Latitude} +#' \describe{ +#' \item{id}{Station ID} +#' \item{X}{Longitude} +#' \item{Y}{Latitude} #' } #' The object is in the geographic coordinates using WGS84 (EPSG:4326). #' diff --git a/R/imgw_meteo_abbrev.R b/R/imgw_meteo_abbrev.R index 4ca8fed4..72b11da0 100644 --- a/R/imgw_meteo_abbrev.R +++ b/R/imgw_meteo_abbrev.R @@ -7,11 +7,11 @@ #' fullname, abbr_eng, and fullname_eng #' #' @format The data contains a data.frame with ca. 250 elements described in three ways: -#' \itemize{ -#' \item{fullname} {original column names as downloaded from the repository} -#' \item{abbr_eng} {shorten column names with abbreviations derived from the most +#' \describe{ +#' \item{fullname}{original column names as downloaded from the repository} +#' \item{abbr_eng}{shorten column names with abbreviations derived from the most #' popular scheme used for meteorological parameters} -#' \item{fullname_eng} {detailed description of downloaded meteorological variables} +#' \item{fullname_eng}{detailed description of downloaded meteorological variables} #' } #' The object is created mostly to be used altogether with the meteo_shortening_imgw #' function diff --git a/R/imgw_meteo_stations.R b/R/imgw_meteo_stations.R index 5b1718d0..753fe1f0 100644 --- a/R/imgw_meteo_stations.R +++ b/R/imgw_meteo_stations.R @@ -5,10 +5,12 @@ #' coordinates, ID numbers, and elevations #' #' @format The data contains a data.frame with 1998 obs. of 3 variables: -#' \itemize{ -#' \item{id} {Station ID} -#' \item{X} {Longitude} -#' \item{Y} {Latitude} +#' \describe{ +#' \item{id}{Station ID} +#' \item{X}{Longitude} +#' \item{Y}{Latitude} +#' \item{station}{Station name} +#' \item{id2}{IMGW-PIB ID for station rank} #' } #' The object is in the geographic coordinates using WGS84 (EPSG:4326). #' diff --git a/R/meteo_imgw_daily.R b/R/meteo_imgw_daily.R index baf726d0..1060dac3 100644 --- a/R/meteo_imgw_daily.R +++ b/R/meteo_imgw_daily.R @@ -9,8 +9,7 @@ #' (default status = FALSE - i.e. the status columns are deleted) #' @param coords add coordinates of the station (logical value TRUE or FALSE) #' @param station name of meteorological station(s). -#' It accepts names (characters in CAPITAL LETTERS); stations' IDs (numeric) are -#' no longer valid +#' It accepts names (characters in CAPITAL LETTERS); Stations' IDs (numeric) are no longer valid #' @param col_names three types of column names possible: #' "short" - default, values with shorten names, #' "full" - full English description, @@ -44,11 +43,6 @@ meteo_imgw_daily = function(rank = "synop", coords, station, col_names), - warning = function(w) { - message(paste("Potential problem(s) found. Problems with downloading data.\n", - "\rRun function with argument allow_failure = FALSE", - "to see more details")) - }, error = function(e){ message(paste("Potential error(s) found. Problems with downloading data.\n", "\rRun function with argument allow_failure = FALSE", @@ -116,7 +110,6 @@ meteo_imgw_daily_bp = function(rank, temp = tempfile() temp2 = tempfile() test_url(addresses_to_download[j], temp) - #download.file(addresses_to_download[j], temp) unzip(zipfile = temp, exdir = temp2) file1 = paste(temp2, dir(temp2), sep = "/")[1] if (translit) { @@ -124,28 +117,28 @@ meteo_imgw_daily_bp = function(rank, } else { data1 = read.csv(file1, header = FALSE, stringsAsFactors = FALSE, fileEncoding = "CP1250") } - colnames(data1) = meta[[1]]$parameters file2 = paste(temp2, dir(temp2), sep = "/")[2] if (translit) { - data2 = as.data.frame(data.table::fread(cmd = paste("iconv -f CP1250 -t ASCII//TRANSLIT", file2))) + data2 = data.table::fread(cmd = paste("iconv -f CP1250 -t ASCII//TRANSLIT", file2)) } else { - data2 = read.csv(file2, header = FALSE, stringsAsFactors = FALSE, fileEncoding = "CP1250") + data2 = suppressWarnings(read.csv(file2, header = FALSE, stringsAsFactors = FALSE, fileEncoding = "CP1250")) } colnames(data2) = meta[[2]]$parameters + unlink(c(temp, temp2)) - # usuwa statusy + # remove statuses if not needed: if (status == FALSE) { data1[grep("^Status", colnames(data1))] = NULL data2[grep("^Status", colnames(data2))] = NULL } - unlink(c(temp, temp2)) - - # moja proba z obejsciem dla wyboru kodu - ttt = merge(data1, data2, by = c("Kod stacji", "Rok", "Miesiac", "Dzien"), - all.x = TRUE) + ttt = base::merge(data1, + data2, + by = c("Kod stacji", "Rok", "Miesiac", "Dzien"), + all.x = TRUE) + ttt = ttt[order(ttt$`Nazwa stacji.x`, ttt$Rok, ttt$Miesiac, ttt$Dzien), ] ### ta część kodu powtarza sie po dużej petli od rank if (!is.null(station)) { @@ -251,7 +244,7 @@ meteo_imgw_daily_bp = function(rank, all_data = do.call(rbind, all_data) if (coords) { - all_data = merge(climate::imgw_meteo_stations, + all_data = merge(climate::imgw_meteo_stations[, 1:3], all_data, by.x = "id", by.y = "Kod stacji", @@ -291,15 +284,16 @@ meteo_imgw_daily_bp = function(rank, } } - # sortowanie w zaleznosci od nazw kolumn - raz jest "kod stacji", raz "id" + # sort output if (sum(grepl(x = colnames(all_data), pattern = "Kod stacji"))) { all_data = all_data[order(all_data$`Kod stacji`, all_data$Rok, all_data$Miesiac, all_data$Dzien), ] } else { all_data = all_data[order(all_data$id, all_data$Rok, all_data$Miesiac, all_data$Dzien), ] } - # # dodanie opcji dla skracania kolumn i usuwania duplikatow: + # remove duplicates and shorten colnames all_data = meteo_shortening_imgw(all_data, col_names = col_names, ...) + rownames(all_data) = NULL return(all_data) } diff --git a/R/meteo_imgw_datastore.R b/R/meteo_imgw_datastore.R new file mode 100644 index 00000000..2bc3256b --- /dev/null +++ b/R/meteo_imgw_datastore.R @@ -0,0 +1,164 @@ +#' IMGW meteorological data from the IMGW datastore repository +#' +#' Downloading hourly (meteorological) data from the telemetric stations +#' available in the danepubliczne.imgw.pl/datastore collection since 2008. +#' Most parameters are collected with 10 minutes interval and thus it is recommended to download only the mandatory years, parameters or stations. +#' For example, 1 year of data with all available parameters requires processing around 4GB of uncompressed data. +#' +#' Data from the IMGW automated (telemetry) systems are non validated by experts and may contain invalid values. +#' +#' +#' @param year numeric vector of years to be downloaded (e.g., 2022:2023) +#' @param parameters - character vector describing which parameters to be downloaded. Default `NULL` means to download all available. +#' \enumerate{ +#' \item "wd" - wind direction (degrees) +#' \item "t2m" - temperature at 2 metres above ground level (degree Celsius) +#' \item "t0m" - ground temperature (degree Celsius) +#' \item "rr_24h" - precipitation totals for last 24 hours (mm) +#' \item "rr_1h" - precipitation totals for last 1 hour (mm) +#' \item "rr_10min" - precipitation totals for last 10 minutes (mm) +#' \item "ws" - wind speed (m/s) +#' \item "ws_max" - maximum wind speed for last 10 minutes (m/s) +#' \item "gust" - wind gust (if present) (m/s) +#' \item "rh" - relative humidity (%) +#' \item "water_in_snow" - water equivalent of melted snow cover (mm) +#' } +#' @param stations - character vector with station names as visible in the `meteo_imgw_telemetry_stations()`. +#' Default `NULL` means to download data for all available stations. +#' @param coords - logical - whether to append the dataset with station full name, longitude, latitude and altitude. Default: TRUE +#' @param allow_failure logical - whether to proceed or stop on failure. By default set to TRUE (i.e. don't stop on error). For debugging purposes change to FALSE +#' @import data.table +#' @export +#' +#' @examples \donttest{ +#' # download only air temperature for selected 2 stations in 2022-2023: +#' imgw_telemetry = meteo_imgw_datastore(year = 2022:2023, +#' parameters = "t2m", +#' stations = c("HALA GĄSIENICOWA", +#' "DOLINA PIĘCIU STAWÓW"), +#' coords = TRUE) +#' } +#' + + +meteo_imgw_datastore = function(year, + parameters = NULL, + stations = NULL, + coords = TRUE, + allow_failure = TRUE) { + + # assertions for year + if (!any(is.character(year) || is.numeric(year))) { + stop("year argument must be character or numeric") + } + + if (!all(as.numeric(year) >= 2008)) { + stop("year argument must be provided and all elements must be >= 2008") + } + + if (allow_failure) { + tryCatch(meteo_imgw_datastore_bp(year, + parameters, + stations, + coords), + error = function(e){ + message(paste("Potential error(s) found. Problems with downloading data.\n", + "\rRun function with argument allow_failure = FALSE", + "to see more details"))}) + } else { + meteo_imgw_datastore_bp(year, + parameters, + stations, + coords) + } +} + +#' @keywords internal +#' @noRd +meteo_imgw_datastore_bp = function(year, + parameters, + stations, + coords) { + # read metadata for stations: + telemetry_stations = stations_meteo_imgw_telemetry() + telemetry_stations$river = NULL + + if (!is.null(stations)) { + telemetry_stations = telemetry_stations[telemetry_stations$name %in% toupper(stations), ] + } + + urls = as.character( + sapply(year, function(x) paste0( + "https://danepubliczne.imgw.pl/datastore/getfiledown/Arch/Telemetria/Meteo/", + x, "/Meteo_", x, "-", sprintf("%02d", 1:12)) + ) + ) + + dict = data.table::data.table( + V2 = c("B00202A", "B00300S", "B00305A", "B00604S", "B00606S", + "B00608S", "B00702A", "B00703A", "B00714A", "B00802A", + "B00910A"), + parameter = c("wd", "t2m", "t0m", "rr_24h", "rr_1h", + "rr_10min", "ws", "ws_max", "gust", "rh", + "water_in_snow") + ) + + if (!is.null(parameters)) { + dict = dict[dict$parameter %in% parameters,] + } + + all_data = NULL + + for (i in seq_along(urls)) { + + temp = tempfile() + temp2 = tempfile() + tmp_dir = file.path(tempdir(), basename(urls[i])) + download.file(paste0(urls[i], ".zip"), temp) + download.file(paste0(urls[i], ".ZIP"), temp2) + + if (file.size(temp) > 1000) { + unzip(zipfile = temp, exdir = tmp_dir) + } else if (file.size(temp2) > 1000) { + unzip(zipfile = temp2, exdir = tmp_dir) + } else { + message("IMGW datastore does not contain data for ", paste(basename(urls[i])), ". skipping\n") + } + + files_to_read = dir(tmp_dir, full.names = TRUE, pattern = paste0(dict$V2, collapse = "|")) + files_to_read = files_to_read[file.size(files_to_read) > 0] + + all_data[[i]] = data.table::rbindlist( + lapply(files_to_read, + function(x) data.table::fread(x, + header = FALSE, + stringsAsFactors = FALSE, + dec = ",", + sep = ";", + select = c("V1", "V2", "V3", "V4") + ) + ), + fill = TRUE) + + if (!is.null(stations)) { + all_data[[i]] = all_data[[i]][all_data[[i]]$V1 %in% telemetry_stations$id, ] + } + + unlink(c(temp, temp2, tmp_dir), recursive = TRUE) + } + + all_data = data.table::rbindlist(all_data, fill = TRUE) + all_data = all_data[dict, on = 'V2', param := i.parameter] + all_data = data.table::dcast(all_data, V1 + V3 ~ param, value.var = "V4") + all_data$V3 = as.POSIXct(all_data$V3, tz = "UTC") + + if (coords) { + class(telemetry_stations$id) = class(all_data$V1) # equalise classes of objects: + all_data = merge(all_data, telemetry_stations, by.x = "V1", by.y = "id", all = FALSE) + data.table::setcolorder(all_data, c("V1", "name", "lon", "lat", "alt")) + } + + colnames(all_data)[which(colnames(all_data) %in% c("V1", "V3"))] = c("id", "date_time") + + return(all_data) +} diff --git a/R/meteo_imgw_hourly.R b/R/meteo_imgw_hourly.R index d2ca068a..026c5de0 100644 --- a/R/meteo_imgw_hourly.R +++ b/R/meteo_imgw_hourly.R @@ -44,11 +44,6 @@ meteo_imgw_hourly = function(rank = "synop", coords, station, col_names, ...), - warning = function(w) { - message(paste("Potential problem(s) found. Problems with downloading data.\n", - "\rRun function with argument allow_failure = FALSE", - "to see more details")) - }, error = function(e){ message(paste("Potential error(s) found. Problems with downloading data.\n", "\rRun function with argument allow_failure = FALSE", @@ -75,8 +70,8 @@ meteo_imgw_hourly_bp = function(rank, translit = check_locale() stopifnot(rank == "synop" | rank == "climate") # dla terminowek tylko synopy i klimaty maja dane base_url = "https://danepubliczne.imgw.pl/data/dane_pomiarowo_obserwacyjne/" - interval = "hourly" # to mozemy ustawic na sztywno - interval_pl = "terminowe" # to mozemy ustawic na sztywno + interval = "hourly" + interval_pl = "terminowe" meta = meteo_metadata_imgw(interval = "hourly", rank = rank) rank_pl = switch(rank, synop = "synop", climate = "klimat", precip = "opad") temp = tempfile() @@ -84,7 +79,7 @@ meteo_imgw_hourly_bp = function(rank, output = temp) a = readLines(temp, warn = FALSE) unlink(temp) - + ind = grep(readHTMLTable(a)[[1]]$Name, pattern = "/") catalogs = as.character(readHTMLTable(a)[[1]]$Name[ind]) @@ -108,20 +103,20 @@ meteo_imgw_hourly_bp = function(rank, ind = grep(readHTMLTable(folder_contents)[[1]]$Name, pattern = "zip") files = as.character(readHTMLTable(folder_contents)[[1]]$Name[ind]) + addresses_to_download = paste0(address, files) for (j in seq_along(addresses_to_download)) { temp = tempfile() temp2 = tempfile() test_url(addresses_to_download[j], temp) - #download.file(addresses_to_download[j], temp) unzip(zipfile = temp, exdir = temp2) file1 = paste(temp2, dir(temp2), sep = "/") if (translit) { data1 = as.data.frame(data.table::fread(cmd = paste("iconv -f CP1250 -t ASCII//TRANSLIT", file1))) } else { - data1 = read.csv(file1, header = FALSE, stringsAsFactors = FALSE, fileEncoding = "CP1250") + data1 = suppressWarnings(read.csv(file1, header = FALSE, stringsAsFactors = FALSE, fileEncoding = "CP1250")) } colnames(data1) = meta[[1]]$parameters @@ -179,13 +174,16 @@ meteo_imgw_hourly_bp = function(rank, all_data = do.call(rbind, all_data) if (coords) { - all_data = merge(climate::imgw_meteo_stations, all_data, by.x = "id", by.y = "Kod stacji", all.y = TRUE) + all_data = merge(climate::imgw_meteo_stations[,1:3], + all_data, + by.x = "id", + by.y = "Kod stacji", + all.y = TRUE) } # dodaje rank rank_code = switch(rank, synop = "SYNOPTYCZNA", climate = "KLIMATYCZNA") all_data = cbind(data.frame(rank_code = rank_code), all_data) - all_data = all_data[all_data$Rok %in% year, ] # przyciecie tylko do wybranych lat gdyby sie pobralo za duzo #station selection @@ -217,7 +215,8 @@ meteo_imgw_hourly_bp = function(rank, all_data = all_data[order(all_data$id, all_data$Rok, all_data$Miesiac, all_data$Dzien, all_data$Godzina), ] } - # dodanie opcji dla skracania kolumn i usuwania duplikatow: + # extra option for shortening colnames and removing duplicates all_data = meteo_shortening_imgw(all_data, col_names = col_names, ...) + rownames(all_data) = NULL return(all_data) -} # end of function +} diff --git a/R/meteo_imgw_monthly.R b/R/meteo_imgw_monthly.R index c98353b5..4b37858b 100644 --- a/R/meteo_imgw_monthly.R +++ b/R/meteo_imgw_monthly.R @@ -53,11 +53,6 @@ meteo_imgw_monthly = function(rank = "synop", station, col_names, ...), - warning = function(w) { - message(paste("Potential problem(s) found. Problems with downloading data.\n", - "\rRun function with argument allow_failure = FALSE", - "to see more details")) - }, error = function(e){ message(paste("Potential error(s) found. Problems with downloading data.\n", "\rRun function with argument allow_failure = FALSE", @@ -133,7 +128,7 @@ meteo_imgw_monthly_bp = function(rank, if (translit) { data1 = as.data.frame(data.table::fread(cmd = paste("iconv -f CP1250 -t ASCII//TRANSLIT", file1))) } else { - data1 = read.csv(file1, header = FALSE, stringsAsFactors = FALSE, fileEncoding = "CP1250") + data1 = suppressWarnings(read.csv(file1, header = FALSE, stringsAsFactors = FALSE, fileEncoding = "CP1250")) } colnames(data1) = meta[[1]]$parameters @@ -174,7 +169,11 @@ meteo_imgw_monthly_bp = function(rank, all_data = all_data[all_data$Rok %in% year, ] if (coords) { - all_data = merge(climate::imgw_meteo_stations, all_data, by.x = "id", by.y = "Kod stacji", all.y = TRUE) + all_data = merge(climate::imgw_meteo_stations[, 1:3], + all_data, + by.x = "id", + by.y = "Kod stacji", + all.y = TRUE) } # add rank @@ -208,6 +207,7 @@ meteo_imgw_monthly_bp = function(rank, # adding option to shorten columns and removing duplicates: all_data = meteo_shortening_imgw(all_data, col_names = col_names, ...) + rownames(all_data) = NULL return(all_data) # clipping to selected years only } diff --git a/R/meteo_metadata_imgw.R b/R/meteo_metadata_imgw.R index 6a932627..ad9c6d3a 100644 --- a/R/meteo_metadata_imgw.R +++ b/R/meteo_metadata_imgw.R @@ -41,7 +41,7 @@ meteo_metadata_imgw = function(interval, rank) { # interval can be: monthly, hou rank = "precip", interval = "daily") } - } + } # end of daily interval if (interval == "monthly") { @@ -66,7 +66,7 @@ meteo_metadata_imgw = function(interval, rank) { # interval can be: monthly, hou } # koniec MIESIECZNYCH - ## rozpoczecie dla danych TERMINOWYCH: + ## hourly data section: if (interval == "hourly") { if (rank == "synop") b[[1]] = clean_metadata_meteo(paste0(base_url, "dane_meteorologiczne/terminowe/synop/s_t_format.txt"), rank = "synop", interval = "hourly") @@ -76,6 +76,5 @@ meteo_metadata_imgw = function(interval, rank) { # interval can be: monthly, hou stop("The precipitation stations ('precip') does not provide hourly data.", call. = FALSE) } } - return(b) } diff --git a/R/meteo_shortening_imgw.R b/R/meteo_shortening_imgw.R index 3b8c9183..283c5cbb 100644 --- a/R/meteo_shortening_imgw.R +++ b/R/meteo_shortening_imgw.R @@ -34,7 +34,9 @@ meteo_shortening_imgw = function(data, col_names = "short", remove_duplicates = if (col_names != "polish") { abbrev = climate::imgw_meteo_abbrev orig_columns = trimws(gsub("\\s+", " ", colnames(data))) # remove double spaces + orig_columns = trimws(gsub("\\[.*?]", "", orig_columns)) # remove brackets and content inside + abbrev$fullname = trimws(gsub("\\[.*?]", "", abbrev$fullname)) matches = match(orig_columns, abbrev$fullname) matches = matches[!is.na(matches)] @@ -48,7 +50,6 @@ meteo_shortening_imgw = function(data, col_names = "short", remove_duplicates = colnames(data)[orig_columns %in% abbrev$fullname] = abbrev$fullname_eng[matches] } } - + return(data) - -} # end of function +} diff --git a/R/nearest_stations_ogimet.R b/R/nearest_stations_ogimet.R index d9d5f22a..0b0b63fd 100644 --- a/R/nearest_stations_ogimet.R +++ b/R/nearest_stations_ogimet.R @@ -109,7 +109,7 @@ nearest_stations_ogimet_bp = function(country = country, b = strsplit(a, "Decoded synops since") - b1 = lapply(b, function(x) substr(x, 1, 400)) + b1 = lapply(b, function(x) substr(iconv(x, from = 'UTF-8', to = 'ASCII//TRANSLIT'), 1, 400)) b1[[1]] = b1[[1]][-1] # header b21 = unlist(lapply(gregexpr('Lat=', b1[[1]], fixed = TRUE), function(x) x[1])) diff --git a/R/stations_meteo_imgw_telemetry.R b/R/stations_meteo_imgw_telemetry.R new file mode 100644 index 00000000..efd0b9e0 --- /dev/null +++ b/R/stations_meteo_imgw_telemetry.R @@ -0,0 +1,55 @@ +#' IMGW telemetry stations +#' +#' Retrieving current metadata for stations used in the telemetric systems of the IMGW-PIB datastore (danepubliczne.imgw.pl/datastore) +#' +#' @return data table with metadata for over 500 stations. Metadata contains: station ID, station name, river, latitude, longitude, altitude +#' @importFrom data.table as.data.table +#' @export +#' +#' @examples \donttest{ +#' telemetry_stations = stations_meteo_imgw_telemetry() +#' } +#' + +stations_meteo_imgw_telemetry = function() { + + url = "https://danepubliczne.imgw.pl/datastore/getfiledown/Arch/Telemetria/Meteo/kody_stacji.csv" + + telemetry_stations = tryCatch(expr = suppressWarnings( + read.csv(url, + fileEncoding = "CP1250", + sep = ";", + stringsAsFactors = FALSE) + ), + error = function(e) { + message(paste0("Problems with downloading data from:\n", url)) + }) + + if (!is.null(telemetry_stations)) { + colnames(telemetry_stations) = c("no", "id", "name", "river", "lat", "lon", "alt") + # extra fix for columns wrongly signed in IMGW datatabase (i.e. missing semicolon): + fix_needed = grep(x = substr(telemetry_stations$river, 1, 1), '^[0-9]$') + + telemetry_stations[fix_needed, "alt"] = telemetry_stations[fix_needed, "lon"] + telemetry_stations[fix_needed, "lon"] = telemetry_stations[fix_needed, "lat"] + telemetry_stations[fix_needed, "lat"] = telemetry_stations[fix_needed, "river"] + telemetry_stations[fix_needed, "river"] = NA + + telemetry_stations$lon = suppressWarnings(coordinates_to_decimal(telemetry_stations$lon)) + telemetry_stations$lat = suppressWarnings(coordinates_to_decimal(telemetry_stations$lat)) + telemetry_stations$alt = as.numeric(gsub(x = telemetry_stations$alt, " ", "")) + telemetry_stations = as.data.table(telemetry_stations[,-1]) + telemetry_stations$id = as.character(telemetry_stations$id) + } + return(telemetry_stations) +} + + +#' @keywords internal +#' @noRd +coordinates_to_decimal = function(lonlat) { + converted = unlist(lapply(strsplit(lonlat, " "), function(d) as.numeric(d[[1]]))) + + unlist(lapply(strsplit(lonlat, " "), function(m) as.numeric(m[[2]]) * 0.01667)) + + unlist(lapply(strsplit(lonlat, " "), function(s) as.numeric(s[[3]]) * 0.0001667)) + return(converted) +} diff --git a/R/stations_ogimet.R b/R/stations_ogimet.R index fa60c62e..bf617ec7 100644 --- a/R/stations_ogimet.R +++ b/R/stations_ogimet.R @@ -38,7 +38,7 @@ stations_ogimet = function(country = "United+Kingdom", stations_ogimet_bp = function(country = country, date = date, add_map = add_map) { if (length(country) != 1) { - stop("To many country selected. Please choose one country") + stop("Too many countries selected. Please choose only one country") } if (length(date) != 1) { @@ -52,64 +52,64 @@ stations_ogimet_bp = function(country = country, date = date, add_map = add_map) ndays = 1 linkpl2 = paste0("http://ogimet.com/cgi-bin/gsynres?lang=en&state=",country,"&osum=no&fmt=html&ord=REV&ano=",year,"&mes=",month,"&day=",day,"&hora=06&ndays=1&Send=send") - temp = tempfile() - test_url(link = linkpl2, output = temp) + temp = tempfile() + test_url(link = linkpl2, output = temp) - # run only if downloaded file is valid - if (!is.na(file.size(temp)) & (file.size(temp) > 0)) { + # run only if downloaded file is valid + if (!is.na(file.size(temp)) & (file.size(temp) > 0)) { - a = readLines(temp) - a = paste(a, sep = "", collapse = "") - - b = strsplit(a, "Decoded synops since") - - b1 = lapply(b, function(x) substr(x, 1, 400)) - b1[[1]] = b1[[1]][-1] # header - - b21 = unlist(lapply(gregexpr('Lat=', b1[[1]], fixed = TRUE), function(x) x[1])) - - pattern = paste0(" (", gsub(x = country, pattern = "+", replacement = " ", fixed = TRUE)) - b22 = unlist(lapply(gregexpr(pattern = pattern, b1[[1]], fixed = TRUE), function(x) x[1])) - - b1 = data.frame(str = b1[[1]], start = b21, stop = b22 - 1, stringsAsFactors = FALSE) - - res = substr(b1$str, b1$start, b1$stop) - - station_names = unlist(lapply(strsplit(res, " - "), function(x) x[length(x)])) - - - res = gsub(x = res, pattern = ", CAPTION, '", replacement = '', fixed = TRUE) - res = gsub(x = res, pattern = " m'", replacement = ' ', fixed = TRUE) - res = gsub(x = res, pattern = " - ", replacement = ' ', fixed = TRUE) - res = gsub(x = res, pattern = "Lat=", replacement = '', fixed = TRUE) - res = gsub(x = res, pattern = "Lon=", replacement = ' ', fixed = TRUE) - res = gsub(x = res, pattern = "Alt=", replacement = ' ', fixed = TRUE) - - res = suppressWarnings(do.call("rbind", strsplit(res, " "))) - - res1 = res[, c(1, 3, 5:7)] - - lat = as.numeric(substr(res1[, 1], 1, 2)) + - (as.numeric(substr(res1[,1], 4, 5))/100) * 1.6667 - - lon_hemisphere = gsub("[0-9]", "\\1", res1[, 2]) - lon_hemisphere = gsub("-", "", lon_hemisphere) - lon_hemisphere = ifelse(lon_hemisphere == "W", -1, 1) - - lat_hemisphere = gsub("[0-9]", "\\1", res1[, 1]) - lat_hemisphere = gsub("-", "", lat_hemisphere) - lat_hemisphere = ifelse(lat_hemisphere == "S", -1, 1) - - lon = as.numeric(substr(res1[, 2], 1, 3)) + (as.numeric(substr(res1[, 2], 5, 6)) / - 100) * 1.6667 - lon = lon * lon_hemisphere - - lat = as.numeric(substr(res1[, 1], 1, 2)) + (as.numeric(substr(res1[, 1], 4, 5)) / - 100) * 1.6667 - lat = lat * lat_hemisphere + a = readLines(temp) + a = paste(a, sep = "", collapse = "") + b = strsplit(a, "Decoded synops since") + + b1 = lapply(b, function(x) substr(x, 1, 400)) + b1[[1]] = b1[[1]][-1] # header + + b21 = unlist(lapply(gregexpr('Lat=', b1[[1]], fixed = TRUE), function(x) x[1])) + + pattern = paste0(" (", gsub(x = country, pattern = "+", replacement = " ", fixed = TRUE)) + b22 = unlist(lapply(gregexpr(pattern = pattern, b1[[1]], fixed = TRUE), function(x) x[1])) + + b1 = data.frame(str = b1[[1]], start = b21, stop = b22 - 1, stringsAsFactors = FALSE) - res = data.frame(wmo_id = res1[, 4], station_names = station_names, - lon = lon, lat = lat, alt = as.numeric(res1[, 3])) + res = substr(b1$str, b1$start, b1$stop) + + station_names = unlist(lapply(strsplit(res, " - ", fixed = TRUE), function(x) x[length(x)])) + + res = gsub(x = res, pattern = ", CAPTION, '", replacement = '', fixed = TRUE) + res = gsub(x = res, pattern = " m'", replacement = ' ', fixed = TRUE) + res = gsub(x = res, pattern = " - ", replacement = ' ', fixed = TRUE) + res = gsub(x = res, pattern = "Lat=", replacement = '', fixed = TRUE) + res = gsub(x = res, pattern = "Lon=", replacement = ' ', fixed = TRUE) + res = gsub(x = res, pattern = "Alt=", replacement = ' ', fixed = TRUE) + res = gsub(x = res, pattern = " / ", replacement = '/', fixed = TRUE) + + res = suppressWarnings(do.call("rbind", strsplit(res, " "))) + res1 = matrix(res[, c(1, 3, 5:7)], ncol = 5) + + lat = suppressWarnings( + as.numeric(substr(res1[, 1], 1, 2)) + + (as.numeric(substr(res1[, 1], 4, 5)) / 100) * 1.6667 + ) + + lon_hemisphere = gsub("[0-9]", "\\1", res1[, 2]) + lon_hemisphere = gsub("-", "", lon_hemisphere) + lon_hemisphere = ifelse(lon_hemisphere == "W", -1, 1) + + lat_hemisphere = gsub("[0-9]", "\\1", res1[, 1]) + lat_hemisphere = gsub("-", "", lat_hemisphere) + lat_hemisphere = ifelse(lat_hemisphere == "S", -1, 1) + + lon = suppressWarnings( + as.numeric(substr(res1[, 2], 1, 3)) + + (as.numeric(substr(res1[, 2], 5, 6)) / 100) * 1.6667 + ) + lon = lon * lon_hemisphere + + lat = lat * lat_hemisphere + + res = data.frame(wmo_id = res1[, 4], station_names = station_names, + lon = lon, lat = lat, alt = as.numeric(res1[, 3])) } else { res = NULL diff --git a/README.md b/README.md index 520c37eb..764992eb 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ and hydrological data from publicly available repositories: - OGIMET [(ogimet.com)](http://ogimet.com/index.phtml.en) - up-to-date collection of SYNOP dataset - University of Wyoming - atmospheric vertical profiling data (http://weather.uwyo.edu/upperair/) - National Oceanic & Atmospheric Administration - Earth System Research Laboratories - Global Monitoring Laboratory [(NOAA)](https://gml.noaa.gov/ccgg/trends/) -- Polish Institute of Meterology and Water Management - National Research Institute [(IMGW-PIB)](https://dane.imgw.pl/) +- Polish Institute of Meteorology and Water Management - National Research Institute [(IMGW-PIB)](https://dane.imgw.pl/) - National Oceanic & Atmospheric Administration - National Climatic Data Center - Integrated Surface Hourly (ISH) [(NOAA)](https://www1.ncdc.noaa.gov/pub/data/noaa/) ## Installation diff --git a/data/imgw_meteo_stations.rda b/data/imgw_meteo_stations.rda index b0297da9239df1bacb035a4a4c261836de2b66ed..78f97570c0b8898d057fd79de6fff2e2620cd216 100644 GIT binary patch literal 54115 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 azqReJw{kS7!KKsxi@744C`cX-BhdiDtzfAD diff --git a/inst/CITATION b/inst/CITATION index 81a84f68..ae4c1415 100644 --- a/inst/CITATION +++ b/inst/CITATION @@ -1,6 +1,6 @@ citHeader("To cite the climate package in publications, please use:") -citEntry(entry = "manual", +bibentry(bibtype = "Article", author = c(person("Bartosz", "Czernecki"), person("Arkadiusz", "Głogowski"), person("Jakub", "Nowosad")), @@ -10,8 +10,8 @@ citEntry(entry = "manual", pages = {"394"}, volume = {"12"}, doi = {"10.3390/su12010394"}, - note = "R package version 0.9.1", - url = "https://github.com/bczernecki/climate/", + #note = "R package version 1.2.0", + #url = "https://github.com/bczernecki/climate/", textVersion = "Czernecki, B.; Głogowski, A.; Nowosad, J. Climate: An R Package to Access Free In-Situ Meteorological and Hydrological Datasets for Environmental Assessment. Sustainability 2020, 12, 394. https://doi.org/10.3390/su12010394" ) diff --git a/man/climate-package.Rd b/man/climate-package.Rd index 19dd9d7e..a244cc32 100644 --- a/man/climate-package.Rd +++ b/man/climate-package.Rd @@ -8,7 +8,7 @@ \description{ \if{html}{\figure{logo.png}{options: style='float: right' alt='logo' width='120'}} -Automatize downloading of meteorological and hydrological data from publicly available repositories: OGIMET (\url{http://ogimet.com/index.phtml.en}), University of Wyoming - atmospheric vertical profiling data (\url{http://weather.uwyo.edu/upperair/}), Polish Institute of Meterology and Water Management - National Research Institute (\url{https://danepubliczne.imgw.pl}), and National Oceanic & Atmospheric Administration (NOAA). This package also allows for searching geographical coordinates for each observation and calculate distances to the nearest stations. +Automatize downloading of meteorological and hydrological data from publicly available repositories: OGIMET (\url{http://ogimet.com/index.phtml.en}), University of Wyoming - atmospheric vertical profiling data (\url{http://weather.uwyo.edu/upperair/}), Polish Institute of Meteorology and Water Management - National Research Institute (\url{https://danepubliczne.imgw.pl}), and National Oceanic & Atmospheric Administration (NOAA). This package also allows for searching geographical coordinates for each observation and calculate distances to the nearest stations. } \seealso{ Useful links: diff --git a/man/imgw_hydro_abbrev.Rd b/man/imgw_hydro_abbrev.Rd index 93ddebcc..644f7b1f 100644 --- a/man/imgw_hydro_abbrev.Rd +++ b/man/imgw_hydro_abbrev.Rd @@ -7,11 +7,10 @@ from the danepubliczne.imgw.pl collection} \format{ The data contains a data.frame with ca. 20 elements described in three ways: -\itemize{ -\item{fullname} {original column names as downloaded from the repository} -\item{abbr_eng} {shorten column names with abbreviations derived from the most -popular scheme used for meteorological parameters} -\item{fullname_eng} {detailed description of downloaded meteorological variables} +\describe{ +\item{fullname}{original column names as downloaded from the repository} +\item{abbr_eng}{shorten column names with abbreviations derived from the most popular scheme used for meteorological parameters} +\item{fullname_eng}{detailed description of downloaded meteorological variables} } The object is created mostly to be used altogether with the hydro_shortening_imgw() function } diff --git a/man/imgw_hydro_stations.Rd b/man/imgw_hydro_stations.Rd index 403641b5..45b6b5c9 100644 --- a/man/imgw_hydro_stations.Rd +++ b/man/imgw_hydro_stations.Rd @@ -6,10 +6,10 @@ \title{Location of the hydrological stations from the danepubliczne.imgw.pl collection} \format{ The data contains a data.frame with 1304 obs. of 3 variables: -\itemize{ -\item{id} {Station ID} -\item{X} {Longitude} -\item{Y} {Latitude} +\describe{ +\item{id}{Station ID} +\item{X}{Longitude} +\item{Y}{Latitude} } The object is in the geographic coordinates using WGS84 (EPSG:4326). } diff --git a/man/imgw_meteo_abbrev.Rd b/man/imgw_meteo_abbrev.Rd index b05e011a..7ca53bd6 100644 --- a/man/imgw_meteo_abbrev.Rd +++ b/man/imgw_meteo_abbrev.Rd @@ -7,11 +7,11 @@ for the meteorological data from the danepubliczne.imgw.pl collection} \format{ The data contains a data.frame with ca. 250 elements described in three ways: -\itemize{ -\item{fullname} {original column names as downloaded from the repository} -\item{abbr_eng} {shorten column names with abbreviations derived from the most +\describe{ +\item{fullname}{original column names as downloaded from the repository} +\item{abbr_eng}{shorten column names with abbreviations derived from the most popular scheme used for meteorological parameters} -\item{fullname_eng} {detailed description of downloaded meteorological variables} +\item{fullname_eng}{detailed description of downloaded meteorological variables} } The object is created mostly to be used altogether with the meteo_shortening_imgw function diff --git a/man/imgw_meteo_stations.Rd b/man/imgw_meteo_stations.Rd index 30261938..f4654561 100644 --- a/man/imgw_meteo_stations.Rd +++ b/man/imgw_meteo_stations.Rd @@ -6,10 +6,12 @@ \title{Location of the meteorological stations from the danepubliczne.imgw.pl collection} \format{ The data contains a data.frame with 1998 obs. of 3 variables: -\itemize{ -\item{id} {Station ID} -\item{X} {Longitude} -\item{Y} {Latitude} +\describe{ +\item{id}{Station ID} +\item{X}{Longitude} +\item{Y}{Latitude} +\item{station}{Station name} +\item{id2}{IMGW-PIB ID for station rank} } The object is in the geographic coordinates using WGS84 (EPSG:4326). } diff --git a/man/meteo_imgw_daily.Rd b/man/meteo_imgw_daily.Rd index b1ad6b2a..718bb1db 100644 --- a/man/meteo_imgw_daily.Rd +++ b/man/meteo_imgw_daily.Rd @@ -26,8 +26,7 @@ meteo_imgw_daily( \item{coords}{add coordinates of the station (logical value TRUE or FALSE)} \item{station}{name of meteorological station(s). -It accepts names (characters in CAPITAL LETTERS); stations' IDs (numeric) are -no longer valid} +It accepts names (characters in CAPITAL LETTERS); Stations' IDs (numeric) are no longer valid} \item{col_names}{three types of column names possible: "short" - default, values with shorten names, diff --git a/man/meteo_imgw_datastore.Rd b/man/meteo_imgw_datastore.Rd new file mode 100644 index 00000000..4b6f2790 --- /dev/null +++ b/man/meteo_imgw_datastore.Rd @@ -0,0 +1,65 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/meteo_imgw_datastore.R +\name{meteo_imgw_datastore} +\alias{meteo_imgw_datastore} +\title{IMGW meteorological data from the IMGW datastore repository} +\usage{ +meteo_imgw_datastore( + year, + parameters = NULL, + stations = NULL, + coords = TRUE, + allow_failure = TRUE +) +} +\arguments{ +\item{year}{numeric vector of years to be downloaded (e.g., 2022:2023)} + +\item{parameters}{\itemize{ +\item character vector describing which parameters to be downloaded. Default \code{NULL} means to download all available. +\enumerate{ +\item "wd" - wind direction (degrees) +\item "t2m" - temperature at 2 metres above ground level (degree Celsius) +\item "t0m" - ground temperature (degree Celsius) +\item "rr_24h" - precipitation totals for last 24 hours (mm) +\item "rr_1h" - precipitation totals for last 1 hour (mm) +\item "rr_10min" - precipitation totals for last 10 minutes (mm) +\item "ws" - wind speed (m/s) +\item "ws_max" - maximum wind speed for last 10 minutes (m/s) +\item "gust" - wind gust (if present) (m/s) +\item "rh" - relative humidity (\%) +\item "water_in_snow" - water equivalent of melted snow cover (mm) +} +}} + +\item{stations}{\itemize{ +\item character vector with station names as visible in the \code{meteo_imgw_telemetry_stations()}. +Default \code{NULL} means to download data for all available stations. +}} + +\item{coords}{\itemize{ +\item logical - whether to append the dataset with station full name, longitude, latitude and altitude. Default: TRUE +}} + +\item{allow_failure}{logical - whether to proceed or stop on failure. By default set to TRUE (i.e. don't stop on error). For debugging purposes change to FALSE} +} +\description{ +Downloading hourly (meteorological) data from the telemetric stations +available in the danepubliczne.imgw.pl/datastore collection since 2008. +Most parameters are collected with 10 minutes interval and thus it is recommended to download only the mandatory years, parameters or stations. +For example, 1 year of data with all available parameters requires processing around 4GB of uncompressed data. +} +\details{ +Data from the IMGW automated (telemetry) systems are non validated by experts and may contain invalid values. +} +\examples{ +\donttest{ +# download only air temperature for selected 2 stations in 2022-2023: +imgw_telemetry = meteo_imgw_datastore(year = 2022:2023, + parameters = "t2m", + stations = c("HALA GĄSIENICOWA", + "DOLINA PIĘCIU STAWÓW"), + coords = TRUE) +} + +} diff --git a/man/stations_meteo_imgw_telemetry.Rd b/man/stations_meteo_imgw_telemetry.Rd new file mode 100644 index 00000000..17ca8b88 --- /dev/null +++ b/man/stations_meteo_imgw_telemetry.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/stations_meteo_imgw_telemetry.R +\name{stations_meteo_imgw_telemetry} +\alias{stations_meteo_imgw_telemetry} +\title{IMGW telemetry stations} +\usage{ +stations_meteo_imgw_telemetry() +} +\value{ +data table with metadata for over 500 stations. Metadata contains: station ID, station name, river, latitude, longitude, altitude +} +\description{ +Retrieving current metadata for stations used in the telemetric systems of the IMGW-PIB datastore (danepubliczne.imgw.pl/datastore) +} +\examples{ +\donttest{ + telemetry_stations = stations_meteo_imgw_telemetry() +} + +} diff --git a/tests/testthat/test-meteo_imgw.R b/tests/testthat/test-meteo_imgw.R index 62276389..93e9d832 100644 --- a/tests/testthat/test-meteo_imgw.R +++ b/tests/testthat/test-meteo_imgw.R @@ -2,23 +2,29 @@ context("meteo_imgw") y <- 2018 test_that("meteo_imgw works!", { - x <- meteo_imgw("hourly", "synop", year = y) - x <- meteo_imgw("hourly", "climate", year = y) - expect_message(x <- meteo_imgw("hourly", "precip", year = y)) - x <- meteo_imgw("daily", "synop", year = y) - x <- meteo_imgw("daily", "climate", year = y) - x <- meteo_imgw("daily", "precip", year = y) - x <- meteo_imgw("monthly", "synop", year = y) - x <- meteo_imgw("monthly", "climate", year = y) - x <- meteo_imgw("monthly", "precip", year = y) - x <- meteo_imgw("monthly", "synop", year = y, status = TRUE) - x <- meteo_imgw("monthly", "synop", year = y, coords = TRUE) - x <- meteo_imgw("monthly", "synop", year = y, col_names = "full") - x <- meteo_imgw("monthly", "synop", year = y, coords = TRUE, col_names = "full") - x <- meteo_imgw("monthly", "synop", year = y, col_names = "polish") - x <- meteo_imgw("monthly", "synop", year = y, coords = TRUE, col_names = "polish") - x <- meteo_imgw("monthly", "synop", year = y, station = "BIAŁYSTOK") - x2 <- meteo_imgw("monthly", "synop", year = y, station = 353230295) - testthat::expect_message(x <- suppressWarnings(meteo_imgw_daily(rank = "synop", year = 2001, station = "blabla"))) + if (!curl::has_internet()) { + message("No internet connection! \n") + return(invisible(NULL)) + } else { + x <- meteo_imgw("hourly", "synop", year = y) + x <- meteo_imgw("hourly", "climate", year = y) + expect_message(x <- meteo_imgw("hourly", "precip", year = y)) + x <- meteo_imgw("daily", "synop", year = y) + x <- meteo_imgw("daily", "climate", year = y) + x <- meteo_imgw("daily", "precip", year = y) + x <- meteo_imgw("monthly", "synop", year = y) + x <- meteo_imgw("monthly", "climate", year = y) + x <- meteo_imgw("monthly", "precip", year = y) + x <- meteo_imgw("monthly", "synop", year = y, status = TRUE) + x <- meteo_imgw("monthly", "synop", year = y, coords = TRUE) + x <- meteo_imgw("monthly", "synop", year = y, col_names = "full") + x <- meteo_imgw("monthly", "synop", year = y, coords = TRUE, col_names = "full") + x <- meteo_imgw("monthly", "synop", year = y, col_names = "polish") + x <- meteo_imgw("monthly", "synop", year = y, coords = TRUE, col_names = "polish") + x <- meteo_imgw("monthly", "synop", year = y, station = "BIAŁYSTOK") + x2 <- meteo_imgw("monthly", "synop", year = y, station = 353230295) + + testthat::expect_message(x <- suppressWarnings(meteo_imgw_daily(rank = "synop", year = 2001, station = "blabla"))) + } }) diff --git a/tests/testthat/test-meteo_imgw_daily.R b/tests/testthat/test-meteo_imgw_daily.R index fe06bcf8..1c1ead0c 100644 --- a/tests/testthat/test-meteo_imgw_daily.R +++ b/tests/testthat/test-meteo_imgw_daily.R @@ -2,25 +2,42 @@ context("meteo_imgw_daily") test_that("meteo_imgw_daily", { - y <- 1900 # year not supported - expect_message(meteo_imgw_daily(rank = "synop", year = y, status = TRUE, - coords = TRUE, allow_failure = TRUE)) + if (!curl::has_internet()) { + message("No internet connection! \n") + return(invisible(NULL)) + } else { + y <- 1900 # year not supported + expect_message(meteo_imgw_daily(rank = "synop", year = y, status = TRUE, + coords = TRUE, allow_failure = TRUE)) + } }) test_that("check_column_with_coordinates", { - station_with_coordinates = meteo_imgw_daily(rank = "precip", - year = 2002, - coords = TRUE, - station = "IMBRAMOWICE") - if (is.data.frame(station_with_coordinates)) { - expect_true(any(colnames(station_with_coordinates) %in% c("X", "Y"))) + + if (!curl::has_internet()) { + message("No internet connection! \n") + return(invisible(NULL)) + } else { + station_with_coordinates = meteo_imgw_daily(rank = "precip", + year = 2002, + coords = TRUE, + station = "IMBRAMOWICE") + if (is.data.frame(station_with_coordinates)) { + expect_true(any(colnames(station_with_coordinates) %in% c("X", "Y"))) + } } }) test_that("check_message_for_non_existing_station", { - expect_message(meteo_imgw_daily(rank = "precip", - year = 2002, - coords = TRUE, - station = 9999)) + + if (!curl::has_internet()) { + message("No internet connection! \n") + return(invisible(NULL)) + } else { + expect_message(meteo_imgw_daily(rank = "precip", + year = 2002, + coords = TRUE, + station = 9999)) + } }) diff --git a/tests/testthat/test-meteo_imgw_datastore.R b/tests/testthat/test-meteo_imgw_datastore.R new file mode 100644 index 00000000..8b567da0 --- /dev/null +++ b/tests/testthat/test-meteo_imgw_datastore.R @@ -0,0 +1,19 @@ +context("meteo-imgw-datastore") + + +test_that("test-meteo_imgw_datastore", { + if (!curl::has_internet()) { + message("No internet connection! \n") + return(invisible(NULL)) + } else { + + imgw_telemetry = meteo_imgw_datastore(year = 2023, + parameters = "t2m", + stations = "PSZENNO") + + if (is.data.frame(imgw_telemetry) & nrow(imgw_telemetry) > 0) { + testthat::expect_true(is.data.frame(imgw_telemetry)) + testthat::expect_true(nrow(imgw_telemetry) > 50000) + } + } +}) diff --git a/tests/testthat/test-meteo_metadata_imgw.R b/tests/testthat/test-meteo_metadata_imgw.R index d82d2dd9..9e99236a 100644 --- a/tests/testthat/test-meteo_metadata_imgw.R +++ b/tests/testthat/test-meteo_metadata_imgw.R @@ -2,26 +2,31 @@ context("meteo-metadata") test_that("tests to be re-written meteo_metadata_imgw", { #skip("meteo-metadata skipping") - m_hs <- meteo_metadata_imgw("hourly", "synop") - m_hc <- meteo_metadata_imgw("hourly", "climate") - m_ds <- meteo_metadata_imgw("daily", "synop") - m_dc <- meteo_metadata_imgw("daily", "climate") - m_dp <- meteo_metadata_imgw("daily", "precip") - m_ms <- meteo_metadata_imgw("monthly", "synop") - m_mc <- meteo_metadata_imgw("monthly", "climate") - m_mp <- meteo_metadata_imgw("monthly", "precip") - - expect_error(meteo_metadata_imgw("hourly", "precip")) - expect_equal(dim(m_hs[[1]]), c(107, 3)) - expect_equal(dim(m_hc[[1]]), c(22, 3)) - expect_equal(dim(m_ds[[1]]), c(65, 3)) - expect_equal(dim(m_ds[[2]]), c(23, 3)) - expect_equal(dim(m_dc[[1]]), c(18, 3)) - expect_equal(dim(m_dc[[2]]), c(13, 3)) - expect_equal(dim(m_dp[[1]]), c(16, 3)) - expect_equal(dim(m_ms[[1]]), c(60, 3)) - expect_equal(dim(m_ms[[2]]), c(22, 3)) - expect_equal(dim(m_mc[[1]]), c(27, 3)) - expect_equal(dim(m_mc[[2]]), c(12, 3)) - expect_equal(dim(m_mp[[1]]), c(14, 3)) + if (!curl::has_internet()) { + message("No internet connection! \n") + return(invisible(NULL)) + } else { + m_hs <- meteo_metadata_imgw("hourly", "synop") + m_hc <- meteo_metadata_imgw("hourly", "climate") + m_ds <- meteo_metadata_imgw("daily", "synop") + m_dc <- meteo_metadata_imgw("daily", "climate") + m_dp <- meteo_metadata_imgw("daily", "precip") + m_ms <- meteo_metadata_imgw("monthly", "synop") + m_mc <- meteo_metadata_imgw("monthly", "climate") + m_mp <- meteo_metadata_imgw("monthly", "precip") + + expect_error(meteo_metadata_imgw("hourly", "precip")) + expect_equal(dim(m_hs[[1]]), c(107, 3)) + expect_equal(dim(m_hc[[1]]), c(22, 3)) + expect_equal(dim(m_ds[[1]]), c(65, 3)) + expect_equal(dim(m_ds[[2]]), c(23, 3)) + expect_equal(dim(m_dc[[1]]), c(18, 3)) + expect_equal(dim(m_dc[[2]]), c(13, 3)) + expect_equal(dim(m_dp[[1]]), c(16, 3)) + expect_equal(dim(m_ms[[1]]), c(60, 3)) + expect_equal(dim(m_ms[[2]]), c(22, 3)) + expect_equal(dim(m_mc[[1]]), c(27, 3)) + expect_equal(dim(m_mc[[2]]), c(12, 3)) + expect_equal(dim(m_mp[[1]]), c(14, 3)) + } }) diff --git a/tests/testthat/test-meteo_ogimet.R b/tests/testthat/test-meteo_ogimet.R index 9eab933a..785911b5 100644 --- a/tests/testthat/test-meteo_ogimet.R +++ b/tests/testthat/test-meteo_ogimet.R @@ -41,21 +41,25 @@ test_that("meteo_ogimet works!", { # only wind measurement are present: - testthat::expect_error( - meteo_ogimet( - date = c(as.Date("2020-02-01"), Sys.Date() - 1), - # date = c(Sys.Date() - 7, Sys.Date() - 1), - interval = "daily", - coords = FALSE, - station = "06683", allow_failure = FALSE) - ) - - # check change between years: - multiyr = ogimet_daily(date = c( as.Date("2022-11-15"), - as.Date("2023-02-01")), - station = 12330) - if (is.data.frame(multiyr)) { - testthat::expect_true(nrow(multiyr) > 70) + if (!curl::has_internet()) { + message("No internet connection! \n") + return(invisible(NULL)) + } else { + testthat::expect_error( + meteo_ogimet( + date = c(as.Date("2020-02-01"), Sys.Date() - 1), + # date = c(Sys.Date() - 7, Sys.Date() - 1), + interval = "daily", + coords = FALSE, + station = "06683", allow_failure = FALSE) + ) + + # check change between years: + multiyr = ogimet_daily(date = c( as.Date("2022-11-15"), + as.Date("2023-02-01")), + station = 12330) + if (is.data.frame(multiyr)) { + testthat::expect_true(nrow(multiyr) > 70) + } } - }) diff --git a/tests/testthat/test-nearest_stations_noaa.R b/tests/testthat/test-nearest_stations_noaa.R index 563bf51d..42746958 100644 --- a/tests/testthat/test-nearest_stations_noaa.R +++ b/tests/testthat/test-nearest_stations_noaa.R @@ -1,41 +1,50 @@ test_that("nearest_stations_noaa", { - x = nearest_stations_noaa(country = "SRI LANKA", - point = c(80, 6), - add_map = TRUE, - no_of_stations = 10) - if (is.data.frame(x)) { - testthat::expect_true(nrow(x) <= 10) + if (!curl::has_internet()) { + message("No internet connection! \n") + return(invisible(NULL)) + } else { + x = nearest_stations_noaa(country = "SRI LANKA", + point = c(80, 6), + add_map = TRUE, + no_of_stations = 10) + if (is.data.frame(x)) { + testthat::expect_true(nrow(x) <= 10) + } } }) test_that("nearest_stations_noaa_errors", { - testthat::expect_message(nearest_stations_noaa(allow_failure = TRUE)) - testthat::expect_error(nearest_stations_noaa(allow_failure = FALSE)) - testthat::expect_error(nearest_stations_noaa(country = "POLAND", - point = c(10, 20, 30), - allow_failure = FALSE)) - + if (!curl::has_internet()) { + message("No internet connection! \n") + return(invisible(NULL)) + } else { + testthat::expect_message(nearest_stations_noaa(allow_failure = TRUE)) + testthat::expect_error(nearest_stations_noaa(allow_failure = FALSE)) + testthat::expect_error(nearest_stations_noaa(country = "POLAND", + point = c(10, 20, 30), + allow_failure = FALSE)) + # testthat::expect_message(nearest_stations_noaa(country = "POLAND", # point = 1, # allow_failure = FALSE)) # # check if this is query is retrieving data for Poland: - x = nearest_stations_noaa(country = "POLAND", point = c(19, 52)) + x = nearest_stations_noaa(country = "POLAND", point = c(19, 52)) + + if (is.data.frame(x)) { + testthat::expect_equal(unique(x$countries), "POLAND") + } - if (is.data.frame(x)) { - testthat::expect_equal(unique(x$countries), "POLAND") - } - - testthat::expect_error(nearest_stations_noaa(country = "POLAND", - point = c(30, 50), - date = c(Sys.Date() - 7, Sys.Date() - 1), - allow_failure = FALSE)) - - testthat::expect_message(nearest_stations_noaa(country = "SOVIET UNION", - point = c(30, 50), - date = c(Sys.Date()), - allow_failure = TRUE)) - + testthat::expect_error(nearest_stations_noaa(country = "POLAND", + point = c(30, 50), + date = c(Sys.Date() - 7, Sys.Date() - 1), + allow_failure = FALSE)) + + testthat::expect_message(nearest_stations_noaa(country = "SOVIET UNION", + point = c(30, 50), + date = c(Sys.Date()), + allow_failure = TRUE)) + } }) diff --git a/tests/testthat/test-stations_meteo_imgw_telemetry.R b/tests/testthat/test-stations_meteo_imgw_telemetry.R new file mode 100644 index 00000000..f733ebb6 --- /dev/null +++ b/tests/testthat/test-stations_meteo_imgw_telemetry.R @@ -0,0 +1,16 @@ +context("stations_meteo_imgw_telemetry") + + +test_that("test-stations_meteo_imgw_telemetry", { + if (!curl::has_internet()) { + message("No internet connection! \n") + return(invisible(NULL)) + } else { + + df = stations_meteo_imgw_telemetry() + if (is.data.frame(df) & nrow(df) > 0) { + testthat::expect_true(is.data.frame(df)) + } + + } +}) diff --git a/vignettes/getstarted.Rmd b/vignettes/getstarted.Rmd index feb70543..75fe552d 100644 --- a/vignettes/getstarted.Rmd +++ b/vignettes/getstarted.Rmd @@ -22,7 +22,7 @@ and hydrological data from publicly available repositories: - OGIMET [(ogimet.com)](http://ogimet.com/index.phtml.en) - University of Wyoming - atmospheric vertical profiling data (http://weather.uwyo.edu/upperair/). -- Polish Institute of Meterology and Water Management - National Research Institute [(IMGW-PIB)](https://dane.imgw.pl/) +- Polish Institute of Meteorology and Water Management - National Research Institute [(IMGW-PIB)](https://dane.imgw.pl/) - National Oceanic & Atmospheric Administration - Earth System Research Laboratory - Global Monitoring Division [(NOAA)](https://gml.noaa.gov/ccgg/trends/) - National Oceanic & Atmospheric Administration - National Climatic Data Center - Integrated Surface Hourly (ISH) [(NOAA)](https://www1.ncdc.noaa.gov/pub/data/noaa/)