如何将每行对应一个四边形的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
相关产品推荐
相关产品推荐

