Рассчитайте длину шага, используя R - PullRequest
1 голос
/ 15 марта 2019

Я хотел бы знать, есть ли в 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 пакет имеет такую ​​функцию? Если нет, то какой самый компактный способ сделать это?

Любой вклад приветствуется!

Ответы [ 3 ]

3 голосов
/ 15 марта 2019

Я векторизовал функцию 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 & 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
3 голосов
/ 15 марта 2019

Вы можете использовать geosphere и вычислить distHaversine между двумя координатами:

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

Используйте mutate для добавления поля Step

2 голосов
/ 15 марта 2019

Выезд: gmapdistance

Примечание: строка или вектор строк, содержащий описание начальной точки (точек).Должно быть внутри квот ("").Если для одного и того же местоположения используется более одного слова, они должны быть разделены знаком плюс, например, «Богота + Колумбия». Координаты в формате LAT-LONG также являются действительными данными, если их можно определить с помощью Google Maps.

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

Функция gmapsdistance использует Google Matrix Distance Matrix API для вычисления расстояния и времени между двумя точками.Чтобы использовать эту функцию, вам потребуется ключ API и включить API матрицы расстояний в консоли разработчиков Google

Предупреждение:

Обратите внимание, что Google изменил свою методику выставления счетов.(Радость)

Вы должны иметь действительный ключ API и платежный аккаунт для доступа к нашим API.Когда вы включите биллинг, вы будете получать бесплатное пользование $ 200 каждый месяц для Карт, Маршрутов или Мест.Судя по миллионам пользователей, использующих наши API сегодня, большинство из них могут продолжать пользоваться Google Maps Platform бесплатно с этим кредитом.Наличие платежного аккаунта помогает нам лучше понять потребности наших разработчиков и позволяет легко масштабировать.

Для получения дополнительной информации о том, как получить ключ, перейдите по ссылке https://developers.google.com/maps/documentation/distancematrix/get-api-key#key

Для получения дополнительной информации об API Карт Google Maps Matrix перейдите на 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...