#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 минутам/общим минутам поездки по линии (в этом случае это будет примерно на полпути вдоль линии). Однако это предполагало бы постоянную скорость для поездки.