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

使用stars::st_extract()遇单位转换错误,如何提取时间轴岩心样本?

解决stars包中使用坐标矩阵提取时间维度岩心样本的问题

背景

我使用stars包加载NetCDS对象创建了一个3D数据立方体,该立方体包含(x; y)索引的地理2D网格,以及代表时间的第三维度。我的目标是从存储在二维矩阵中的一组(x; y)坐标提取时间维度的岩心样本(core samples)。stars::st_extract()函数及其at参数似乎是合适的工具,官方文档对该参数的说明如下:

at
为sf或sfc类几何对象、每行存储坐标点的两列矩阵(用于指定提取x值的位置),或是包含几何和时间维度的stars对象(矢量数据立方体)

问题

当我在带时间维度的对象上使用at参数传入二维坐标矩阵时,出现如下错误:

24 error(s) in InterpolateAtPoint()
24 error(s) in InterpolateAtPoint()
Error:
! cannot convert C into mm/m

使用stars包自带的bcsd_obs数据集可复现该问题:

library(stars)
# 存储x ; y坐标的两列矩阵
pnt_mat = st_coordinates(st_sample(st_as_sfc(st_bbox(bcsd_obs)), 10))

st_extract(bcsd_obs, at = pnt_mat)
#> 24 error(s) in InterpolateAtPoint()
#> 24 error(s) in InterpolateAtPoint()
#> Error:
#> ! cannot convert C into mm/m

解决方案

这个错误源于st_extract处理带单位的多维数据时,单纯的坐标矩阵缺少坐标系元数据,引发单位转换冲突。只需将坐标矩阵转换为sf/sfc几何对象,即可正确提取每个坐标点对应的时间序列岩心样本:

方法1:直接生成sfc对象

library(stars)
library(sf)

# 生成坐标点并转为sfc格式
pnt_sfc = st_as_sfc(st_sample(st_as_sfc(st_bbox(bcsd_obs)), 10))

# 提取时间维度岩心样本
result = st_extract(bcsd_obs, at = pnt_sfc)

# 查看结果:每个点对应一条完整的时间序列
print(result)

方法2:将现有矩阵转为sf对象

如果已经有现成的坐标矩阵,可将其转换为sf点对象后传入:

library(stars)
library(sf)

# 存储x ; y坐标的两列矩阵
pnt_mat = st_coordinates(st_sample(st_as_sfc(st_bbox(bcsd_obs)), 10))

# 转为sf对象,指定与原数据集一致的坐标系
pnt_sf = st_as_sf(data.frame(pnt_mat), coords = c("X", "Y"), crs = st_crs(bcsd_obs))

# 提取样本
result = st_extract(bcsd_obs, at = pnt_sf)

原理说明

sf/sfc对象会携带完整的坐标系信息,能与原stars数据集的坐标系精准匹配,避免单位转换时的冲突;而单纯的坐标矩阵仅包含数值,缺少元数据支撑,导致函数无法正确解析维度单位,进而报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 05:33:10