mda*_*rds 0 maps r distance postal-code
我有一个数据框,df其中包含带有英国邮政编码值的多个观察值。我想创建一个新列,用于计算每个观测值 df$origin 和 df$dest 中邮政编码之间的距离。
我没有获得 Google Maps API 的资金,想知道是否可以使用PostcodeioR? 或者在 RStudio 中有替代的免费方法吗?
# MRE
origin <- c("S6 2PA", "S35 0DP", "M1 6BD", "DE55 4JF")
dest <- c("S5 7AU", "S5 7AU", "S5 7AU", "S5 7AU")
df <- tibble(origin,dest)
Run Code Online (Sandbox Code Playgroud)
优选地,所创建的距离是驾驶距离,而不是直线距离,但是我意识到这可能是不可能的。
PoscodesioR 包将查找您的邮政编码并告诉您它们的经度/纬度,因此您可以使用以下几种方法中的任何一种来获取“乌鸦”距离geosphere::distHaversine
library(tidyverse)\nlibrary(PostcodesioR)\nlibrary(geosphere)\n\norigin <- c("S6 2PA", "S35 0DP", "M1 6BD", "DE55 4JF")\ndest <- c("S5 7AU", "S5 7AU", "S5 7AU", "S5 7AU")\n\ndf <- tibble(origin, dest)\n\ndf %>%\n mutate(miles = map2(origin, dest, \n ~ distHaversine(postcode_lookup(.x)[,7:8],\n postcode_lookup(.y)[,7:8])/1609.34) |>\n unlist())\n#> # A tibble: 4 x 3\n#> origin dest distance\n#> <chr> <chr> <dbl>\n#> 1 S6 2PA S5 7AU 1.98\n#> 2 S35 0DP S5 7AU 4.63\n#> 3 M1 6BD S5 7AU 32.5 \n#> 4 DE55 4JF S5 7AU 23.0 \nRun Code Online (Sandbox Code Playgroud)\n这些在直接测量中看起来都非常准确。
\n我不知道有哪个完全免费的 API 可以测量行驶距离。获得 Google API 密钥将允许您获取行驶距离,据我所知,您每月应该能够免费获得大约 40,000 次测量。您应该能够免费查找并存储两个月内所有南约克郡邮政编码与北方综合医院之间的行车距离。根据您的项目规模,您可能根本不需要资金(尽管如果您必须测量所有 170 万个英国邮政编码与北方综合医院之间的驾驶距离,那么这将花费您大约 \xc2\xa37,000...) 。
\n编辑
\n如果您有 Google API 密钥并设置了计费,则直接使用 API 可能同样容易。如果您已使用 ggmap 注册了 API 密钥,以下函数将为您提供行驶距离和时间
\ndriving_dist <- function(origins, destinations) {\n \n do.call("rbind", Map(function(x, y) {\n \n res <- paste0("https://maps.googleapis.com/maps/api/distancematrix/json",\n "?destinations=", URLencode(x),\n "&origins=", URLencode(y),\n "&units=imperial",\n "&key=", ggmap::google_key()) |>\n httr::GET() |>\n httr::content() \n \n data.frame(distance_metres = res$rows[[1]]$elements[[1]]$distance$value,\n time_seconds = res$rows[[1]]$elements[[1]]$duration$value)\n }, origins, destinations)\n )\n}\nRun Code Online (Sandbox Code Playgroud)\n测试,我们有:
\ndf %>% mutate(driving_dist(origin, dest))\n # A tibble: 4 x 4\n#> origin dest distance_metres time_seconds\n#> <chr> <chr> <int> <int>\n#> 1 S6 2PA S5 7AU 5869 832\n#> 2 S35 0DP S5 7AU 10145 1198\n#> 3 M1 6BD S5 7AU 63816 4763\n#> 4 DE55 4JF S5 7AU 53346 2861\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |