Рассчитать длину шага с помощью R

#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")