在R中均等分割爱荷华州乡镇多边形并生成新数据框的问题
嘿,我来帮你搞定这个生成新数据框的问题!看起来你已经完成了分割的核心操作,接下来咱们把这些分割后的多边形整理成结构化的sf数据框就行,具体步骤如下:
解决方案步骤
1. 补全数据读取代码
先把你没写完的读取代码补全,确保数据正确加载:
library(sf) library(tidyverse) setwd("~/Desktop") iowa <- st_read( dsn = "Townships/iowa", layer = "PLSS_Township_Boundaries", stringsAsFactors = FALSE )
2. 为每个乡镇生成3×3网格并关联原属性
核心思路是按每个乡镇单独生成网格,再和原乡镇多边形做交集,这样每个网格块都会保留原乡镇的属性信息,最后合并成一个统一的数据框:
# 定义函数:输入单个乡镇多边形,返回其3×3分割后的sf对象 split_township <- function(township) { # 生成适配当前乡镇范围的3×3网格 grid <- st_make_grid( township, n = c(3, 3), what = "polygons" ) %>% st_sf() %>% # 只保留落在原乡镇范围内的网格部分(避免边缘网格超出乡镇边界) st_intersection(township) %>% # 给每个网格块添加1-9的序号,方便识别位置 mutate(grid_id = row_number()) return(grid) } # 遍历每个乡镇应用分割函数,合并所有结果 iowa_grid <- iowa %>% group_by(OBJECTID) %>% # 这里用乡镇的唯一标识分组,你可以根据自己数据的字段调整,比如乡镇ID、名称等 group_modify(~ split_township(.x)) %>% ungroup()
3. 验证结果
你可以通过以下代码确认生成的数据框是否符合预期:
# 查看前几行数据,确认属性和几何信息都存在 head(iowa_grid) # 统计每个乡镇对应的网格数量,正常应该每个乡镇有9条记录 iowa_grid %>% count(OBJECTID) %>% head()
小提示
- 如果你的乡镇数据里没有
OBJECTID这个唯一标识,换成你数据里的对应字段就行,比如TOWNSHIP_ID之类的。 - 要是不需要保留原乡镇的所有属性,可以在
split_township函数里手动指定保留的字段,比如select(TOWNSHIP_NAME, grid_id, geometry)。
内容的提问来源于stack exchange,提问作者winitheju
相关产品推荐
相关产品推荐

