Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

st_make_grid() not using correct map units

Let me start by saying I’ve seen the other thread on a similar question, and even after replicating the nc maps problem they use, I’m still running into a problem with my own code.

I’m trying to create a map with 50km square grids imposed over specific countries. I can generate a map with square grids just fine, but I’m running into problems getting the cellsize argument in st_make_grid() to use sensible metrics.

I understand that I want the maps to use the same projection, and given the units I want one that’s using meters. I’ve checked this repeatedly using st_crs() and it indicates all of the objects are using meters as intended.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

This first chunk of code lists the countries I want to include, and lists the CRS code I want to use. I convert each of the three maps returned by gadm() to sf objections, combine the data frames, and apply the CRS code.

library(tidyverse)
library(geodata)

countrylist <- list("DEU", "FRA", "GBR")
wgseqproj <- "EPSG:4087"

tempmap <- countrylist |>
    map(~ gadm(country = .x, level = 0, path = here::here())) |>
    map_dfr(~ st_as_sf(.x)) |>
    sf::st_set_crs(wgseqproj) |>
    sf::st_transform(wgseqproj)

The next chunk of code takes the grid and limits it to the borders of the countries in the list. I take the map from above, make the grid, and use st_intersection() to limit the grid to the country borders. The last line just creates a numeric index for each box in the grid.

  tempgrid <- st_make_grid(tempmap, cellsize = c(0.5, 0.5), square = TRUE, crs = wgseqproj) |> # grid of points
    st_intersection(tempmap) |>
    st_as_sf() |>
    mutate(names = seq(n():1))

ggplot(tempgrid) + geom_sf()

Map resulting from code chunks above

The code runs fine, and the resulting image looks normal, but the cellsize = c(0.5, 0.5) is the section where I’m running into problems. The maps are in meters, but I don’t know what this is capturing (i.e. what does 0.5 translate to?). When I try to run something like cellsize = c(50000, 50000) to get 50km square grids the resulting grids are so large they take up the entire map and I just get country border outlines.

Other code I see uses similarly "large" numbers and the results look great. Is it something about the projection or the gadm maps that’s throwing this off? When when I run more stripped down code on a single country and get rid of the map() functions to simplify things I get the same strange results. I’ve also tried multiple CRS codes. Any helps is much appreciated!

>Solution :

The problem seems to be that you are overwriting the correct crs with st_set_crs. Instead, try:

library(tidyverse)
library(geodata)
library(sf)

countrylist <- list("DEU", "FRA", "GBR")
wgseqproj <- "EPSG:4087"

tempmap <- countrylist |>
  map(~ gadm(country = .x, level = 0, path = here::here())) |>
  map_dfr(~ st_as_sf(.x)) |>
  sf::st_transform(wgseqproj)

tempgrid <- st_make_grid(tempmap, cellsize = 50000, 
                         square = TRUE, crs = wgseqproj) |> 
  st_intersection(tempmap) |>
  st_as_sf() |>
  mutate(names = seq(n():1))

ggplot(tempgrid) + geom_sf()

enter image description here

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading