Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

68 rindas
1.6KB

  1. prepare_addresses_lookup_db <- function(
  2. addresses,
  3. path_address_db = "../data-prep/address_lookup.sqlite"
  4. ) {
  5. if (!fs::file_exists(path_address_db)) {
  6. prepare_addresses_create_db(path_address_db)
  7. }
  8. con <- DBI::dbConnect(RSQLite::SQLite(), path_address_db)
  9. withr::defer(DBI::dbDisconnect(con))
  10. db <- dplyr::tbl(con, "resolved")
  11. seen <- db |> dplyr::pull(address)
  12. if (length(seen)) {
  13. addresses <- setdiff(trimws(addresses), seen)
  14. }
  15. if (!length(addresses)) {
  16. cli::cli_alert_success("All addresses have been geocoded")
  17. return(path_address_db)
  18. }
  19. cli::cli_inform("Geocoding {length(addresses)} addresses")
  20. blocks <- seq(1, length(addresses), by = 5000L)
  21. if (blocks[length(blocks)] != length(addresses)) {
  22. blocks <- c(blocks, length(addresses) + 1L)
  23. }
  24. blocks <- blocks - 1L
  25. for (i in seq_along(blocks)[-1]) {
  26. start <- blocks[i - 1] + 1
  27. end <- blocks[i]
  28. resolved <-
  29. tidygeocoder::geo(
  30. addresses[start:end],
  31. method = "census",
  32. full_results = TRUE
  33. ) |>
  34. dplyr::select(-input_address)
  35. dplyr::rows_upsert(db, resolved, by = "address", in_place = TRUE, copy = TRUE)
  36. }
  37. return(path_address_db)
  38. }
  39. prepare_addresses_create_db <- function(path_address_db) {
  40. sql <- "CREATE TABLE `resolved` (
  41. `address` TEXT UNIQUE,
  42. `lat` REAL,
  43. `long` REAL,
  44. `id` INTEGER,
  45. `match_indicator` TEXT,
  46. `match_type` TEXT,
  47. `matched_address` TEXT,
  48. `tiger_line_id` INTEGER,
  49. `tiger_side` TEXT
  50. )"
  51. con <- DBI::dbConnect(RSQLite::SQLite(), path_address_db)
  52. DBI::dbExecute(con, sql)
  53. DBI::dbDisconnect(con)
  54. invisible(path_address_db)
  55. }