You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动