## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ## ----setup-------------------------------------------------------------------- library(R2camtrapdp) ## ----------------------------------------------------------------------------- data("Adep") # 設置情報の野帳(デバイス設置1件=1行) data("Aobs") # 観察情報の野帳(観察1件=1行。`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 = "音響調査の例", description = "AudioMoth 録音", # 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), ] # 音声ファイルごとに1行 media <- data.frame( mediaID = files$filename, # ファイル名をメディア識別子に 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) # 録音設定(samplingFrequency / bitDepth / channels)を 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, # 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 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 = "音響調査", samplingDesign = "systematicRandom", # captureMethod = "recordingSchedule", individualAnimals = FALSE, # observationLevel = "media") # dp$set_st() # # dp$set_taxon() # GBIF/ITIS/NCBI から taxonID。taxadb パッケージ+ネット接続が必要 # # dp$check_relations() # PK/FK。キー列が欠損なら datapackage$data$... を指す警告を出す # # 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 # acoustic_media$field("timestamp")$format # "%Y-%m-%dT%H:%M:%S.%f%z"