## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ## ----setup-------------------------------------------------------------------- library(R2camtrapdp) ## ----------------------------------------------------------------------------- data("Adep") # deployment field-notebook (one row per device deployment) data("Aobs") # observation field-notebook (one row per observation; has `filename`) str(Adep, vec.len = 2) str(Aobs, vec.len = 2) ## ----eval = FALSE------------------------------------------------------------- # ba <- "https://raw.githubusercontent.com/camera-traps/bioacoustics/main/camtrap-dp/1.0.2/%s" # # dp <- R6_CamtrapDP$new(version = "1.0.2", # title = "Acoustic survey example", description = "AudioMoth recordings", # id = "https://example.org/dataset/acoustic-1") # # dp$set_properties( # version = "1.0.2", # profile = sprintf(ba, "camtrap-dp-profile-acoustic.json"), # schema_urls = list( # deployments = sprintf(ba, "deployments-table-schema-acoustic.json"), # media = sprintf(ba, "media-table-schema-acoustic.json"), # observations = sprintf(ba, "observations-table-schema-acoustic.json"))) ## ----------------------------------------------------------------------------- deployments <- data.frame( deploymentID = Adep$deploymentID, latitude = Adep$latitude, longitude = Adep$longitude, locationID = Adep$locationID, deploymentStart = as.POSIXct(paste(Adep$startDate, Adep$startTime), tz = "Asia/Tokyo"), deploymentEnd = as.POSIXct(paste(Adep$endDate, Adep$endTime), tz = "Asia/Tokyo"), deviceID = Adep$deviceID, deviceModel = Adep$deviceModel, setupBy = Adep$setupBy, stringsAsFactors = FALSE) ## ----eval = FALSE------------------------------------------------------------- # dp$set_deployments(deployments) ## ----------------------------------------------------------------------------- files <- Aobs[!duplicated(Aobs$filename), ] # one row per audio file media <- data.frame( mediaID = files$filename, # the file name is the media identifier deploymentID = files$deploymentID, timestamp = as.POSIXct(paste(files$date, files$time), tz = "Asia/Tokyo"), filePath = file.path("audio", files$filename), filePublic = TRUE, fileMediatype = paste0("audio/", tolower(tools::file_ext(files$filename))), # "audio/wav" duration = files$duration, stringsAsFactors = FALSE) # add device recording settings (samplingFrequency / bitDepth / channels) from Adep media <- merge(media, Adep[, c("deploymentID", "samplingFrequency", "bitDepth", "channels")], by = "deploymentID", all.x = TRUE) head(media) ## ----eval = FALSE------------------------------------------------------------- # dp$set_media(media) ## ----------------------------------------------------------------------------- observations <- data.frame( observationID = paste(Aobs$deploymentID, Aobs$eventID, Aobs$obsID, sep = "_"), deploymentID = Aobs$deploymentID, mediaID = Aobs$filename, # link to media (mediaID = filename) eventStart = as.POSIXct(Aobs$eventStart, tz = "Asia/Tokyo"), eventEnd = as.POSIXct(Aobs$eventEnd, tz = "Asia/Tokyo"), observationLevel = "media", observationType = ifelse(Aobs$object == "none", "blank", ifelse(Aobs$object == "hito", "human", "animal")), scientificName = ifelse(is.na(Aobs$genus), Aobs$class, paste(Aobs$genus, Aobs$species)), count = Aobs$individualCount, # NA here (not counted from audio) frequencyLow = Aobs$frequencyLow, frequencyHigh = Aobs$frequencyHigh, stringsAsFactors = FALSE) ## ----eval = FALSE------------------------------------------------------------- # dp$set_observations(observations) ## ----eval = FALSE------------------------------------------------------------- # dp$add_contributors(data.frame(title = "Jane Doe", role = "contact", # organization = "NIES", stringsAsFactors = FALSE)) # dp$add_license(name = "CC0-1.0", scope = "data") # dp$add_license(name = "CC-BY-4.0", scope = "media") # dp$set_project(title = "Acoustic survey", samplingDesign = "systematicRandom", # captureMethod = "recordingSchedule", individualAnimals = FALSE, # observationLevel = "media") # dp$set_st() # # dp$set_taxon() # taxonID from GBIF/ITIS/NCBI; requires the taxadb package + internet # # dp$check_relations() # PK/FK; warns and points at datapackage$data$... if a key is missing # # path <- file.path(tempdir(), "acoustic-package") # dp$out_camtrapdp(write = TRUE, directory = path) # # issues <- dp$validate_frictionless(directory = path, python = "python") # pip install frictionless # ctdp_is_valid(issues) ## ----eval = FALSE------------------------------------------------------------- # ctdp_validate_frictionless("path/to/existing/acoustic-package", python = "python") ## ----eval = FALSE------------------------------------------------------------- # ba <- "https://raw.githubusercontent.com/camera-traps/bioacoustics/main/camtrap-dp/1.0.2/%s" # acoustic_media <- TableSchema$new( # "media", version = "1.0.2", # url_template = sprintf(ba, "media-table-schema-acoustic.json")) # # acoustic_media$field_names() # acoustic_media$requirements() # type / format / required / enum per field # acoustic_media$field("timestamp")$format # "%Y-%m-%dT%H:%M:%S.%f%z"