You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:15:43