如何在R语言中基于国家SpatialPolygon创建六边形网格?
解决方法
你的错误根源是混用了sf和sp对象:hti$geom是sf包的sfc_MULTIPOLYGON类型,但spsample、Polygon等sp/rgeos函数只接受sp包的Spatial*系列对象,所以出现了方法不匹配的错误。另外代码里data(hti)会覆盖之前用sf获取的海地数据,这也是问题之一。
下面提供两种可行的实现方式:
方式一:基于sp/rgeos包实现
先把sf对象转换为sp的SpatialPolygons,再生成六边形网格:
library(sf) library(sp) library(rgeos) # 1. 获取海地的sf对象(避免用data(hti)覆盖) data(world) hti_sf <- world %>% filter(name_long == "Haiti") # 2. 将sf对象转换为sp的SpatialPolygons对象 hti_sp <- as(hti_sf, "Spatial") # 3. 转换为投影坐标系(必须用投影系,cellsize单位才是米) hti_sp_proj <- spTransform(hti_sp, CRS("+proj=utm +zone=18 +datum=WGS84 +units=m +no_defs")) # 4. 生成六边形采样点 HexPts <- spsample(hti_sp_proj, type = "hexagonal", cellsize = 10000) # 可调整cellsize大小 # 5. 将采样点转换为六边形多边形 HexPols <- HexPoints2SpatialPolygons(HexPts) proj4string(HexPols) <- proj4string(hti_sp_proj) # 6. 裁剪到海地边界内(只保留范围内的六边形) HexPols_clip <- gIntersection(HexPols, hti_sp_proj, byid = TRUE) # 7. 绘图查看 plot(hti_sp_proj) plot(HexPols_clip, add = TRUE, col = "lightblue", border = "white")
方式二:基于sf包生成(更简洁,推荐)
用sf的st_make_grid直接生成六边形网格,再转换为SpatialPolygons对象:
library(sf) library(sp) # 1. 获取并投影海地数据(必须用投影坐标系) data(world) hti_sf <- world %>% filter(name_long == "Haiti") %>% st_transform(crs = "+proj=utm +zone=18 +datum=WGS84 +units=m +no_defs") # 2. 生成六边形网格并裁剪到边界内 hex_grid_sf <- st_make_grid(hti_sf, cellsize = 10000, square = FALSE) %>% st_sf() %>% st_intersection(hti_sf) # 3. 将sf对象转换为SpatialPolygons对象 hex_grid_sp <- as(hex_grid_sf, "Spatial") # 4. 绘图查看 plot(st_geometry(hti_sf)) plot(hex_grid_sp, add = TRUE, col = "lightgreen", border = "white")
关键注意事项
- 必须使用投影坐标系(如UTM),不能用地理坐标系(WGS84经纬度),否则
cellsize单位是度,生成的六边形会变形且大小不符合预期。 - 避免重复定义
hti变量,data(hti)会覆盖之前用sf获取的海地数据,导致后续操作混乱。
内容的提问来源于stack exchange,提问作者Patrick Stephenson
相关产品推荐
相关产品推荐

