Есть ли способ получить координаты для значений растра, извлеченных из многоугольника в R?

У меня есть шейп-файл многоугольников, который я хочу использовать для извлечения растровых значений во фрейм данных. Я делаю это в следующем коде.

shp <- sf:st_read('example.shp')
r  <- raster::raster('example.tif')

extract <- raster::extract(r, shp, df=TRUE)

Это дает мне фрейм данных из двух столбцов: числовой идентификатор для каждого многоугольника и соответствующее извлеченное значение растра. Теперь я хотел бы добавить координаты x, y для каждого извлеченного значения растра. Я видел, как это делалось для точечных шейп-файлов, но я не уверен, как применить это к геометрии полигональных шейп-файлов.


person KC Ray    schedule 04.02.2021    source источник
comment
Я только что видел очень похожий ответ на stackoverflow.com/questions/48021657/   -  person dieghernan    schedule 19.02.2021


Ответы (1)


Попробуй, я совместил raster::extract(..., cellnumbers = TRUE) и raster::xyFromCell:

library(sf)
#> Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
library(raster)
#> Loading required package: sp
library(giscoR)

# Dummy data
shp <-
  gisco_get_nuts(country = "Netherlands",
                 nuts_level = 3,
                 epsg = 4326)[, 1]
r <- raster::getData("alt", country = "Netherlands")
#> Warning in showSRID(uprojargs, format = "PROJ", multiline = "NO", prefer_proj
#> = prefer_proj): Discarded datum Unknown based on WGS84 ellipsoid in Proj4
#> definition
extract <- raster::extract(r, shp, df = TRUE, cellnumbers = TRUE)
# Order (for checking purposes)
extract <- extract[order(extract$cell),]


# Extract coordinates
xy <- xyFromCell(r, cell = extract$cell, spatial = FALSE)

# Convert to df and add cellnumber
xy <- as.data.frame(xy)
xy$cell <- extract$cell

# Merge two data frames
extract_end <- merge(extract, xy)
extract_end <- extract_end[order(extract_end$cell),]

# This is what you are looking for: extract_end is a data frame
# has values and x and y are coordinates
head(extract_end)
#>   cell ID NLD_msk_alt        x        y
#> 1 2319  3          NA 6.620833 53.56250
#> 2 2796  3          NA 6.595833 53.55417
#> 3 2797  3          NA 6.604167 53.55417
#> 4 2798  3          NA 6.612500 53.55417
#> 5 2799  3          NA 6.620833 53.55417
#> 6 2800  3          NA 6.629167 53.55417

# Checks - can be ommited

nrow(extract) == nrow(extract_end)
#> [1] TRUE

# Check NAs in coordinates
nrow(extract_end[is.na(extract_end$x), ])
#> [1] 0
nrow(extract_end[is.na(extract_end$y), ])
#> [1] 0

# Convert to sf for checks

sfobj <- st_as_sf(extract_end, coords = c("x", "y"))
sfobj <- st_set_crs(sfobj, st_crs(4326))

# Plot as sf points
par(mar = c(3, 3, 3, 3))
plot(
  sfobj[, 3],
  axes = TRUE,
  main = "sf points",
  key.pos = 4,
  breaks = "equal",
  nbreaks = 100,
  pal = rev(terrain.colors(100))
)

# Compare with raster plot
par(mar = c(3, 3, 3, 3))
plot(r, main = "Raster")

sessionInfo()
#> R version 4.0.3 (2020-10-10)
#> Platform: x86_64-w64-mingw32/x64 (64-bit)
#> Running under: Windows 10 x64 (build 19041)
#> 
#> Matrix products: default
#> 
#> locale:
#> [1] LC_COLLATE=Spanish_Spain.1252  LC_CTYPE=Spanish_Spain.1252   
#> [3] LC_MONETARY=Spanish_Spain.1252 LC_NUMERIC=C                  
#> [5] LC_TIME=Spanish_Spain.1252    
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#> [1] giscoR_0.2.4-9000 raster_3.4-5      sp_1.4-5          sf_0.9-7         
#> 
#> loaded via a namespace (and not attached):
#>  [1] Rcpp_1.0.6         pillar_1.4.7       compiler_4.0.3     highr_0.8         
#>  [5] class_7.3-18       tools_4.0.3        digest_0.6.27      evaluate_0.14     
#>  [9] lifecycle_1.0.0    tibble_3.0.6       lattice_0.20-41    pkgconfig_2.0.3   
#> [13] rlang_0.4.10       reprex_1.0.0       DBI_1.1.1          rgdal_1.5-23      
#> [17] yaml_2.2.1         xfun_0.21          e1071_1.7-4        styler_1.3.2      
#> [21] stringr_1.4.0      dplyr_1.0.4        knitr_1.31         generics_0.1.0    
#> [25] fs_1.5.0           vctrs_0.3.6        classInt_0.4-3     grid_4.0.3        
#> [29] tidyselect_1.1.0   glue_1.4.2         R6_2.5.0           rmarkdown_2.6     
#> [33] purrr_0.3.4        magrittr_2.0.1     codetools_0.2-18   backports_1.2.1   
#> [37] ellipsis_0.3.1     htmltools_0.5.1.1  units_0.6-7        assertthat_0.2.1  
#> [41] countrycode_1.2.0  KernSmooth_2.23-18 stringi_1.5.3      crayon_1.4.1

Создано 2021-02-19 с помощью пакета REPEX (v1.0.0)

person dieghernan    schedule 19.02.2021
comment
Различия в построении рисунков заключаются в том, что sf - точки, а raster - области. Вы можете проверить в правом верхнем углу, но значения должны быть такими же - person dieghernan; 19.02.2021