如何在R中实现MultiPolygon转Polygon?poly2nb替代方案求解
MultiPolygon转Polygon及poly2nb替代方案
一、MultiPolygon转Polygon的有效方法
1. 拆分MultiPolygon为独立Polygon要素
如果需要将每个MultiPolygon包含的所有Polygon部件拆分为独立要素(原属性会对应复制),直接使用st_cast即可:
library(sf) # 直接转换,自动拆分每个MultiPolygon的部件 polygon_sf <- st_cast(mynameshape, "POLYGON")
如果之前转换无效,先检查几何类型是否混合,统一为MultiPolygon后再转换:
# 统一几何类型为MultiPolygon mynameshape <- st_cast(mynameshape, "MULTIPOLYGON") # 转换为Polygon polygon_sf <- st_cast(mynameshape, "POLYGON")
2. 保留原要素数量,提取最大面积Polygon
若每个MultiPolygon包含多个部件(如主多边形+岛屿),且需保持原要素数量,可提取每个MultiPolygon中面积最大的Polygon:
library(sf) library(dplyr) # 定义函数:提取单个MultiPolygon中面积最大的Polygon get_largest_polygon <- function(mp) { polys <- st_cast(mp, "POLYGON") polys[which.max(st_area(polys))] } # 批量处理sf对象 polygon_sf <- mynameshape %>% rowwise() %>% mutate(geometry = get_largest_polygon(geometry)) %>% st_sf() %>% ungroup()
二、MultiPolygon数据下poly2nb的替代方法
1. 直接用sf对象生成邻接列表(推荐)
spdep已支持sf对象,无需转换几何类型,可直接用st_contiguity或st_touches生成邻接关系:
library(spdep) library(sf) # 生成邻接列表(宽松判断:共享边界或顶点) nb <- st_contiguity(st_geometry(mynameshape)) # 或严格判断:仅共享边界 nb <- st_touches(mynameshape, sparse = TRUE) # 转换为spdep兼容的nb对象 nb <- as.nb(nb)
2. 强制转换为SpatialPolygons后使用poly2nb
若坚持使用poly2nb,可将sf对象转为sp对象,并提取MultiPolygon的第一个部件:
library(spdep) library(sf) # 转换为SpatialPolygonsDataFrame sp_obj <- as(mynameshape, "Spatial") # 替换每个MultiPolygon为其第一个Polygon部件 sp_obj@polygons <- lapply(sp_obj@polygons, function(x) { if (inherits(x, "Polygons")) { x } else { Polygons(x@Polygons[[1]], ID = x@ID) } }) # 生成邻接列表 nb <- poly2nb(sp_obj)
内容的提问来源于stack exchange,提问作者cillaw clarss
相关产品推荐
相关产品推荐

