15

I would like to be able to create a SpatialPolygons object (which is a Hexagonal grid) that covers another SpatialPolygon.

I would like all the Hexagons to have a diameter of 1km (ideally i can vary this) and for all the hexagons together to cover the whole object. The method below only seems to cover a small amount of it...

Below is my attempt using the sp package:

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)

Any help as always is greatly appreciated...

h.l.m
  • 13,015
  • 22
  • 82
  • 169

1 Answers1

19

replace meuse.sr with some buffered version, like rgeos::gBuffer(meuse.sr, width = 2000) in the call to spsample. Here is a full example that selects only the intersecting hexagons:

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)

enter image description here

Edzer Pebesma
  • 3,814
  • 16
  • 26
  • I get this error: > HexPts <-spsample(rgeos::gBuffer(meuse.sr, 2000),type="hexagonal",cellsize=1000) Error in spsample(rgeos::gBuffer(meuse.sr, 2000), type = "hexagonal", : error in evaluating the argument 'x' in selecting a method for function 'spsample': Error: is.logical(byid) is not TRUE – h.l.m Mar 31 '15 at 17:55
  • Thank you! That's very good...but How do I get it so that I only get polygons that intersect with the underlying spatial polygon, because at the moment with width=2000, there are some polygons that do not intersect with the underlying object at all... – h.l.m Apr 01 '15 at 07:47
  • added the full example to the answer. – Edzer Pebesma Apr 01 '15 at 11:17
  • 3
    Is there a way to do this with `sf` without converting from and to `sp`? – dpprdan May 12 '17 at 15:40
  • 3
    There is also a nice post on the topic [here](http://strimas.com/spatial/hexagonal-grids/) by the way. – dpprdan May 12 '17 at 15:41
  • 2
    With `sf`, you can use `st_make_grid(x, square=FALSE)[x]` with `x = st_as_sf(meuse.sr)` – Edzer Pebesma Mar 17 '21 at 21:31