R/geocodeAddresses.R

Defines functions geocodeAddresses

Documented in geocodeAddresses

geocodeAddresses <- function(addresses, prev.results = NULL,
                             address.components = TRUE,
                             print.progress = TRUE, pause.time = 0.02,
                             progress.save.file = NULL) {
  address.types <- c(
    "subpremise", "premise", "street_number", "route",
    "neighborhood, political",
    "political, sublocality, sublocality_level_1",
    "political, sublocality, sublocality_level_2",
    "political, sublocality, sublocality_level_3",
    "locality_political", "administrative_area_level_3, political",
    "administrative_area_level_2, political",
    "administrative_area_level_1, political", "country, political",
    "postal_code")
  if (is.null(prev.results)) {
    out <- data.frame(lon = rep(NA, length(addresses)),
                      lat = rep(NA, length(addresses)))
    if (address.components) {
      for (i in address.types) {
        out[[i]] <- NA
      }
    }
  } else {
    out <- prev.results
  }
  for (i in seq_along(addresses)) {
    if (is.na(out$lon[i])) {
      message("Geocoding location ", i, ": ", addresses[i])
      res <- tryCatch(geocodeAddress(addresses[i], pause.time = pause.time),
                      error = function(e) {
                        message("Error, sleeping 30 seconds")
                        Sys.sleep(30)
                        geocodeAddress(addresses[i], pause.time = pause.time)
                      })
      out$lon[i] <- res$crd[1]
      out$lat[i] <- res$crd[2]
      if (address.components) {
        for (j in address.types) {
          tmp <- res$address$long_name[res$address$type == j]
          out[[j]][i] <- ifelse(length(tmp) == 0, NA, tmp[1])
        }
      }
      if (!is.null(progress.save.file)) {
        saveRDS(out,
                file = paste0(gsub("\\.rds", "", progress.save.file), ".rds"))
      }
    }
  }
  return(out)
}
walshc/GoogleMapsAPI documentation built on May 3, 2019, 11:50 p.m.