使用terra::rasterize对分类数据框进行栅格化

编程语言 2026-07-09

我目前正在尝试将一个包含约180,000个甲虫观测坐标的数据框转换为R中的栅格层。

我发现,当我选取一个包含10个观测值的子集时,它可以正确地栅格化,观测编号也正确:

data_frame <- data.frame(
x=c(51.83382, 51.15594, 52.34826, 52.12792, 51.82184, 51.15843, 51.15843, 51.14398, 52.34821, 57.41798),
y=c(-2.23322, -0.70075, -2.05787, -2.32637, -0.20423, -0.19886, -0.19886, -0.08219, -3.00637, -6.19696),
Species = c("Carabis.nemoralis", "Cicindela.sylvatica", "Calathus.melanocephalus","Pterostichus.madidus","Pterostichus.melanarius","Poecilus.cupreus","Nebria.brevicollis","Agonum.emarginatum","Carabus.violaceus","Harpalus.rufipes")
)

library(terra)
points1 <- sf::st_as_sf(data_frame, coords = c("x","y"), crs = 4326)
v1 <- vect(points1)
r1 <- rast(v1, res=0.1)
new_rast <- rasterize(v1,r1,"Species")
summary(new_rast)
> summary(new_rast)
                    Species    
 Calathus.melanocephalus:   1  
 Carabis.nemoralis      :   1  
 Carabus.violaceus      :   1  
 Cicindela.sylvatica    :   1  
 Harpalus.rufipes       :   1  
 (Other)                :   3  
 NA's                   :3835

然而,当我对完整的数据框执行相同的操作时,链接在此:在此查看。它会出现没有数值以及以下警告信息:

#dist_data is the above linked dataframe
points <- sf::st_as_sf(dist_data, coords = c("x","y"), crs = 4326)
v <- vect(points)
r <- rast(v, res=1)
new_ras <- terra::rasterize(v, r,"Taxon")
summary(new_ras)

summary(new_ras)
#                  category     
# Abax.parallelepipedus:     0  
# Abax.parallelus      :     0  
# Acupalpus.brunnipes  :     0  
# Acupalpus.dubius     :     0  
# Acupalpus.exiguus    :     0  
# (Other)              :     0  
# NA's                 :767391  

#1: In class(object) <- "environment" :
#  Setting class(x) to "environment" sets attribute to NULL; result #will no longer be an S4 object

我无法弄清这两个数据框之间的差异,导致它们的工作方式不同;每个物种预计会被观测到数百次,因此对任何帮助都不胜感激!

解决方案

在较大的文件中,你使用 c("x", "y") 进行地理配准,而这里应该使用 c("Longitude", "Latitude")

f <- "GB observations - GB observations.csv"
d <- read.csv(f)
# remove bad latitude value
d$Latitude[d$Latitude > 90] <- NA

# Create a SpatVector directly. Note the use of Longitude/Latitude
v2 <- vect(d, geom=c("Longitude", "Latitude"), crs = "epsg:4326")
r2 <- rast(v2, res=0.1)
r2 <- terra::rasterize(v2, r2, "Taxon")
plot(r2)

虽然这能工作,但你是在创建一个可能没有意义的分类栅格。每个单元格只有一个类别(物种),而一个单元格中可能观察到许多不同的物种。你可以通过以下方式获取每个单元格的观测次数和物种数:

obs <- terra::rasterize(v2, r2, "Taxon", fun=length)
spp <- terra::rasterize(v2, r2, "Taxon", fun=\(x) length(unique(x)))

plot(log(obs))
plot(log(spp))
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章