1

我想知道 R 中是否有计算步长的特定函数,即两个连续的 GPS 时间注册位置之间的距离(以米为单位)。

我有一个如下所示的数据集:

> head(datagps)
   Date & Time [Local]  Latitude Longitude
1: 2018-06-18 03:01:00 -2.434901  34.85359
2: 2018-06-18 03:06:00 -2.434598  34.85387
3: 2018-06-18 03:08:00 -2.434726  34.85382
4: 2018-06-18 03:12:00 -2.434816  34.85371
5: 2018-06-18 03:16:00 -2.434613  34.85372
6: 2018-06-18 03:20:00 -2.434511  34.85376

并且想创建一个列Step来执行上述操作。也许geosphere包有这样的功能?如果不是,那么最紧凑的方法是什么?

任何输入表示赞赏!

4

3 回答 3

3

您可以使用geosphere和计算distHaversine两个坐标之间的:

library(geosphere)
distm(c(lon1, lat1), c(lon2, lat2), fun = distHaversine)

用于mutate添加Step字段

于 2019-03-15T18:10:28.877 回答
3

我对https://github.com/michaelmalick/r-malick/blob/master/R/haversine.R上的 Haversine 函数进行了矢量化

haversine <- function(lon1, lat1, lon2, lat2, r = 6378137) {

    if(!is.numeric(c(lon1, lat1, lon2, lat2)))
        stop("Inputs are not numeric")

    # Convert degrees to radians
    lon1 <- lon1 * pi / 180
    lat1 <- lat1 * pi / 180
    lon2 <- lon2 * pi / 180
    lat2 <- lat2 * pi / 180

    delta.lon <- (lon2 - lon1)
    delta.lat <- (lat2 - lat1)
    a <- sin(delta.lat/2)^2 + cos(lat1) * cos(lat2) *
         sin(delta.lon/2)^2
    c <- 2 * asin(min(1,sqrt(a)))
    d <- r * c

    return(d) # Distance
}

vectorized_haversine <- Vectorize(haversine, vectorize.args = c("lon1", "lat1", "lon2", "lat2"))

接下来,我使用了 dplyr 函数 'lag' 和 'mutate',以及矢量化 hasrsine 函数来获取连续点之间的距离(函数 'tribble' 用于重新创建head(datagps))。

library(dplyr)
 tribble(
      ~`Date & Time [Local]`, ~Latitude, ~Longitude,
       "2018-06-18 03:000", -2.434901,    34.85359,
       "2018-06-18 03:06:00", -2.434598,  34.85387,
      "2018-06-18 03:08:00", -2.434726,  34.85382,
       "2018-06-18 03:12:00", -2.434816,  34.85371,
      "2018-06-18 03:16:00", -2.434613,  34.85372,
       "2018-06-18 03:20:00", -2.434511,  34.85376
    ) %>% 
      mutate(Step = 
               vectorized_haversine(Longitude, Latitude, lag(Longitude), lag(Latitude)))


  Date & Time [Local]  Latitude Longitude     Step
1   2018-06-18 03:000 -2.434901  34.85359       NA
2 2018-06-18 03:06:00 -2.434598  34.85387 45.90731
3 2018-06-18 03:08:00 -2.434726  34.85382 15.29559
4 2018-06-18 03:12:00 -2.434816  34.85371 15.81292
5 2018-06-18 03:16:00 -2.434613  34.85372 22.62521
6 2018-06-18 03:20:00 -2.434511  34.85376 12.19500
于 2019-03-15T18:47:52.687 回答
2

签出:gmapdistance

注意:包含起点描述的字符串或字符串向量。应该在引号 ("") 内。如果同一地点使用多个单词,则应使用加号分隔,例如“Bogota+Colombia”。LAT-LONG 格式的坐标也是有效的输入,只要它们可以被谷歌地图识别。

https://cran.r-project.org/web/packages/gmapsdistance/gmapsdistance.pdf

函数 gmapsdistance 使用 Google Maps Distance Matrix API 来计算两点之间的距离和时间。为了能够使用该功能,您需要一个 API 密钥并在 Google Developers Console 中启用距离矩阵 API

警告:

请注意,Google 已更改其计费方式。(喜悦)

您必须拥有有效的 API 密钥和计费帐户才能访问我们的 API。启用计费后,您每月将获得 200 美元的地图、路线或地点免费使用费。根据今天使用我们 API 的数百万用户,他们中的大多数人可以继续免费使用谷歌地图平台。拥有计费帐户有助于我们更好地了解开发人员的需求,并使您能够无缝扩展。

有关如何获取密钥的更多信息,请访问https://developers.google.com/maps/documentation/distancematrix/get-api-key#key

有关 Google 地图距离矩阵 API 的更多信息,请访问 https://developers.google.com/maps/documentation/distance-matrix/intro?hl=en

例子:

包含出发地和目的地之间的旅行时间和距离以及状态的列表

results = gmapsdistance(origin = "38.1621328+24.0029257", 
                        destination = "37.9908372+23.7383394",
                        mode = "walking")
于 2019-03-15T18:17:36.417 回答