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

在R中无法用purrr::map将多个sfc_POINT传入osrmIsochrone函数

问题解决:用purrr批量生成osrm等时线报错的修复方案

核心原因

当你用map遍历sfc_POINT类型的geometry列时,map会把每个元素拆成单个的sfg_POINT对象(即单个POINT几何实例),而osrmIsochrone的loc参数要求的是sfc_POINT、sf对象、坐标矩阵/数据框这类集合类型,而非单个sfg对象——这就是报错的根源。而你单独传入一行时,该行的geometry是长度为1的sfc_POINT,符合参数要求,所以能正常运行。

修复方案

方案1:在map中把单个sfg包装成sfc

修改map内部的调用,用st_sfc()把遍历到的单个POINT对象转换成sfc类型:

mtc_iso <- major_trauma_centres %>%
  mutate(iso = map(geometry,
                   ~osrmIsochrone(loc = st_sfc(.),
                                  breaks = seq(0, 150, by = 30),
                                  returnclass = "sf"))) %>%
  st_drop_geometry() %>%
  unnest(iso) %>%
  st_set_geometry("geometry") %>%
  st_transform(crs = 27700)

方案2:用rowwise按行处理

改用rowwise()让代码按行运行,此时每行的geometry是长度为1的sfc_POINT,直接满足osrmIsochrone的参数要求:

mtc_iso <- major_trauma_centres %>%
  rowwise() %>%
  mutate(iso = list(osrmIsochrone(loc = geometry,
                                  breaks = seq(0, 150, by = 30),
                                  returnclass = "sf"))) %>%
  ungroup() %>%
  st_drop_geometry() %>%
  unnest(iso) %>%
  st_set_geometry("geometry") %>%
  st_transform(crs = 27700)

验证提示

你可以先测试单个sfg转sfc的效果:

# 取第一个几何元素(sfg)
single_sfg <- major_trauma_centres$geometry[1]
# 转成sfc
single_sfc <- st_sfc(single_sfg)
# 检查类型
class(single_sfc) # 应返回"sfc_POINT" "sfc"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:42:41