我希望计算跨纬度的多个栅格(~110 公里乘 20 公里)的面积(以 m^2 为单位)。我无法就最佳方式达成一致,以处理经度与纬度之间关系的变化。我发现的三种不同方法包括将 raster::area
函数应用于未投影的栅格以计算平均像元面积,另一种将 raster::area
函数应用于从具有 +proj=eqearth
投影的栅格导出的多边形,最后将 rgeos:::gArea
函数应用于从具有 +proj=eqearth
投影的栅格导出的多边形。我没有得到类似的结果。我在下面提供了一些代码。最好的技术是什么?提前致谢!
library(raster)
library(rgeos)
library(sp)
library(rgdal)
#generate a polygon to start off
#coordinates for outside of donut polygon
outer <- Polygon(rbind(c(-15.5376528679349, 79.4881322107174), c(-7.48352810724904, 79.908837268938), c(-6.66906605279766, 78.6475974600555), c(-15.4471570841069, 78.7892258712421), c(-15.5376528679349, 79.4881322107174)))
#coordinates for inside of donut polygon
inner <- Polygon(rbind(c(-13.6190362010361, 79.3320228496385), c(-13.7164252183978,79.039680481742), c(-9.04175238503622, 79.039680481742), c(-9.23653041975962, 79.3859727584367), c(-13.6190362010361, 79.3320228496385)), hole = T)
#create polygon from coordinates
h1 <- Polygons(list(outer, inner), "donut1")
# create spatial polygons object
onedonut <- SpatialPolygons(list(h1))
#equal area projection
projection(onedonut) <- CRS("+proj=eqearth")
Convert polygon to raster
r <- raster(ncol=100, nrow=100)
extent(r) <- extent(onedonut)
onedonut.raster <- rasterize(onedonut, r)
#Calculate area using raster::area on non-projected raster
#raster area calculation
#get sizes of all cells in raster
cell_size_raster<-area(onedonut.raster, na.rm=TRUE, weights=FALSE)
#delete NAs from vector of all raster cells
cell_size_raster<-cell_size_raster[!is.na(onedonut.raster)]
#compute area of all cells
segment_area_raster <-length(cell_size_raster)*median(cell_size_raster)
#Calculating area using raster::area on projected shapefile
cell_size_sp<-area(onedonut, na.rm=TRUE, weights=FALSE)
#compute area [km2] of all polygons in shape file
segment_area_equalarea <-length(cell_size_sp)*median(cell_size_sp)
#Calculate area using rgeos::gArea on projected shapefile
rgeos_shapefile_area <- gArea(onedonut)
#Are these values close?
segment_area_raster
segment_area_equalarea
rgeos_shapefile_area
#The values are not the same