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

如何将每行对应一个四边形的DataFrame转为sf对象并计算面积?

高效将四边形DataFrame转为sf要素集并计算球面面积

实现思路

无需手动循环,利用sf和purrr的向量化函数可快速将每行的四边形坐标转换为多边形要素,并直接计算真实球面面积。

完整代码示例

# 加载所需包
library(sf)
library(purrr)

# 示例数据
d <- data.frame(
    lon.c1 = c(-65.64025, -79.11267, -84.44683, -76.35987, -77.18833),
    lat.c1 = c(18.35419, 35.90454, 33.70796, 36.97808, 37.27661),
    lon.c2 = c(-65.60549, -79.0479, -84.31132, -76.3124, -77.13755),
    lat.c2 = c(18.36057, 35.92863, 33.77171, 36.99247, 37.29281),
    lon.c3 = c(-65.62023, -79.07303, -84.33958, -76.33563, -77.16152),
    lat.c3 = c(18.42399, 35.99039, 33.83202, 37.05477, 37.35499),
    lon.c4 = c(-65.65499, -79.13784, -84.47516, -76.38314, -77.21233),
    lat.c4 = c(18.41762, 35.96629, 33.76823, 37.04037, 37.33878)
)

# 转换为sf多边形要素集
sf_df <- d %>% 
  transmute(
    geometry = pmap(
      list(lon.c1, lat.c1, lon.c2, lat.c2, lon.c3, lat.c3, lon.c4, lat.c4),
      # 构造闭合多边形的坐标矩阵(首尾点重复)
      ~ st_polygon(list(matrix(c(..1, ..2, ..3, ..4, ..5, ..6, ..7, ..8, ..1, ..2), ncol = 2, byrow = TRUE)))
    ) %>% 
      st_sfc(crs = 4326) # 指定WGS84地理坐标系
  ) %>% 
  st_sf()

# 计算球面面积(自动转为平方米)
sf_df$area_m2 <- as.numeric(st_area(sf_df))

# 查看结果
sf_df

关键说明

  • 坐标系指定:必须设置crs = 4326(WGS84),这样st_area会自动使用球面几何计算真实地表面积,而非平面面积。
  • 多边形闭合:构造坐标矩阵时需重复第一个点,确保多边形是闭合的,否则st_polygon会报错。
  • 向量化优势:pmap按行批量处理坐标,比手动循环效率高,尤其适合大规模数据集。
  • 面积单位:st_area返回的结果带有units类型,用as.numeric可转为纯数值,单位为平方米。

内容的提问来源于stack exchange,提问作者Kodiologist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:43:21