Terra包rasterize函数异常:点ID值丢失与重复问题求助
问题:Terra栅格化带唯一ID的点时出现ID重复/丢失
我正尝试在多边形上生成带有唯一ID编号的点,转换为栅格后用于Circuitscape分析。但使用Terra包的rasterize()函数处理点值时,频繁出现ID重复或丢失的情况,相关代码及运行结果如下:
初始代码
library(terra) library(sf) # 创建基础栅格 RASTER <- rast(nrow=10, ncol=10, ext=c(0, 100, 0,100), crs= "EPSG:27700", vals=1) # 创建矢量范围 VECT <- vect(ext(0, 100, 0,100), crs="epsg:27700") # 转换为SF对象并转为多线 POLYGON <- st_as_sf(VECT) POLYGON <- st_cast(POLYGON, "MULTILINESTRING") # 采样点 POLYGON.NODES <- st_sample(POLYGON, 10, type="regular") # 生成ID序列 NODES.NUMBERS <- as.numeric(seq(from = 1, to = 10, by = 1)) # 合并点与ID POLYGON.NODES <- merge(POLYGON.NODES, NODES.NUMBERS) # 转为SF再转SpatVector POLYGON.NODES <- st_sf(POLYGON.NODES) POLYGON.NODES <- vect(POLYGON.NODES)
栅格化代码及结果
# 栅格化点 POLYGON.NODES.RASTER <- rasterize(POLYGON.NODES, RASTER, "y") # 查看栅格信息 POLYGON.NODES.RASTER # class : SpatRaster # dimensions : 10, 10, 1 (nrow, ncol, nlyr) # resolution : 10, 10 (x, y) # extent : 0, 100, 0, 100 (xmin, xmax, ymin, ymax) # coord. ref. : OSGB36 / British National Grid (EPSG:27700) # source(s) : memory # name : last # min value : 1 # max value : 10 # 统计值频率,发现ID丢失/重复 freq(POLYGON.NODES.RASTER) # layer value count #1 1 1 1 #2 1 3 1 #3 1 5 2 #4 1 6 1 #5 1 7 2 #6 1 8 2 #7 1 10 1

解决方案
问题根源
- 采样点格式错误:
st_sample()在MULTILINESTRING上采样后返回的是一个MULTIPOINT对象,而非10个独立的POINT。后续merge()操作将每个ID绑定到同一个MULTIPOINT上,导致每个"点要素"实际包含所有采样点。 - 栅格化冲突处理:当多个点落入同一个栅格单元时,
rasterize()默认使用last()函数保留最后一个点的ID,造成ID覆盖、重复或丢失。
修正步骤
1. 生成独立的单点要素
将采样得到的MULTIPOINT拆分为单个POINT,并正确分配ID:
library(terra) library(sf) # 重建基础栅格和矢量 RASTER <- rast(nrow=10, ncol=10, ext=c(0, 100, 0,100), crs= "EPSG:27700", vals=1) VECT <- vect(ext(0, 100, 0,100), crs="epsg:27700") # 转为SF多边形(无需转成多线) POLYGON <- st_as_sf(VECT) # 采样并直接拆分为单个POINT POLYGON.NODES <- st_cast(st_sample(POLYGON, 10, type="regular"), "POINT") # 给每个点添加唯一ID列 POLYGON.NODES <- st_sf(id = seq_along(POLYGON.NODES), geometry = POLYGON.NODES) # 转为SpatVector POLYGON.NODES <- vect(POLYGON.NODES)
2. 栅格化时确保ID唯一
如果仍存在多个点落入同一栅格的情况,可指定fun参数确保每个栅格只保留一个唯一ID(比如取第一个):
# 栅格化,使用first()确保每个单元只保留第一个点的ID POLYGON.NODES.RASTER <- rasterize(POLYGON.NODES, RASTER, field = "id", fun = "first") # 查看结果 freq(POLYGON.NODES.RASTER)
3. 验证采样点分布(可选)
提前检查采样点是否落在同一栅格单元:
# 将点与栅格单元关联,查看每个单元的点数量 cell_ids <- cells(RASTER, POLYGON.NODES) table(cell_ids[,1])
内容的提问来源于stack exchange,提问作者CARLOS_BEDSON
相关产品推荐
相关产品推荐

