Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bioRad 0.8.1 #661

Merged
merged 86 commits into from
Jul 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
cffc6fb
fixed mixed attribute warnings in as.vpts
iskandari Jul 9, 2024
bad1c72
add vol2birdR in remotes as temporary measure
iskandari Jul 9, 2024
4f4ceea
change vol2birdR in description to specify branch
iskandari Jul 10, 2024
e911621
added vpts validation function
iskandari Jul 11, 2024
1fb80bb
added vpts validation function
iskandari Jul 11, 2024
5dc3a3b
added vpts validation function
iskandari Jul 11, 2024
e76b7f3
added vpts validation function
iskandari Jul 11, 2024
9c210d5
added vpts validation function
iskandari Jul 11, 2024
b6ea6a4
replaced frictionless functionality in read_vpts with readr for simpl…
iskandari Jul 11, 2024
dac43ec
Merge branch 'master' into bugfix/as_vpts
iskandari Jul 11, 2024
c08845f
remove exceptions for DBZH and remove cached schems since our vpts_sc…
iskandari Jul 11, 2024
32d589c
fixed merge conflict
iskandari Jul 11, 2024
7d054f4
use str_detect instead of grepl to match pattern
iskandari Jul 12, 2024
efd3029
simplify warning message
iskandari Jul 12, 2024
5df771c
remove superfluous functions from utils
iskandari Jul 12, 2024
7384880
added schema and fix test
iskandari Jul 12, 2024
3373155
added schema and fix test
iskandari Jul 12, 2024
7bc845c
only select radar variables by ther names or alt names in df_to_mat_list
iskandari Jul 12, 2024
5c6f395
only select radar variables by ther names or alt names in df_to_mat_list
iskandari Jul 12, 2024
7f460ff
added man file for validate_vpts
iskandari Jul 15, 2024
140c669
added man file and generated docs for validate_vpts
iskandari Jul 15, 2024
53b8b9a
made vpts_schema internal
iskandari Jul 15, 2024
44ae64c
added stringr and restored vol2birdR in DESCRIPTION
iskandari Jul 15, 2024
5f33bc1
use vpts_schema in functions with get0 which passes CRAN checks
iskandari Jul 15, 2024
d3b146f
added if requrie package name to relevant examples
iskandari Jul 15, 2024
64d2b91
move vol2birdR back to suggests
iskandari Jul 15, 2024
85c56e9
remove require vol2birdR from read_pvolfile example
iskandari Jul 15, 2024
6c9f84e
Merge branch 'master' into bugfix/as_vpts
iskandari Jul 15, 2024
4b46ce6
added keywords internal to vpts_schema
iskandari Jul 15, 2024
d5efefb
Merge branch 'bugfix/as_vpts' of github.com:adokter/bioRad into bugfi…
iskandari Jul 15, 2024
fcad0a8
fixed calculate_vp documentation error
iskandari Jul 15, 2024
5e36b08
fixed calculate_vp documentation error
iskandari Jul 16, 2024
009e99a
updated cran comments
iskandari Jul 16, 2024
b82a932
updated news
iskandari Jul 16, 2024
f77956e
implement package::function form
iskandari Jul 16, 2024
840bb8a
implement package::function form
iskandari Jul 16, 2024
124e3c8
remove export from validate_vpts
iskandari Jul 16, 2024
2010996
call data(vpts_schema) on load to make it available internally
iskandari Jul 16, 2024
39b4612
follow CRAN directions to include system package data
iskandari Jul 16, 2024
72cbddc
edit to NEWS
adokter Jul 16, 2024
5761c44
Merge branch 'master' into bugfix/as_vpts
adokter Jul 17, 2024
9934991
added validate_vpts() check in as.vpts
iskandari Jul 17, 2024
725e1e3
Merge branch 'bugfix/as_vpts' of github.com:adokter/bioRad into bugfi…
iskandari Jul 17, 2024
df5db71
added vpts_schema as R/sysdata.rda
iskandari Jul 17, 2024
93a3cb6
documented tidyverse functions and added R/sysdata.rda
iskandari Jul 17, 2024
b0c276b
aded codemeta.json
iskandari Jul 17, 2024
123a2ca
package::function notation for validate_vpts
iskandari Jul 17, 2024
9d05879
updated cran comments
iskandari Jul 17, 2024
bad4c41
added rosm.cache to gitignore
iskandari Jul 17, 2024
eebd577
changed aut email to biorad@cornell
iskandari Jul 17, 2024
8f99908
rebuilt README
iskandari Jul 17, 2024
b96c97d
regenerate codemeta
iskandari Jul 17, 2024
73671af
fixed missing package anchors and regenerated docs
iskandari Jul 17, 2024
b754064
regenerated docs
iskandari Jul 17, 2024
ac4c532
fixed missing package anchors and regenerated docs
iskandari Jul 17, 2024
42f578c
limit list_vpts_aloft example to pass CRAN check that examples must r…
iskandari Jul 18, 2024
cf64a24
regenerated docs
iskandari Jul 18, 2024
cbe8d2b
make sure R CMD CHECK passes when _R_CHECK_DEPENDS_ONLY_=true env var…
adokter Jul 20, 2024
ea66a83
Merge branch 'master' into bugfix/as_vpts
adokter Jul 20, 2024
9348925
merge master
adokter Jul 20, 2024
10b3a67
update roxygen2
adokter Jul 20, 2024
e20b7c3
rebuild readme, rebuild codemeta
adokter Jul 20, 2024
f6c11a3
check for presence of tidyselect in test-select tests
adokter Jul 22, 2024
dcafd56
check for suggested packages in vignette
adokter Jul 22, 2024
6fb7003
add new documentation file
adokter Jul 22, 2024
8773d52
fix unconditional use of map()
adokter Jul 22, 2024
5939e2f
move rmarkdown back to suggests
adokter Jul 22, 2024
c870cef
fix unconditional use of map()
adokter Jul 22, 2024
c77f719
fix unconditional use of suggested packages
adokter Jul 23, 2024
43bc308
update cran-comments
adokter Jul 23, 2024
87de862
update codemeta
adokter Jul 23, 2024
0d80327
remove two spaces
adokter Jul 28, 2024
eb5ca97
revert to renaming dbz_all to DBZH
adokter Jul 28, 2024
70df910
fix tests, fix type of gap column, simplify reading in
adokter Jul 28, 2024
4d2a4c6
bump version
adokter Jul 28, 2024
375ad2f
simplify and speed up as.vpts, retain non-standard fields in vpts object
adokter Jul 29, 2024
ec95a45
simplify and speed up as.vpts, retain non-standard fields in vpts object
adokter Jul 29, 2024
c277697
move skip_if_no_mapping test up
adokter Jul 29, 2024
63d734e
update news, write codemeta
adokter Jul 29, 2024
01ba94a
update cran-comments and news
adokter Jul 29, 2024
75787c0
prevent writing in package install space
adokter Jul 29, 2024
261a58c
regenerated codemta
iskandari Jul 29, 2024
8d75e2c
add donttest block to prevent NOTE for long runtime
adokter Jul 29, 2024
54af539
Merge branch 'bugfix/as_vpts' of https://github.com/adokter/bioRad in…
adokter Jul 29, 2024
3acb66f
remove factor type for radar
adokter Jul 29, 2024
924a018
update cran comments
adokter Jul 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,5 @@ pkgdown/*
/Meta/

# rosm cache
rosm.cache/
rosm.cache
3 changes: 0 additions & 3 deletions CRAN-SUBMISSION

This file was deleted.

12 changes: 6 additions & 6 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
Package: bioRad
Title: Biological Analysis and Visualization of Weather Radar Data
Version: 0.7.3.9000
Version: 0.8.1
Description: Extract, visualize and summarize aerial movements of birds and
insects from weather radar data. See Dokter, A. M. et al. (2018)
"bioRad: biological analysis and visualization of weather radar data" <doi:10.1111/ecog.04028>
for a software paper describing package and methodologies.
Authors@R: c(
person("Adriaan M.", "Dokter", role = c("aut", "cre"), email = "amd427@cornell.edu", comment = c(ORCID = "0000-0001-6573-066X")),
person("Adriaan M.", "Dokter", role = c("aut", "cre"), email = "biorad@cornell.edu", comment = c(ORCID = "0000-0001-6573-066X")),
person("Peter", "Desmet", role = "aut", email = "[email protected]", comment = c(ORCID = "0000-0002-8442-8025")),
person("Bart", "Kranstauber", role = "aut", email = "[email protected]", comment = c(ORCID = "0000-0001-8303-780X")),
person("Cecilia", "Nilsson", role = "aut", email = "[email protected]", comment = c(ORCID = "0000-0001-8957-4411")),
Expand All @@ -32,7 +32,6 @@ Imports:
curl,
dplyr (>= 1.1.0),
fields,
frictionless,
ggplot2,
glue,
graphics,
Expand All @@ -44,10 +43,13 @@ Imports:
readr,
rhdf5,
rlang,
sf,
sp,
stats,
stringr,
suntools,
tidyr,
tidyselect,
utils,
viridis,
viridisLite
Expand All @@ -58,14 +60,12 @@ Suggests:
prettymapr,
rmarkdown,
rosm,
sf,
testthat (>= 3.0.0),
tidyselect,
vdiffr,
vol2birdR
LazyData: true
Encoding: UTF-8
VignetteBuilder: knitr
RoxygenNote: 7.2.3
RoxygenNote: 7.3.2
Roxygen: list(markdown = TRUE)
Config/testthat/edition: 3
1 change: 0 additions & 1 deletion NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,3 @@ export(write_pvolfile)
importFrom(dplyr,"%>%")
importFrom(dplyr,.data)
importFrom(methods,as)
importFrom(stats,na.omit)
33 changes: 27 additions & 6 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,39 @@

# bioRad 0.7.3.9000
# bioRad 0.8.1

## bugfixes

* dbz_all field in VPTS CSV files is now correctly mapped to DBZH field

* non-standard data fields are now retained in vpts objects produced with as.vpts()

# bioRad 0.8.0

## New features

* ENRAM VPTS data exchange format added in package data as `vpts_schema.rda`

* VPTS files are now able to be validated with `validate_vpts()` which uses the schema to check for min/max constraint violations for specific fields, regex and datetime formatting

* speed up `integrate_to_ppi()` and `project_as_ppi()` by using native `sf` functions (#669)

* support for tidyverse select method for polar volume and polar scan objects (#668,#460)

## Bugfixes

* support for tidyverse select method for polar volume and polar scan objects (#668,#460)
* Corrected the default refractive index value used in conversion of linear reflectivity (eta) to logarithmic reflectivity (dBZ). The effect is a 7% increase in animal densities in output of functions `integrate_to_ppi()` and `read_cajun()` only (#642).

* Updated the default refractive index value used in conversion of linear reflectivity (eta) to logarithmic reflectivity (dBZ) (#642). The effect is a 7% increase in animal densities in output of functions `integrate_to_ppi()` and `read_cajun()` only.
* Fixed the handling of empty numeric vectors when plotting clutter maps (#655)

# bioRad 0.7.3
* Fixed warning when reading VPTS csv containing multiple values in `lat`, `lon`, '`rcs`' or `sd_vvp_threshold` (#651)

## New features
* Fixed enabling/disabling of `single_pol` flag in `calculate_vp()` (#646)

* Updated the s3 source bucket of `download_vpfiles()` to https://aloftdata.s3-eu-west-1.amazonaws.com (#648)

* Fixed an error in the idw method of `composite_ppi()` that emerged with the evolution of dependency package sp / deprecation of rgdal (#666)

# bioRad 0.7.3

* Replaced the `ggmap` package with `ggspatial` for map visualizations. This change was made as `ggmap` no longer provides reliable open-source basemaps without the necessity to register for an API key (#638).

Expand Down Expand Up @@ -76,7 +98,6 @@ bioRad 0.7 includes a major backend overhaul that deprecates the use of Docker.
## Deprecations



* Argument `local_install` in `calculate_vp()` and `apply_mistnet()` is now deprecated.

* Functions `check_docker()` and `update_docker()` have been deprecated.
Expand Down
2 changes: 2 additions & 0 deletions R/apply_mistnet.R
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@
#' @examples
#' \donttest{
#' # make sure you have installed the MistNet libraries and model, using:
#' if (requireNamespace("vol2birdR", quietly = TRUE)){
#' if(!vol2birdR::mistnet_exists()){
#' vol2birdR::install_mistnet()
#' vol2birdR::install_mistnet_model()
Expand Down Expand Up @@ -125,6 +126,7 @@
#' # Remove file
#' file.remove(tempfile)
#' }
#' }
apply_mistnet <- function(file, pvolfile_out, verbose = FALSE,
mount = dirname(file), load = TRUE,
mistnet_elevations = c(0.5, 1.5, 2.5, 3.5, 4.5),
Expand Down
72 changes: 42 additions & 30 deletions R/as.vpts.R
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

#' Convert a dataframe into a vpts object
#'
#' @param data a dataframe created from a VPTS CSV file
Expand All @@ -18,6 +17,8 @@ as.vpts <- function(data) {
dplyr::rename(DBZH = "dbz_all")
}

validate_vpts(data)

height <- datetime <- source_file <- radar <- NULL

# Throw error if nrows per height are not identical
Expand All @@ -35,13 +36,6 @@ as.vpts <- function(data) {
msg = "`data` must contain data of a single radar."
)

if (!exists("cached_schema")) {
# Load the schema from the data directory and cache it
iskandari marked this conversation as resolved.
Show resolved Hide resolved
cached_schema <- jsonlite::fromJSON(system.file("extdata", "vpts-csv-table-schema.json", package = "bioRad"),
simplifyDataFrame = FALSE, simplifyVector = TRUE
)
}

data <- dplyr::mutate(
data,
radar = as.factor(radar),
Expand Down Expand Up @@ -71,37 +65,55 @@ as.vpts <- function(data) {
regular <- FALSE
}

# Get attributes
radar_height <- data[["radar_height"]][1]
interval <- unique(heights[-1] - heights[-length(heights)])
wavelength <- data[["radar_wavelength"]][1]

# Check and warn for multiple values of specific attributes and return only the first values of those attributes
check_multivalue_attributes <- function(data) {
attributes <- c("radar_longitude", "radar_latitude", "rcs", "sd_vvp_threshold")
first_values <- list()
for (attr in attributes) {
if (length(unique(data[[attr]])) > 1) {
warning(paste0("multiple `", attr, "` values found, storing only first (",
as.character(data[[attr]][1]), ") as the functional attribute."))
# Get attributes
radar_height <- data[["radar_height"]][1]
interval <- unique(heights[-1] - heights[-length(heights)])
wavelength <- data[["radar_wavelength"]][1]

# Check and warn for multiple values of specific attributes and return only the first values of those attributes
check_multivalue_attributes <- function(data) {
attributes <- c("radar_longitude", "radar_latitude", "rcs", "sd_vvp_threshold")
first_values <- list()
for (attr in attributes) {
if (length(unique(data[[attr]])) > 1) {
warning(paste0("multiple ", as.character(substitute(attr))," values found, storing only first (",
as.character(data[[attr]][1]), ") as the functional attribute."))
}
first_values[[attr]] <- data[[attr]][1]
}
first_values[[attr]] <- data[[attr]][1]
return(first_values)
}
return(first_values)
}

first_values <- check_multivalue_attributes(data)

# Directly extract and assign values from the list
lon <- first_values$radar_longitude
lat <- first_values$radar_latitude
rcs <- first_values$rcs
sd_vvp_threshold <- first_values$sd_vvp_threshold

# Convert dataframe
maskvars <- c("radar", "rcs", "sd_vvp_threshold", "radar_latitude", "radar_longitude", "radar_height", "radar_wavelength", "source_file", "datetime", "height", "sunrise", "sunset", "day")

data <- df_to_mat_list(data, maskvars, cached_schema)
# column names not to store in the vpts$data slot
radvars_exclude <- c("radar","datetime","height","rcs","sd_vvp_threshold","radar_latitude","radar_longitude","radar_height","radar_wavelength")
# radvars to include in vpts$data slot
radvars <- names(data)[!names(data) %in% radvars_exclude]

# calculate number of vertical profiles present
n_vp <- nrow(data)/length(heights)

# cast data.frame to list of matrices
data_output <- lapply(radvars, function(x) matrix(data[[x]],ncol=n_vp))
names(data_output)=radvars

# List of vectors to check
vectors_to_check <- list(heights = heights, interval = interval, radar_height = radar_height, lon = lon, lat = lat)

# Identify empty vectors
empty_vectors <- names(vectors_to_check)[sapply(vectors_to_check, function(v) length(v) == 0)]

# Stop execution if any empty vectors are found
if (length(empty_vectors) > 0) {
stop("Empty vectors detected: ", paste(empty_vectors, collapse=", "))
}

# Create vpts object
output <- list(
Expand All @@ -110,7 +122,7 @@ check_multivalue_attributes <- function(data) {
height = heights,
daterange = c(min(datetime), max(datetime)),
timesteps = difftimes,
data = data,
data = data_output,
attributes = list(
where = data.frame(
interval = as.integer(interval),
Expand Down
8 changes: 6 additions & 2 deletions R/calculate_vp.R
Original file line number Diff line number Diff line change
Expand Up @@ -173,18 +173,22 @@
#' # Locate and read the polar volume example file
#' pvolfile_source <- system.file("extdata", "volume.h5", package = "bioRad")
#'
#' # Copy the file to a home directory with read/write permissions
#' # Copy the file to a temporary directory with read/write permissions
#' pvolfile <- paste0(tempdir(),"/volume.h5")
#' file.copy(pvolfile_source, pvolfile)
#'
#' # Calculate the profile
#' if (requireNamespace("vol2birdR", quietly = TRUE)) {
#' vp <- calculate_vp(pvolfile)
#'
#'
#' # Get summary info
#' vp
#'
#' # Clean up
#' file.remove(pvolfile)
#'
#' }
#'
calculate_vp <- function(file, vpfile = "", pvolfile_out = "",
autoconf = FALSE, verbose = FALSE, warnings = TRUE,
mount, sd_vvp_threshold,
Expand Down
2 changes: 2 additions & 0 deletions R/composite_ppi.R
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,10 @@
#' composite <- composite_ppi(ppis, method = "max", res=1000)
#'
#' # Plot the calculated max product on the basemap
#' if (all(sapply(c("ggspatial","prettymapr", "rosm"), requireNamespace, quietly = TRUE))) {
#' map(composite)
#' }
#' }
composite_ppi <-
function(x,
param = "all",
Expand Down
11 changes: 11 additions & 0 deletions R/data.R
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,14 @@
# example_vpts$attributes$where$lat <- 42.2
# example_vpts$attributes$where$lon <- -75.98
# save(example_vpts, file = "data/example_vpts.rda", compress = "xz")

#' ENRAM-defined VPTS schema
#'
#' A dataset containing the schema definitions for VPTS data validation.
#' @rdname vpts_schema
#' @keywords internal
#' @return A list object containing the data model for the standard VPTS exchange format.
#' @examples
#' # Reload vpts_schema from package (e.g. in case it was altered)
#' data(vpts_schema)
"vpts_schema"
2 changes: 2 additions & 0 deletions R/download_pvolfiles.R
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#' a message and a progress bar in the console indicating the download status.
#' @examples
#' # create temporary directory
#' if (requireNamespace("aws.s3", quietly = TRUE)) {
#' temp_dir <- paste0(tempdir(),"/bioRad_tmp_files")
#' dir.create(temp_dir)
#' download_pvolfiles(
Expand All @@ -32,6 +33,7 @@
#' )
#' # Clean up
#' unlink(temp_dir, recursive = TRUE)
#' }
download_pvolfiles <- function(date_min, date_max, radar,
directory = ".", overwrite = FALSE,
bucket = "noaa-nexrad-level2") {
Expand Down
1 change: 1 addition & 0 deletions R/download_vpfiles.R
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#' @export
#'
#' @seealso
#' * [read_vpts()]
#' * [select_vpfiles()]
#' * [read_vpfiles()]
#'
Expand Down
3 changes: 2 additions & 1 deletion R/hooks.R
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
.onLoad <- function(libname, pkgname) {
register_all_s3_methods() # dynamically registers non-imported pkgs (tidyverse) # nocov
}

.onAttach <- function(libname, pkgname) {
packageStartupMessage(paste("Welcome to", pkgname, "version", utils::packageVersion(pkgname)))
if (rlang::is_installed("vol2birdR")) {
if (requireNamespace("vol2birdR", quietly = TRUE)) {
packageStartupMessage(paste("using vol2birdR version ", utils::packageVersion("vol2birdR"), ifelse(vol2birdR::mistnet_exists(), " (MistNet installed)", " (MistNet not installed)"), sep = ""))
}
}
2 changes: 2 additions & 0 deletions R/integrate_to_ppi.R
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,9 @@
#' plot(ppi, param = "VID", zlim = c(0, 200))
#'
#' # Download a basemap and map the ppi
#' if (all(sapply(c("ggspatial","prettymapr", "rosm"), requireNamespace, quietly = TRUE))) {
#' map(ppi)
#' }
#'
#' # The ppi can also be projected on a user-defined raster, as follows:
#'
Expand Down
5 changes: 4 additions & 1 deletion R/list_vpts_aloft.R
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@
#' @export
#'
#' @examples
#' list_vpts_aloft(radars = "bejab")
#' \donttest{
#' if (requireNamespace("aws.s3", quietly = TRUE)) {
#' list_vpts_aloft(radars = "bejab", date_min='2018-10-01', date_max = '2018-12-31')
#' }}
list_vpts_aloft <- function(date_min = NULL,
date_max = NULL,
radars = NULL,
Expand Down
6 changes: 4 additions & 2 deletions R/map.R
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#' # Project a scan as a ppi
#' ppi <- project_as_ppi(example_scan)
#' \donttest{
#' if (all(sapply(c("ggspatial","prettymapr", "rosm"), requireNamespace, quietly = TRUE))) {
#' # Choose a basemap
#' basemap <- rosm::osm.types()[1]
#'
Expand All @@ -71,6 +72,7 @@
#' # Crop the map
#' map(ppi, map = basemap, xlim = c(12.4, 13.2), ylim = c(56, 56.5))
#' }
#' }
map <- function(x, ...) {
UseMethod("map", x)
}
Expand Down Expand Up @@ -108,7 +110,7 @@ map.ppi <- function(x, map="cartolight", param, alpha = 0.7, xlim, ylim, zlim =
}

# check that suggested dependencies are presetn
rlang::check_installed(c("ggspatial","prettymapr"),'to map ppi\'s')
rlang::check_installed(c("ggspatial","prettymapr", "rosm"),'to map ppi\'s')

assert_valid_basemap <- function(basemap) {
valid_types <- rosm::osm.types()
Expand Down Expand Up @@ -160,7 +162,7 @@ map.ppi <- function(x, map="cartolight", param, alpha = 0.7, xlim, ylim, zlim =

# convert to google earth mercator projection
data <- suppressWarnings(
as.data.frame(sp::spTransform(as(data,"SpatialPointsDataFrame"), sp::CRS("+init=epsg:3857")))
as.data.frame(sp::spTransform(methods::as(data,"SpatialPointsDataFrame"), sp::CRS("+init=epsg:3857")))
)
# bring z-values within plotting range
index <- which(data$z < zlim[1])
Expand Down
Loading
Loading