You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R语言osrm包计算两点路径上出发5分钟后的插值位置

问题描述

以下是在R中使用osrm包计算从纽约世界贸易中心到纽约麦迪逊广场公园的路线、行程时间与行程距离的示例,计算得到的总行程时长为10.37分钟。需求是通过插值运算,得到从起点出发行驶5分钟后所在的具体位置。
路径示意图

原示例代码
library(sf)
library(dplyr)
library(tidygeocoder)
library(osrm)

# 1. 纽约世界贸易中心
# 2. 纽约麦迪逊广场公园
adresses <- c("285 Fulton St, New York, NY 10007", 
            "11 Madison Ave, New York, NY 10010")

# 对两个地址做地理编码,转换为sf数据格式
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引擎",
               color = "red")
实现方法

你可以使用sf包自带的线要素插值函数实现需求,具体步骤如下:

  • 计算插值比例:行驶时长/总行程时长,本场景下为5/10.37≈0.482
  • 调用st_line_interpolate_point()函数沿路线插值得到对应坐标点

补充代码如下:

# 计算插值比例
interp_ratio <- 5 / osroute$duration
# 沿路线插值得到5分钟位置点
point_5min <- st_line_interpolate_point(osroute$geometry, interp_ratio)
# 输出位置的经纬度坐标
st_coordinates(point_5min)

# 可选:在地图上标记5分钟位置
leaflet(data = data) %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addMarkers(label = ~address) %>% 
  addPolylines(data = osroute,
               label = "OSRM引擎",
               color = "red") %>%
  addMarkers(data = point_5min, label = "出发5分钟位置")

如果需要更高精度的插值,可以在调用osrmRoute时添加参数overview = "full",获取每一段路段的行驶时长,逐段累计时间后再做插值,适配路段速度不均的场景。


内容的提问来源于stack exchange,提问作者SiH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:24:02