You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用terra::intersect计算相交多边形分区域面积的问题咨询

问题

参照terra::intersect示例操作,代码如下:

library(terra)
f <- system.file("ex/lux.shp", package="terra")
v <- vect(f)
e <- ext(5.6, 6, 49.55, 49.7)
x <- intersect(v, e)
p <- vect(c("POLYGON ((5.8 49.8, 6 49.9, 6.15 49.8, 6 49.6, 5.8 49.8))",
            "POLYGON ((6.3 49.9, 6.2 49.7, 6.3 49.6, 6.5 49.8, 6.3 49.9))"), crs=crs(v))
values(p) <- data.frame(pid=1:2, area=expanse(p))
y <- intersect(v, p)

需求是统计每个p多边形分别位于Diekirch、Grevenmacher、Luxembourg区域的面积(单位:公顷)。尝试以下代码后,结果和expanse(v)一致,无法得到目标数据:

lapply(y, FUN=expanse, unit="ha")
expanse(v)

yy <- union(v,p)
lapply(yy, FUN=expanse, unit="ha")
解决方案

你之前的操作没有利用intersect返回结果的属性信息,也未对交集后的单个多边形面积做分组汇总。y <- intersect(v,p)生成的是v和p的重叠区域多边形,每个多边形同时携带v的区域属性(比如NAME_1,对应Diekirch等区域)和p的pid属性,直接基于这些属性分组计算面积即可:

方法1:使用Base R

# 给每个交集多边形添加面积字段(公顷)
y$area_ha <- expanse(y, unit = "ha")

# 按p的pid和v的区域名称分组汇总总面积
area_summary <- aggregate(area_ha ~ pid + NAME_1, data = y, sum)
print(area_summary)

方法2:使用dplyr(需先安装包)

library(dplyr)

# 转换为数据框后分组计算
area_summary <- as.data.frame(y) %>%
  mutate(area_ha = expanse(y, unit = "ha")) %>%
  group_by(pid, NAME_1) %>%
  summarise(total_area_ha = sum(area_ha), .groups = "drop")

print(area_summary)

运行后会得到类似如下的结果,清晰展示每个p多边形在三个区域的分布面积:

pid    NAME_1 total_area_ha
1   1   Diekirch      XXXXXXXX
2   1 Luxembourg      XXXXXXXX
3   2 Grevenmacher      XXXXXXXX

内容的提问来源于stack exchange,提问作者we need a Mat. Stat.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:05:30