R语言中非等间隔经纬度点数据框转栅格无插值实现及报错咨询
不规则经纬度点构建栅格报错解决方案
报错原因
你运行代码时触发的报错:
Error in points2grid(points, tolerance, round) : dimension 1 : coordinate intervals are not constant
中文含义为:执行points2grid函数(传入点、容差、取整参数)时出错:第1维度的坐标间隔不固定。
该报错的核心逻辑是sp包的gridded()函数仅支持规则等间隔排列的格网点转换,要求经度、纬度各自的坐标取值间隔完全一致,你的原始数据是不规则间隔提取的经纬度点,天然不满足该前提,因此调用失败。
无插值保留原始数值的解决方案
你要求完全保留原始数值、不做插值,因此不能做等间隔重采样,可选择以下两种适配不规则网格的实现方案:
方案1:使用stars包构建原生不规则星格(推荐)
stars包原生支持不规则网格存储,不需要强制坐标等间隔,代码如下:
# 加载依赖包 library(sf) library(stars) # 将dataframe转为sf空间点对象,crs参数填写你数据对应的坐标系,示例为WGS84经纬度坐标系 df_sf <- st_as_sf(df, coords = c("lon", "lat"), crs = 4326) # 直接转为不规则网格对象,完全保留原始点的坐标和属性数值 df_irregular_grid <- st_as_stars(df_sf, dims = c("lon", "lat"))
方案2:手动分配网格索引适配sp类规则
如果需要兼容sp类的后续操作,可以给经纬度分配自定义索引,用索引作为网格维度避免等间隔校验:
library(sp) # 对经度、纬度分别去重排序,匹配每个点对应的索引值 unique_lon <- sort(unique(df$lon)) unique_lat <- sort(unique(df$lat)) df$lon_index <- match(df$lon, unique_lon) df$lat_index <- match(df$lat, unique_lat) # 用索引作为坐标维度,满足gridded函数的等间隔要求 spg <- df coordinates(spg) <- ~ lon_index + lat_index gridded(spg) <- TRUE # 给网格对象挂载原始经纬度映射,后续使用时可直接对应真实坐标 spg@grid@cellcentre.offset <- c(min(unique_lon), min(unique_lat)) spg@grid@cellsize <- c(NA, NA) # 标记为非等间隔网格,避免后续误判为规则格网
注意事项
- 后续如果需要做网格运算,优先使用stars/terra包,二者原生支持不规则网格操作,不需要强制转换为等间隔规则栅格
- 不要为了适配
gridded()的要求对原始点做插值重采样,会破坏你保留原始数值的需求
内容的提问来源于stack exchange,提问作者Dipu
相关产品推荐
相关产品推荐

