如何在R中结合Shapefile计算栅格地图分省份阴影区域面积?
分省份计算Maxent适宜区面积的R代码方案
我来帮你搞定分省份统计作物适宜面积的问题!结合你现有的代码,我整理了一套完整的实现步骤,核心思路是通过矢量-栅格匹配 + 分区统计来完成,具体如下:
步骤1:加载所需工具包
首先确保你安装了处理栅格和矢量数据的包,推荐用sf来处理Shapefile(比旧的sp包更灵活):
# 安装包(如果没装过的话) install.packages(c("raster", "sf")) # 加载包 library(raster) library(sf)
步骤2:读取并预处理数据
先把你的Maxent预测栅格和省级Shapefile读进来,同时确保两者坐标系完全一致(这是不出错的关键!):
# 1. 读取你的Maxent适宜区栅格(假设你已经加载了pred_me2) # 你的原有筛选代码:保留中间适宜区(0.33 < 值 <= 0.66) pred_me2[pred_me2 <= 0.33] <- NA pred_me2[pred_me2 > 0.66] <- NA # 2. 读取省级行政区划Shapefile,替换成你的文件路径 prov_shp <- st_read("你的省级行政区划文件.shp") # 3. 检查并统一投影 # 查看两者的坐标系 cat("栅格投影:", crs(pred_me2), "\n") cat("矢量投影:", st_crs(prov_shp), "\n") # 如果不一致,把矢量数据转成栅格的投影 prov_shp <- st_transform(prov_shp, crs = crs(pred_me2))
步骤3:分省份计算适宜面积
这里提供两种方法,你可以根据需求选择:
方法一:精准计算(推荐,适配细胞面积差异)
如果你的栅格用的是地理坐标系(比如WGS84),不同纬度的细胞面积会有差异,这种方法直接计算每个适宜细胞的面积总和,结果更精准:
# 创建一个存储每个细胞面积的栅格(单位:平方米) area_raster <- area(pred_me2) # 只保留适宜区的面积,非适宜区设为NA area_raster[is.na(pred_me2)] <- NA # 提取每个省份范围内的适宜面积总和 prov_suitable_area <- extract(area_raster, prov_shp, fun = sum, na.rm = TRUE) # 整理结果:转成平方公里(除以1e6),并和省份名称绑定 prov_area_result <- data.frame( 省份名称 = prov_shp$NAME, # 替换成你Shapefile中存储省份名称的列名,比如"PROV_NAME" 适宜面积_平方公里 = prov_suitable_area / 1000000 ) # 查看结果 print(prov_area_result)
方法二:简化计算(假设细胞面积均匀)
如果你的栅格细胞面积差异很小(比如用了等面积投影),可以用你原有代码的思路,先统计适宜细胞数再乘以平均细胞面积:
# 统计每个省份内的适宜细胞数量 prov_suitable_cells <- extract(pred_me2, prov_shp, fun = function(x) sum(!is.na(x)), na.rm = TRUE) # 计算平均细胞面积(复用你的代码) cell_size <- area(pred_me2, na.rm = TRUE, weights = FALSE) avg_cell_size <- median(cell_size[!is.na(cell_size)]) # 计算每个省份的适宜面积(转成平方公里) prov_area_result <- data.frame( 省份名称 = prov_shp$NAME, 适宜面积_平方公里 = prov_suitable_cells * avg_cell_size / 1000000 ) # 查看结果 print(prov_area_result)
小提示
- 如果你用的是旧版的
sp包处理Shapefile,可以把st_read()换成readOGR(),st_transform()换成spTransform(),核心逻辑不变。 - 运行时如果报错“列名不存在”,记得把代码中的
NAME换成你Shapefile里实际的省份名称列(比如查看prov_shp的列名用colnames(prov_shp))。
内容的提问来源于stack exchange,提问作者tayyabakhalil4




