Интерполируйте положение через 5 минут после начала из точки А в точку В.

#r #sf #sp #osrm

Вопрос:

ниже приведен пример поиска маршрута, времени в пути и расстояния от «Одного Всемирного торгового центра, Нью-Йорк» до «Мэдисон-Сквер-парк, Нью-Йорк» с использованием osrm пакета в R. (Я узнал об этом из дорожной маршрутизации в R). Время в пути здесь составляет 10,37 минуты.

Вопрос: Как я могу интерполировать и найти местоположение через 5 минут.

введите описание изображения здесь

 library(sf)
library(dplyr)
library(tidygeocoder)
library(osrm)

# 1. One World Trade Center, NYC
# 2. Madison Square Park, NYC
adresses <- c("285 Fulton St, New York, NY 10007", 
            "11 Madison Ave, New York, NY 10010")

# geocode the two addresses amp; transform to {sf} data structure
data <- tidygeocoder::geo(adresses, method = "osm") %>% 
  st_as_sf(coords = c("long", "lat"), crs = 4326)

osroute <- osrm::osrmRoute(loc = data,
                           returnclass = "sf")

summary(osroute)



library(leaflet)

leaflet(data = data) %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addMarkers(label = ~address) %>% 
  addPolylines(data = osroute,
               label = "OSRM engine",
               color = "red")

 

Ответ №1:

Используйте эту osrm::osrmIsochrone() функцию, чтобы найти полигон расстояния в пять минут, а затем найдите точку, в которой маршрут пересекает полигон.

Похоже, он находится на Кларксон-стрит между Гудзоном и Вариком.

 library(sf)
library(dplyr)
library(tidygeocoder)
library(osrm)

# 1. One World Trade Center, NYC
# 2. Madison Square Park, NYC
adresses <- c("285 Fulton St, New York, NY 10007", 
              "11 Madison Ave, New York, NY 10010")

# geocode the two addresses amp; transform to {sf} data structure
data <- tidygeocoder::geo(adresses, method = "osm") %>% 
  st_as_sf(coords = c("long", "lat"), crs = 4326)

# get route from 285 fulton to 11 madison
osroute <- osrmRoute(src = data[1,], dst = data[2,], returnclass = 'sf')

# five minute isochrone from 285 fulton
five_min_isochrone <- osrmIsochrone(data[1,], breaks = 5, returnclass = 'sf')

# isochrone has to be cast to MULTILINESTRING to find intersection as a point
intersection <- five_min_isochrone %>% 
                  st_cast('MULTILINESTRING') %>%
                  st_intersection(osroute)


library(leaflet)

leaflet(data = data) %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addMarkers(label = ~address) %>% 
  addPolylines(data = osroute,
               label = "OSRM engine",
               color = "red") %>%
  addPolygons(data = five_min_isochrone) %>%
  addMarkers(data = intersection, 
             label = '5 minute distance')

 

введите описание изображения здесь

Комментарии:

1. Большое вам спасибо @mrhellmann. Но у меня более 20 000 поездок, и было бы очень дорого создавать изохроны для каждой поездки. Есть ли эффективный способ сделать это?

2. Вы можете использовать st_sample(x, type = 'regular') для выборки точек на линии, а затем найти точку, которая находится ближе всего к 5 минутам/общим минутам поездки по линии (в этом случае это будет примерно на полпути вдоль линии). Однако это предполагало бы постоянную скорость для поездки.