我想知道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
包具有这种功能?如果没有,那么最紧凑的方法是什么?
感谢任何输入!
答案 0 :(得分:3)
您可以使用geosphere
并计算两个坐标之间的distHaversine
:
library(geosphere)
distm(c(lon1, lat1), c(lon2, lat2), fun = distHaversine)
使用mutate
添加Step
字段
答案 1 :(得分: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”以及矢量化的Haversine函数来获取连续点之间的距离(函数“ 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
答案 2 :(得分:2)
签出: gmapdistance
注:包含起点描述的字符串或字符串向量。应该在法定人数(“”)内。如果在同一位置使用了多个单词,则应使用加号将其分开,例如“波哥大+哥伦比亚”。只要LAT-LONG格式的坐标也是有效的输入,只要它们可以被Google Maps识别即可。
https://cran.r-project.org/web/packages/gmapsdistance/gmapsdistance.pdf
函数gmapsdistance使用Google Maps Distance Matrix API来计算两个点之间的距离和时间。为了能够使用该功能,您需要一个API密钥并在Google Developers Console中启用Distance Matrix API
请注意,Google已更改其结算方式。 (喜悦)
您必须具有有效的API密钥和计费帐户才能访问我们的API。启用结算功能后,您每月将获得$ 200的Google Maps,Routes或Places免费使用权。基于当今使用我们的API的数百万用户,他们中的大多数人可以继续免费使用Google Maps Platform。拥有结算帐户有助于我们更好地了解开发人员的需求,并可以无缝扩展。
有关如何获取密钥的更多信息,请转到https://developers.google.com/maps/documentation/distancematrix/get-api-key#key
有关Google Maps Distance Matrix 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")