When creating maps, choosing an appropriate geographical projection is often a difficult task (at least for me). There are plenty of projections to choose from, and none can be qualified as the best one. It all depends on what you are trying to achieve. Websites like the projection wizard website offer a playground to experiment with different projections and how they look like depending on where you are looking at on the globe.
Image from: https://en.wikipedia.org/wiki/Map_projection
The goal of this blog post is not to go into details and consideration on how to choose a good projection (it is out of my expertise), but rather present a quick overview of the crsuggest
R package that can help to find a projection suited for the data to be displayed.
# Download the Greenland shapefile
map <- ne_countries(country = "greenland", returnclass = "sf", scale = "medium")
# Looks at the projection
st_crs(map)$proj4string
#> [1] "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs"
We can see that WGS84 is used as the reference coordinate system. Plotting the shapefile immediately shows that the result is somewhat distorted.
p1 <- ggplot() +
geom_sf(data = map)
p1
Time to look at the crsuggest
package. The function suggest_crs()
takes a spatial dataset as inputs (here the map
object) and return a list (n = 10 by default) of suggested coordinate systems in a tibble.
suggested_crs <- suggest_crs(map, limit = 3)
suggested_crs
#> # A tibble: 3 × 6
#> crs_code crs_name crs_t…¹ crs_gcs crs_u…² crs_p…³
#> <chr> <chr> <chr> <dbl> <chr> <chr>
#> 1 5922 WGS 84 / EPSG Arctic Regional zone A2 projec… 4326 m +proj=…
#> 2 6054 GR96 / EPSG Arctic zone 3-31 projec… 4747 m +proj=…
#> 3 6051 GR96 / EPSG Arctic zone 2-18 projec… 4747 m +proj=…
#> # … with abbreviated variable names ¹crs_type, ²crs_units, ³crs_proj4
Let’s make some plots using the suggested CRS.
plot_map <- function(crs, map) {
ggplot() +
geom_sf(data = map) +
coord_sf(crs = as.numeric(crs)) +
labs(
title = paste("CRS:", crs)
)
}
maps <- lapply(suggested_crs$crs_code, plot_map, map = map)
We can see that the projected maps look more accurate than the original map.
wrap_plots(maps, ncol = 3)
This is even more obvious when they are compared side by side.
p2 <- ggplot() +
geom_sf(data = map) +
coord_sf(crs = 5922)
p1 + p2
Session info
#> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
#> setting value
#> version R version 4.2.1 (2022-06-23)
#> os Linux Mint 21
#> system x86_64, linux-gnu
#> ui X11
#> language en_CA:en
#> collate en_CA.UTF-8
#> ctype en_CA.UTF-8
#> tz America/Montreal
#> date 2022-08-10
#> pandoc 2.18 @ /usr/lib/rstudio/bin/quarto/bin/tools/ (via rmarkdown)
#>
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#> ! package * version date (UTC) lib source
#> P assertthat 0.2.1 2019-03-21 [?] RSPM
#> P backports 1.4.1 2021-12-13 [?] RSPM
#> P base64enc 0.1-3 2015-07-28 [?] RSPM
#> P broom 1.0.0 2022-07-01 [?] RSPM (R 4.2.1)
#> P cachem 1.0.6 2021-08-19 [?] RSPM (R 4.2.0)
#> P callr 3.7.1 2022-07-13 [?] RSPM (R 4.2.1)
#> P cellranger 1.1.0 2016-07-27 [?] RSPM
#> P class 7.3-20 2022-01-13 [?] RSPM (R 4.2.0)
#> P classInt 0.4-7 2022-06-10 [?] RSPM (R 4.2.0)
#> P cli 3.3.0 2022-04-25 [?] RSPM (R 4.2.0)
#> codetools 0.2-18 2020-11-04 [2] CRAN (R 4.2.1)
#> P colorspace 2.0-3 2022-02-21 [?] RSPM (R 4.2.0)
#> P crayon 1.5.1 2022-03-26 [?] RSPM (R 4.2.0)
#> P crosstalk 1.2.0 2021-11-04 [?] RSPM (R 4.2.0)
#> P crsuggest * 0.4 2022-07-06 [?] RSPM (R 4.2.0)
#> P DBI 1.1.3 2022-06-18 [?] RSPM (R 4.2.0)
#> P dbplyr 2.2.1 2022-06-27 [?] RSPM (R 4.2.0)
#> P devtools 2.4.4 2022-07-20 [?] RSPM (R 4.2.0)
#> P digest 0.6.29 2021-12-01 [?] RSPM
#> P dplyr * 1.0.9 2022-04-28 [?] RSPM (R 4.2.0)
#> P e1071 1.7-11 2022-06-07 [?] RSPM (R 4.2.0)
#> P ellipsis 0.3.2 2021-04-29 [?] RSPM
#> P evaluate 0.15 2022-02-18 [?] RSPM (R 4.2.0)
#> P extrafont 0.18 2022-04-12 [?] RSPM (R 4.2.0)
#> P extrafontdb 1.0 2012-06-11 [?] RSPM (R 4.2.0)
#> P fansi 1.0.3 2022-03-24 [?] RSPM (R 4.2.0)
#> P farver 2.1.1 2022-07-06 [?] RSPM (R 4.2.1)
#> P fastmap 1.1.0 2021-01-25 [?] RSPM
#> P forcats * 0.5.1 2021-01-27 [?] RSPM
#> P fs 1.5.2 2021-12-08 [?] RSPM
#> P gargle 1.2.0 2021-07-02 [?] RSPM
#> P generics 0.1.3 2022-07-05 [?] RSPM (R 4.2.1)
#> P ggplot2 * 3.3.6 2022-05-03 [?] RSPM (R 4.2.0)
#> P ggpmthemes * 0.0.2 2022-08-08 [?] Github (pmassicotte/ggpmthemes@993d61e)
#> P glue 1.6.2 2022-02-24 [?] RSPM (R 4.2.0)
#> P googledrive 2.0.0 2021-07-08 [?] RSPM
#> P googlesheets4 1.0.0 2021-07-21 [?] RSPM
#> P gtable 0.3.0 2019-03-25 [?] RSPM
#> P haven 2.5.0 2022-04-15 [?] RSPM (R 4.2.0)
#> P hms 1.1.1 2021-09-26 [?] RSPM
#> P htmltools 0.5.3 2022-07-18 [?] RSPM (R 4.2.1)
#> P htmlwidgets 1.5.4 2021-09-08 [?] RSPM (R 4.2.0)
#> P httpuv 1.6.5 2022-01-05 [?] RSPM (R 4.2.0)
#> P httr 1.4.3 2022-05-04 [?] RSPM (R 4.2.0)
#> P jsonlite 1.8.0 2022-02-22 [?] RSPM (R 4.2.0)
#> P KernSmooth 2.23-20 2021-05-03 [?] RSPM (R 4.2.0)
#> P knitr 1.39 2022-04-26 [?] RSPM (R 4.2.0)
#> P later 1.3.0 2021-08-18 [?] RSPM (R 4.2.0)
#> P lattice 0.20-45 2021-09-22 [?] RSPM (R 4.2.0)
#> P leafem 0.2.0 2022-04-16 [?] CRAN (R 4.2.0)
#> P leaflet 2.1.1 2022-03-23 [?] RSPM (R 4.2.0)
#> P lifecycle 1.0.1 2021-09-24 [?] RSPM
#> P lubridate 1.8.0 2021-10-07 [?] RSPM
#> P magrittr 2.0.3 2022-03-30 [?] RSPM (R 4.2.0)
#> P mapview 2.11.0 2022-04-16 [?] CRAN (R 4.2.0)
#> P memoise 2.0.1 2021-11-26 [?] CRAN (R 4.2.0)
#> P mime 0.12 2021-09-28 [?] RSPM
#> P miniUI 0.1.1.1 2018-05-18 [?] RSPM (R 4.2.0)
#> P modelr 0.1.8 2020-05-19 [?] RSPM
#> P munsell 0.5.0 2018-06-12 [?] RSPM
#> P patchwork * 1.1.1 2020-12-17 [?] RSPM
#> P pillar 1.8.0 2022-07-18 [?] RSPM (R 4.2.1)
#> P pkgbuild 1.3.1 2021-12-20 [?] CRAN (R 4.2.0)
#> P pkgconfig 2.0.3 2019-09-22 [?] RSPM
#> P pkgload 1.3.0 2022-06-27 [?] RSPM (R 4.2.0)
#> P png 0.1-7 2013-12-03 [?] RSPM (R 4.2.0)
#> P prettyunits 1.1.1 2020-01-24 [?] RSPM
#> P processx 3.7.0 2022-07-07 [?] RSPM (R 4.2.1)
#> P profvis 0.3.7 2020-11-02 [?] RSPM (R 4.2.0)
#> P promises 1.2.0.1 2021-02-11 [?] RSPM (R 4.2.0)
#> P proxy 0.4-27 2022-06-09 [?] RSPM (R 4.2.0)
#> P ps 1.7.1 2022-06-18 [?] RSPM (R 4.2.0)
#> P purrr * 0.3.4 2020-04-17 [?] RSPM
#> P R6 2.5.1 2021-08-19 [?] RSPM
#> P raster 3.5-21 2022-06-27 [?] RSPM (R 4.2.0)
#> P Rcpp 1.0.9 2022-07-08 [?] RSPM (R 4.2.1)
#> P readr * 2.1.2 2022-01-30 [?] RSPM (R 4.2.0)
#> P readxl 1.4.0 2022-03-28 [?] RSPM (R 4.2.0)
#> P remotes 2.4.2 2021-11-30 [?] CRAN (R 4.2.0)
#> renv 0.15.5 2022-05-26 [1] RSPM (R 4.2.0)
#> P reprex 2.0.1 2021-08-05 [?] RSPM
#> P rlang 1.0.4 2022-07-12 [?] RSPM (R 4.2.1)
#> P rmarkdown 2.14 2022-04-25 [?] RSPM (R 4.2.0)
#> P rnaturalearth * 0.1.0 2017-03-21 [?] RSPM (R 4.2.0)
#> P rnaturalearthdata 0.1.0 2017-02-21 [?] RSPM (R 4.2.0)
#> P rstudioapi 0.13 2020-11-12 [?] RSPM
#> P Rttf2pt1 1.3.10 2022-02-07 [?] RSPM (R 4.2.0)
#> P rvest 1.0.2 2021-10-16 [?] RSPM
#> P s2 1.1.0 2022-07-18 [?] RSPM (R 4.2.0)
#> P satellite 1.0.4 2021-10-12 [?] CRAN (R 4.2.0)
#> P scales 1.2.0 2022-04-13 [?] RSPM (R 4.2.0)
#> P sessioninfo 1.2.2 2021-12-06 [?] CRAN (R 4.2.0)
#> P sf * 1.0-8 2022-07-14 [?] RSPM (R 4.2.0)
#> P shiny 1.7.2 2022-07-19 [?] RSPM (R 4.2.1)
#> P sp 1.5-0 2022-06-05 [?] RSPM (R 4.2.0)
#> P stringi 1.7.8 2022-07-11 [?] RSPM (R 4.2.1)
#> P stringr * 1.4.0 2019-02-10 [?] RSPM
#> P terra 1.6-3 2022-07-25 [?] RSPM (R 4.2.0)
#> P tibble * 3.1.8 2022-07-22 [?] RSPM (R 4.2.1)
#> P tidyr * 1.2.0 2022-02-01 [?] RSPM (R 4.2.0)
#> P tidyselect 1.1.2 2022-02-21 [?] RSPM (R 4.2.0)
#> P tidyverse * 1.3.2 2022-07-18 [?] RSPM (R 4.2.0)
#> P tzdb 0.3.0 2022-03-28 [?] RSPM (R 4.2.0)
#> P units 0.8-0 2022-02-05 [?] RSPM (R 4.2.0)
#> P urlchecker 1.0.1 2021-11-30 [?] RSPM (R 4.2.0)
#> P usethis 2.1.6 2022-05-25 [?] RSPM (R 4.2.0)
#> P utf8 1.2.2 2021-07-24 [?] RSPM
#> P vctrs 0.4.1 2022-04-13 [?] RSPM (R 4.2.0)
#> P webshot 0.5.3 2022-04-14 [?] CRAN (R 4.2.0)
#> P withr 2.5.0 2022-03-03 [?] RSPM (R 4.2.0)
#> P wk 0.6.0 2022-01-03 [?] RSPM (R 4.2.0)
#> P xfun 0.31 2022-05-10 [?] RSPM (R 4.2.0)
#> P xml2 1.3.3 2021-11-30 [?] RSPM
#> P xtable 1.8-4 2019-04-21 [?] RSPM (R 4.2.0)
#> P yaml 2.3.5 2022-02-21 [?] RSPM (R 4.2.0)
#>
#> [1] /media/LaCie16TB/work/r-blog/renv/library/R-4.2/x86_64-pc-linux-gnu
#> [2] /usr/local/lib/R/library
#>
#> P ── Loaded and on-disk path mismatch.
#>
#> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────