在 R 中获取 2 个英国邮政编码之间的距离

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)

优选地,所创建的距离是驾驶距离,而不是直线距离,但是我意识到这可能是不可能的。

All*_*ron 5

PoscodesioR 包将查找您的邮政编码并告诉您它们的经度/纬度,因此您可以使用以下几种方法中的任何一种来获取“乌鸦”距离geosphere::distHaversine

\n
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 \n
Run Code Online (Sandbox Code Playgroud)\n

这些在直接测量中看起来都非常准确。

\n

我不知道有哪个完全免费的 API 可以测量行驶距离。获得 Google API 密钥将允许您获取行驶距离,据我所知,您每月应该能够免费获得大约 40,000 次测量。您应该能够免费查找并存储两个月内所有南约克郡邮政编码与北方综合医院之间的行车距离。根据您的项目规模,您可能根本不需要资金(尽管如果您必须测量所有 170 万个英国邮政编码与北方综合医院之间的驾驶距离,那么这将花费您大约 \xc2\xa37,000...) 。

\n
\n

编辑

\n

如果您有 Google API 密钥并设置了计费,则直接使用 API 可能同样容易。如果您已使用 ggmap 注册了 API 密钥,以下函数将为您提供行驶距离和时间

\n
driving_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}\n
Run Code Online (Sandbox Code Playgroud)\n

测试,我们有:

\n
df %>% 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\n
Run Code Online (Sandbox Code Playgroud)\n