Как создать шестиугольную сетку в R

Я хотел бы иметь возможность создать объект 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)

Любая помощь, как всегда, приветствуется...


r sp
person h.l.m    schedule 31.03.2015    source источник


Ответы (1)


замените meuse.sr какой-нибудь буферизованной версией, например rgeos::gBuffer(meuse.sr, width = 2000) в вызове spsample. Вот полный пример, в котором выбираются только пересекающиеся шестиугольники:

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)

введите здесь описание изображения

person Edzer Pebesma    schedule 31.03.2015
comment
Я получаю эту ошибку: › HexPts ‹-spsample(rgeos::gBuffer(meuse.sr, 2000),type=hexagonal,cellsize=1000) Ошибка в spsample(rgeos::gBuffer(meuse.sr, 2000), type = hexagonal , : ошибка при оценке аргумента «x» при выборе метода для функции «spsample»: Ошибка: is.logical(byid) is not TRUE - person h.l.m; 31.03.2015
comment
Благодарю вас! Это очень хорошо... но как сделать так, чтобы получались только те полигоны, которые пересекаются с нижележащим пространственным полигоном, потому что на данный момент с шириной = 2000 есть некоторые полигоны, которые вообще не пересекаются с нижележащим объектом. .. - person h.l.m; 01.04.2015
comment
добавил полный пример в ответ. - person Edzer Pebesma; 01.04.2015
comment
Есть ли способ сделать это с sf без преобразования из и в sp? - person dpprdan; 12.05.2017
comment
Кстати, на эту тему есть хороший пост здесь. - person dpprdan; 12.05.2017
comment
С sf вы можете использовать st_make_grid(x, square=FALSE)[x] с x = st_as_sf(meuse.sr) - person Edzer Pebesma; 18.03.2021