如何合并相同地理空间下属性不同的两个shapefile文件?
问题解决方法
你需要的是空间连接操作,而非普通的属性合并、行/列拼接:之前使用的merge是按两个表共有的属性字段做匹配,你手头的两份shapefile没有可匹配的公共属性字段,因此会出现大量NA;bind/combine是直接拼接两个表的行或列,完全不关联两者的空间位置关系,不符合你的需求。
调整后代码
library(sf) library(dplyr) # 读取数据并统一坐标系,这部分原有逻辑正确 nycc21 <- sf::read_sf('nycc.shp') %>% sf::st_transform('+proj=longlat +datum=WGS84') nycb20 <- sf::read_sf('nycb2020.shp') %>% sf::st_transform('+proj=longlat +datum=WGS84') # 空间连接:以人口普查区块为左表,匹配每个区块所属的市议会选区 # st_within 逻辑为匹配完全落在选区内的区块,符合人口普查区块的划分规则 merged <- st_join( x = nycb20, y = nycc21, join = st_within ) # 整理为你需要的属性表格式(请替换下方字段名为你数据内的实际字段名) result <- merged %>% # 计算区块质心坐标 mutate(centroid = st_coordinates(st_centroid(geometry)) %>% as.data.frame() %>% {paste0(round(.$X, 4), ", ", round(.$Y,4))}) %>% # 筛选需要的列,示例字段名对应NYC公开数据的默认字段 select( 市议会选区 = CounDist, 区块质心坐标 = centroid, 普查区块编号 = GEOID ) %>% # 可选:移除空间几何列,只保留属性表 st_drop_geometry() View(result)
补充说明
- 如果你需要的输出是按市议会选区排序,只需要在生成
result的步骤末尾加%>% arrange(市议会选区)即可 - 如果存在少量跨选区的边界区块,把
join = st_within改为join = st_intersects即可匹配所有和选区有重叠的区块,再按需去重即可
内容的提问来源于stack exchange,提问作者eric andre the gian
相关产品推荐
相关产品推荐

