我有一个来自entire world的shpfile,为了与sp包兼容,我使用as_Spatial()函数对其进行了转换。
set.seed(27)
shp <- sf::st_read("earth_gadm.shp")
shape <- as_Spatial(shp)
由于我没有处理任何特定的区域,所以我将"+ proj = longlat + ellps = WGS84 + datum = WGS84" crs分配给了我的shpfile。
crs <- "+proj=longlat +ellps=WGS84 +datum=WGS84"
proj4string(shape) = crs
在Matt Strimas-Mackei workflow之后,我使用spsample()和HexPoints2SpatialPolygons()基于形状对象创建了一个六边形网格,然后将网格与多边形相交。
size <- 2.5 #2.5 degrees as i am working with a latlong projection (correct?)
hex_points <- spsample(shape, type = "hexagonal", cellsize = size)
hex_grid <- HexPoints2SpatialPolygons(hex_points, dx = size)
shape.grid <- gIntersection(shape, hex_grid, byid = T)
我在新的shapefile上绘制了一些点,并将它们覆盖到shape. grid对象上。
library(rgbif)
gbif_data <- occ_data(scientificName = 'Lestes sponsa',
hasCoordinate = TRUE, limit = 60)
gbif_data <- gbif_data$data
coords <- gbif_data[ , c("decimalLongitude", "decimalLatitude")]
coords$decimalLatitude <- as.numeric(coords$decimalLatitude)
coords$decimalLongitude <- as.numeric(coords$decimalLongitude)
coordinates(coords) <- ~decimalLongitude + decimalLatitude
coords <- data.frame(x = coords$decimalLongitude, y = coords$decimalLatitude)
coords <- SpatialPointsDataFrame(coords= coords, data = gbif_data)
proj4string(coords) = crs
x11()
plot(shape.grid, col = "grey50", bg = "light blue", axes = TRUE, cex = 20)
points(coords, col = 'blue', pch=20, cex = 0.75)
overlaid <- over(shape.grid, coords, returnList = T)
overlaid <- data.frame(matrix(unlist(overlaid), nrow=60,
byrow=TRUE),stringsAsFactors=FALSE)
plotted points
现在我正尝试从标绘了点的网格单元中提取平均生物气候变量。我还有从Wordclim下载的19.bil栅格。我想用这些栅格来提取生物气候变量。然而,我在这一步卡住了。
我试过:
bioclim_data <- extract(x=stackrasters, c(overlaid$decimalLongitude, overlaid$decimalLatitude))
但是,我不确定我是否从网格单元格中提取平均值,除此之外,上面的命令行只返回NA值。
2条答案
按热度按时间xriantvc1#
如果你想从网格单元中提取平均值,你需要使用网格单元多边形而不是点坐标。你可以简单地选择覆盖点的多边形,然后提取这些多边形的平均栅格值,而不是使用“over”。
还需要注意的是GBIF数据通常需要清理,并且您不应该将CRS分配给已经有CRS的空间对象,如GADMMap。最终您需要迁移您的空间代码,例如迁移到'terra',因为'sp'将被弃用。
8aqjt8rx2#
请原谅我只使用类似的数据集来演示工作流(gadm_410约为1.4 GB,wc2.1_30s_bio约为9.7 GB)。我也会尽可能地坚持使用
sf
和terra
:几乎完成后,您只需导入栅格数据并使用
terra::extract()
来获得所需的值:对不起,我没有真正回答你的问题,而冒昧地投影了你的网格单元格。-)