create_hexes: Create Hexagonal grid

View source: R/create_hexes.R

create_hexesR Documentation

Create Hexagonal grid

Description

Function that takes a landscape as an sf object and returns a hexagonal grid of a given size. Allowed inputs are hectres ('ha'), metres squared ('m2'), metres or kilometres ('m', or 'km') as the diameter of each hexagon

Usage

create_hexes(
  land,
  hex_size,
  units = NULL,
  hex_prefix = "SA_",
  linear_type = "short_diagonal"
)

Arguments

land

sf Spatial. Area over which to create hexagonal grid. Must be have a valid CRS. If lat/lon (i.e. CRS 4326) will be projected to 3347 to ensure proper units.

hex_size

Numeric or Units. Size of hexagon in area or diagonal diameter. Can be a bear number (see units) or a units object with units embedded. See details for specifics.

units

Character. Units of hex_size in "m", "m2", "km", "km2", or "ha". Ignored if hex_size is a units object.

hex_prefix

Character. Text to prefix to hexagon IDs. Default "SA_" results in hexagon ids of "SA_01", etc.

linear_type

Character. Type of diameter to use when specifying linear hexagonal grid sizes. One of "short_diagonal" (default; for the short diameter from side to side, or centroid to centroid), or "long_diagonal" (for the long diameter from vertex to vertex passing through the centre of the hex).

Details

If hex_size is provided as a units object (i.e., units::set_units(100, km^2)) then the units can be any area or length unit recognized by the units package and convertible to m or m2. Otherwise, if using a bare number in hex_size and providing the units as a character in units, they must be one of "m", "m2", "km", "km2", or "ha".

For example, hex_size = units::set_units(100, ft) will work, but ⁠hex_size = 100, units = "ft"⁠ will not.

Value

Returns a sf polygon layer of hexagons with unique IDs

Examples

library(sf)
library(ggplot2)
plot <- st_polygon(list(cbind(c(-90,-90,-85,-85,-90),
                              c(50,55,55,50,50)))) |>
  st_sfc(crs = 4326) |>
  st_transform(3347)

ggplot() +
  geom_sf(data = plot, fill = "white")

# Create grid by area - 1000km2
grid <- create_hexes(plot, hex_size = 1000, units = "km2")

# Check the area
st_area(grid[1,]) |>
  units::set_units("km2")

# Check the visual
ggplot() +
  geom_sf(data = plot, fill = "white") +
  geom_sf(data = grid, fill = NA)

# Create grid by diameter - 33.98088 km from side to side
grid2 <- create_hexes(plot, hex_size = 33.98088, units = "km")

# Check the area - Hah! A hexagon with the diameter of 33.98088 km has an area of ~1,000km
st_area(grid2[1,]) |>
  units::set_units("km2")

# Check the visual - Identical
ggplot() +
  geom_sf(data = plot, fill = "white") +
  geom_sf(data = grid2, fill = NA)

# Diameter of a 1000 km2 hexagon is
area_km2 <- 1000
(sqrt(2 * area_km2 / (3 * sqrt(3)))) * sqrt(3)

# Create grid by hectare
grid <- create_hexes(plot, hex_size = 40000, units = "ha")
ggplot() +
  geom_sf(data = plot, fill = "white") +
  geom_sf(data = grid, fill = NA)

# Create grid with pre-set units
area <- units::set_units(1000, "km2", mode = "character")
grid <- create_hexes(plot, hex_size = area)
ggplot() +
  geom_sf(data = plot, fill = "white") +
  geom_sf(data = grid, fill = NA)

dhope/BASSr documentation built on April 12, 2024, 9:54 p.m.