如何在R中生成六边形网格

15
我希望能够创建一个 SpatialPolygons 对象(一个六边形网格),以覆盖另一个 SpatialPolygon。
我希望所有的六边形直径为1公里(最好可以变化),并且所有的六边形一起覆盖整个对象。下面的方法似乎只能覆盖其中的一小部分…
以下是我使用 sp 包尝试的代码:
require(sp)
data(meuse.riv)
meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)), "x")))
plot(meuse.sr)

HexPts <-spsample(meuse.sr,type="hexagonal",cellsize=1000)
HexPols <- HexPoints2SpatialPolygons(HexPts)
plot(HexPols, add=TRUE)

非常感激一如既往的帮助...

1个回答

19

在调用spsample时,将meuse.sr替换为缓冲版本,例如rgeos::gBuffer(meuse.sr, width = 2000)。下面是仅选择相交六边形的完整示例:

require(sp)
data(meuse.riv)
meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)), "x")))
plot(meuse.sr)

library(rgeos)
meuse.large = gBuffer(meuse.sr, width = 2000)
HexPts <-spsample(meuse.large, type="hexagonal", cellsize=1000)
HexPols <- HexPoints2SpatialPolygons(HexPts)
plot(HexPols[meuse.sr,], add=TRUE)

输入图像描述


我遇到了这个错误:> HexPts <- spsample(rgeos::gBuffer(meuse.sr, 2000),type="hexagonal",cellsize=1000)。在选择函数'spsample'的方法时,评估参数'x'时出错:Error: is.logical(byid) is not TRUE。 - h.l.m
谢谢!这很好...但是我该如何使得我只获取与底层空间多边形相交的多边形,因为目前使用width=2000时,有一些多边形根本不与底层对象相交... - h.l.m
在答案中添加了完整示例。 - Edzer Pebesma
3
使用sf是否有一种不需要转换为和从sp转换的方法来完成这个任务? - dpprdan
3
顺便提一下,这个主题还有一篇很不错的文章,链接在这里:http://strimas.com/spatial/hexagonal-grids/。 - dpprdan
2
使用 sf,您可以通过 x = st_as_sf(meuse.sr)st_make_grid(x, square=FALSE)[x] 与之一起使用。 - Edzer Pebesma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接