如何修改范围坐标系以匹配栅格?优化R语言栅格处理效率
解决栅格投影速度过慢的问题
你的思路完全正确——不要投影超大栅格,转而把裁剪范围转换为栅格的坐标系,这样能大幅提升效率。原代码里的project(occurrence_raster, crs(region_extent))要处理5630×13511×52的栅格数据,速度慢是必然的,而转换一个小范围的坐标系只需要几毫秒。
具体修改步骤:
- 给你的经纬度范围指定原始坐标系(WGS84,EPSG:4326),因为
ext()对象本身不带坐标系信息; - 将这个范围转换为栅格使用的正弦投影(
+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +R=6371007.181 +units=m +no_defs); - 用转换后的范围直接裁剪原栅格,跳过整个栅格的投影步骤。
修改后的完整代码:
library(ebirdst) library(raster) library(sf) library(terra) # 指定参数 species = "American Robin" # 经纬度范围(WGS84坐标系) region_extent <- ext(-76.353957, -75.246633, 44.965633, 45.536983) # 获取 occurrence 数据 ebirdst_download_status(species, download_abundance = FALSE, download_occurrence = TRUE, force = FALSE) occurrence_raster <- load_raster(species, product=c("occurrence")) # 关键修改:转换范围坐标系,而非栅格 # 1. 将ext转为带WGS84坐标系的SpatVector region_sf <- as.polygons(region_extent) crs(region_sf) <- "EPSG:4326" # 2. 投影到栅格的正弦坐标系 region_sf_proj <- project(region_sf, crs(occurrence_raster)) # 3. 转为ext对象用于裁剪 region_extent_proj <- ext(region_sf_proj) # 直接裁剪原栅格 cropped_raster <- crop(occurrence_raster, region_extent_proj)
为什么这样更快?
- 原操作是对整个超大栅格做投影,需要重新计算每个像素的位置和值;
- 修改后只对一个小范围的多边形做坐标转换,计算量可以忽略,之后直接裁剪原栅格,完全避免了大规模投影运算。
内容的提问来源于stack exchange,提问作者Jan Huus
相关产品推荐
相关产品推荐

