#r #gps #geosphere
#r #gps #геосфера
Вопрос:
Я хотел бы знать, есть ли в R конкретная функция, которая вычисляет длину шага как расстояние (в метрах) между двумя последовательными местоположениями, зарегистрированными во времени GPS.
У меня есть набор данных, который выглядит следующим образом:
> head(datagps)
Date amp; 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
в пакете есть такая функция? Если нет, то какой был бы наиболее компактный способ сделать это?
Приветствуется любой вклад!
Ответ №1:
Вы можете использовать geosphere
и вычислять distHaversine
расстояние между двумя координатами:
library(geosphere)
distm(c(lon1, lat1), c(lon2, lat2), fun = distHaversine)
Используйте mutate
для добавления Step
поля
Комментарии:
1. Спасибо за ваш ответ. При использовании distm() как я могу указать аргументы c () в соответствии с моим синтаксисом в post? Я использую следующее, но я довольно новичок в R, поэтому я совершенно не уверен:
> datagps$Step<-distm(c(datagps$Longitude, datagps$Latitude), c(datagps$Longitude 1, datagps$Latitude 1), fun = distHaversine) Error in .pointsToMatrix(x) : Wrong length for a vector, should be 2
Ответ №2:
Я векторизовал функцию Haversine, найденную в https://github.com/michaelmalick/r-malick/blob/master/R/haversine.R
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 amp; 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 amp; 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
Комментарии:
1. Я использовал ваш скрипт, но получаю следующую ошибку:
> vectorized_haversine <- Vectorize(haversine, vectorize.args = c("lon1", "lat1", "lon2", "lat2")) > mutate(datagps$Step = Error: unexpected '=' in "mutate(datagps$Step =" > vectorized_haversine(datagps$Longitude, datagps$Latitude, lag(datagps$Longitude), lag(datagps$Latitude))) Error: unexpected ')' in " vectorized_haversine(datagps$Longitude, datagps$Latitude, lag(datagps$Longitude), lag(datagps$Latitude)))"
Я пишу скрипт с неправильным синтаксисом или есть что-то еще?2. Я не совсем уверен. Опубликованный мной код работает для меня. Вы изменили
Step =
наdatagps$Step =
внутри функции mutate? Если это так, просто используйтеStep =
. Попробуйте:datagps_with_steps <- datagps %>% mutate(Step = vectorized_haversine(Longitude, Latitude, lag(Longitude), lag(Latitude)))
Ответ №3:
Проверьте: gmapdistance
Примечание: Строка или вектор строк, содержащий описание начальной точки (ов). Должно быть внутри quoutes («»). Если используется более одного слова для обозначения одного и того же местоположения, они должны быть разделены знаком плюс, например, «Богота Колумбия». Координаты в формате LAT-LONG также являются допустимыми входными данными, если они могут быть идентифицированы с помощью Google Maps.
https://cran.r-project.org/web/packages/gmapsdistance/gmapsdistance.pdf
Функция gmapsdistance использует API Матрицы расстояний Google Maps для вычисления расстояния (расстояний) и времени (ов) между двумя точками. Для того, чтобы иметь возможность использовать эту функцию, вам понадобится ключ API и включить API матрицы расстояний в консоли разработчиков Google
Предостережение:
Обратите внимание, что Google изменил свои методы выставления счетов. (Радость)
Для доступа к нашим API у вас должны быть действующий ключ API и учетная запись для выставления счетов. Когда вы включите выставление счетов, вы будете получать 200 долларов США бесплатно каждый месяц за пользование картами, маршрутами или местами. Учитывая, что миллионы пользователей сегодня используют наши API, большинство из них могут продолжать пользоваться платформой Google Maps бесплатно с помощью этого кредита. Наличие учетной записи для выставления счетов помогает нам лучше понимать потребности наших разработчиков и позволяет легко масштабировать.
Для получения дополнительной информации о том, как получить ключ, перейдите по https://developers.google.com/maps/documentation/distancematrix/get-api-key#key
Для получения дополнительной информации об API матрицы расстояний Google Maps перейдите на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")