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

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

栅格化结果图


解决方案

问题根源

  1. 采样点格式错误:st_sample()在MULTILINESTRING上采样后返回的是一个MULTIPOINT对象,而非10个独立的POINT。后续merge()操作将每个ID绑定到同一个MULTIPOINT上,导致每个"点要素"实际包含所有采样点。
  2. 栅格化冲突处理:当多个点落入同一个栅格单元时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:05:53