How to read AMSR2 sea ice data with terra

R
Geospatial
Author

Philippe Massicotte

Published

August 11, 2022

Today I was trying to read AMSR2 sea ice data. I was surprised to discover that the files do not include coordinates or projection information. Data and coordinates are contained in different files! Maybe to save some disk space ⁉️ The sea ice data is (for example) in a file named Arc_20201010_res3.125_pyres.nc.gz whereas the coordinates are included in a file name LongitudeLatitudeGrid_3.125km_Arctic.nc. Furthermore, I found that the provided coordinates are provided in long/lat format whereas the gridded data are projected 😠

Photo by Willian Justen de Vasconcellos on Unsplash

If I read the data directly, one can see that there are no coordinates or projection information.

library(terra)
library(ggplot2)
library(tidyterra)

r <- rast(
  "/vsigzip//vsicurl/ftp://ftp-projects.cen.uni-hamburg.de/seaice/AMSR2/3.125km/Arc_20201010_res3.125_pyres.nc.gz",
  "sea_ice_concentration"
)

# No projection information
r
#> class       : SpatRaster 
#> dimensions  : 3584, 2432, 1  (nrow, ncol, nlyr)
#> resolution  : 1, 1  (x, y)
#> extent      : 0.5, 2432.5, 0.5, 3584.5  (xmin, xmax, ymin, ymax)
#> coord. ref. :  
#> source      : Arc_20201010_res3.125_pyres.nc.gz:sea_ice_concentration 
#> varname     : sea_ice_concentration (daily averaged total ice concentration) 
#> name        : sea_ice_concentration 
#> unit        :                     % 
#> time        : 2020-10-10 12:00:00 UTC

Fortunately, I found this post by Michael Sumner which guided me on how to manipulate this data. What we have to do is to set the extent and the proper projection after the file is read. This can be done using the ext() and crs() function from the terra package. Based on the documentation, we can manually set the proper values.

Erratum

I was wrongly using the following extent: extent(-3837500, 3762500, -5362500, 5837500). Michael Sumner kindly informed me about the error. The proper extent to use is down below.

# Set the extent
ext(r) <- ext(-3850000, 3750000, -5350000, 5850000)

# Set the polar stereographic projection
crs(r) <- "EPSG:3413"

Now, if we take a look at the raster, we can see that it is correctly projected and has a resolution of 3.125 km as expected ✌️

r
#> class       : SpatRaster 
#> dimensions  : 3584, 2432, 1  (nrow, ncol, nlyr)
#> resolution  : 3125, 3125  (x, y)
#> extent      : -3850000, 3750000, -5350000, 5850000  (xmin, xmax, ymin, ymax)
#> coord. ref. : WGS 84 / NSIDC Sea Ice Polar Stereographic North (EPSG:3413) 
#> source      : Arc_20201010_res3.125_pyres.nc.gz:sea_ice_concentration 
#> varname     : sea_ice_concentration (daily averaged total ice concentration) 
#> name        : sea_ice_concentration 
#> unit        :                     % 
#> time        : 2020-10-10 12:00:00 UTC

Finally, visualize the raster.

# Set values of 0 to NA
NAflag(r) <- 0

ggplot() +
  geom_spatraster(data = r / 100) +
  scale_fill_viridis_c(
    na.value = "transparent",
    labels = scales::label_percent(),
    breaks = scales::breaks_pretty(n = 6),
    guide = guide_colorbar(
      title.position = "top",
      title.hjust = 0.5,
      barwidth = unit(5, "cm"),
      barheight = unit(0.2, "cm")
    )
  ) +
  labs(
    fill = "Sea ice concentration"
  ) +
  theme_minimal() +
  theme(
    legend.position = "top",
    panel.grid = element_line(size = 0.25)
  )

Session info
#> ═ Session info ═══════════════════════════════════════════════════════════════════════════════════════════════════════
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#>  ! package     * version date (UTC) lib source
#>  P assertthat    0.2.1   2019-03-21 [?] RSPM
#>  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 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)
#>  P codetools     0.2-18  2020-11-04 [?] RSPM (R 4.2.0)
#>  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 data.table    1.14.2  2021-09-27 [?] RSPM
#>  P DBI           1.1.3   2022-06-18 [?] 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.16    2022-08-09 [?] RSPM (R 4.2.1)
#>  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 fs            1.5.2   2021-12-08 [?] 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 glue          1.6.2   2022-02-24 [?] RSPM (R 4.2.0)
#>  P gtable        0.3.0   2019-03-25 [?] 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 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 lifecycle     1.0.1   2021-09-24 [?] RSPM
#>  P magick        2.7.3   2021-08-18 [?] CRAN (R 4.2.0)
#>  P magrittr      2.0.3   2022-03-30 [?] RSPM (R 4.2.0)
#>  P memoise       2.0.1   2021-11-26 [?] RSPM (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 munsell       0.5.0   2018-06-12 [?] RSPM
#>  P pillar        1.8.0   2022-07-18 [?] RSPM (R 4.2.1)
#>  P pkgbuild      1.3.1   2021-12-20 [?] RSPM (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 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 Rcpp          1.0.9   2022-07-08 [?] RSPM (R 4.2.1)
#>  P remotes       2.4.2   2021-11-30 [?] RSPM (R 4.2.0)
#>    renv          0.15.5  2022-05-26 [1] RSPM (R 4.2.0)
#>  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 rstudioapi    0.13    2020-11-12 [?] RSPM
#>  P s2            1.1.0   2022-07-18 [?] RSPM (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 [?] RSPM (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 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-7   2022-08-07 [?] RSPM (R 4.2.1)
#>  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 tidyterra   * 0.2.0   2022-06-21 [?] RSPM (R 4.2.1)
#>  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 viridisLite   0.4.0   2021-04-13 [?] RSPM
#>  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.32    2022-08-10 [?] RSPM (R 4.2.1)
#>  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/lib/R/library
#> 
#>  P ── Loaded and on-disk path mismatch.
#> 
#> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────