R/parse_deg.R

Defines functions parse_deg .parse_deg clean_str_deg

Documented in parse_deg

clean_str_deg <- function(x) {
  stringr::str_replace_all(x, c(
    "˚" = "°",
    "′|ʹ" = "'",
    "″|''" = "\"",
    "E|N" = "",
    " " = ""
  )) %>% stringr::str_trim()
}

.parse_deg <- function(x) {
  fmt_num <- "(\\d+\\.?\\d*)"
  # decimal degree
  if (str_detect(x, "^\\d+(\\.\\d+)?°?$")) {
    return(as.numeric(str_replace_all(x, "[°$]", "")))
  }

  # degree, minute, second
  if (str_detect(x, glue("^\\d+°\\d+'{fmt_num}"))) {
    parts <- as.numeric(unlist(str_extract_all(x, "\\d+")))
    return(parts[1] + parts[2] / 60 + parts[3] / 3600)
  }

  # degree, minute
  if (str_detect(x, glue("^\\d+°{fmt_num}'$"))) {
    parts <- as.numeric(unlist(str_extract_all(x, "\\d+")))
    return(parts[1] + parts[2] / 60)
  }
  return(as.numeric(x))
}

#' parse_deg
#' 
#' @description
#' - `*`: zero or more
#' - `+`: one or more
#' - `?`: zero or one
#' @importFrom stringr str_detect str_replace_all str_extract_all str_trim
#' @export 
parse_deg <- function(xs) {
  sapply(xs %>% clean_str_deg(), .parse_deg) %>% setNames(NULL)
}
kongdd/Ipaper documentation built on Aug. 15, 2024, 10:24 p.m.