在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
相关产品推荐
相关产品推荐

