4 votos

¿País asociado a la red de celdas en R?

Estoy tratando de resolver el siguiente problema.
Tengo una malla regular de puntos que cubre Europa

nx <- 361 ; ny <- 181 
xmin <- -30.0 ; ymin <- 25.0 
dx <- 0.25 ; dy <- 0.25 
lat <- seq(ymin, ymin+(ny-1)*dy, dy) 
lon <- seq(xmin, xmin+(nx-1)*dx, dx) 

Lo que necesito hacer es asociar el país para cada celda de la cuadrícula y hacer operaciones en los países.
Por ejemplo, tengo que multiplicar la densidad de población de Francia, España, Polonia, etc) por un determinado factor.
He producido un feo script para ocultar la cuadrícula de coordenadas de cada país, los nombres, pero no es muy práctico y me preguntaba si hay una manera más eficiente de hacerlo.
Aquí está el código que me han producido :

m <- matrix(1, ncol=nx, nrow=ny) # create grid with unit (or whatever) value
n <- vector(mode='character', length=nx*ny) # empty character vector with    same length as raster of grid
EUstates <- c('AUT', 'BEL', 'BGR', 'HRV', 'CYP', 'CZE', 'DNK', 'EST', 'FIN', 'FRA', 'DEU', 'GRC',
          'HUN', 'IRL', 'ITA', 'LVA', 'LTU', 'LUX', 'MLT', 'NLD', 'POL', 'PRT', 'ROU', 'SVK', 
          'SVN', 'ESP', 'SWE', 'GBR')
r = raster( m, xmn=xmin,xmx=max(lon),ymn=ymin,ymx=max(lat)) # create a raster of grid 'm' to be used for masking
# now loop through EU countries for masking
for (c in EUstates){
    EUc <- getData("GADM", country=c, level=0)
    rr <- mask(r, EUc) # assigns NAN to whichever is outsided country c
    n[which(!is.na(rr@data@values))] <- c  # assign country name to cells     that are not NAN 
 }
 n[which(n=='')] <-'SEA'  # all remaining empty cells assigned as 'SEA'

4voto

obrl_soil Puntos 53

He aquí una versión con algunos retoques:

library(sp)
library(raster)
library(rgdal)
library(rmapshaper)
library(tidyverse)

nx <- 361 ; ny <- 181 
xmin <- -30.0 ; ymin <- 25.0 
dx <- 0.25 ; dy <- 0.25 
lat <- seq(ymin, ymin+(ny-1)*dy, dy) 
lon <- seq(xmin, xmin+(nx-1)*dx, dx)

# make an empty grid instead so NA = Ocean
m <- matrix(NA, ncol=nx, nrow=ny)
r <- raster(m, xmn=xmin,xmx=max(lon),ymn=ymin,ymx=max(lat))

EUstates <- c('AUT', 'BEL', 'BGR', 'HRV', 'CYP', 'CZE', 'DNK', 'EST',
              'FIN', 'FRA', 'DEU', 'GRC', 'HUN', 'IRL', 'ITA', 'LVA',
              'LTU', 'LUX', 'MLT', 'NLD', 'POL', 'PRT', 'ROU', 'SVK', 
              'SVN', 'ESP', 'SWE', 'GBR')

# now loop through EU countries and dump each into a list
GADM0 <- list()
for (c in EUstates){
  GADM0[[c]] <- getData("GADM", country=c, level=0)
}

# convert list to single spdf
GADM0_Europe <- do.call('rbind', GADM0)

Ahora simplificar la geometría, la línea de trabajo es innecesariamente detallada de este procedimiento y su frenar las cosas:

GADM0_Eur_simple <- ms_simplify(GADM0_Europe, keep = 0.05) 

Efectivamente, esta siguiente parte llena su vacío raster con los valores de la columna 'ID_0' en el GADM tabla de atributos, que parece ser el ID numérico de la versión de la 'ISO' código. Tenga en cuenta que el valor del píxel se actualiza sólo si su centro se cae en un polígono, por lo que podría ser un poco demasiado conservador en torno a las costas. Solución más fácil es hacer una trama con células más pequeñas si que está causando problemas. Siempre se puede generalizar de nuevo a grandes células más tarde.

GADM0_Europe_raster <- rasterize(GADM0_Eur_simple, r, 
                                 field      = 'ID_0',
                                 background = -9999,
                                 update     = TRUE)

Su trama puede ahora ser convertidos a un tipo categórico y su nombre de país de los códigos puede ser añadido a la tabla de atributos de ráster.

GADM0_Europe_raster <- ratify(GADM0_Europe_raster)
rat <- levels(GADM0_Europe_raster)[[1]] %>%
  rename(ID_0 = ID) %>%
  left_join(., GADM0_Eur_simple@data[, c('ID_0', 'ISO')], by = 'ID_0') %>%
  # not sure why this got factorised during ms_simplify!      
  mutate(ISO = as.character(ISO)) %>% 
  # this last rename isn't optional
  rename(ID = ID_0)

levels(GADM0_Europe_raster)[[1]] <- rat

Usted puede obtener una copia de la RATA de nuevo como un dataframe y hacer todos los cálculos que desee a partir de ahí, sólo tienes que tener cuidado de copiar datos de nuevo. Preste atención a ?ratify. También, algunos espacial de las funciones R limpie la RATA de misterio razones, lo cual puede ser frustrante.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X