2011-02-26 25 views
10

Tal vez debido a que soy relativamente nuevo en R, tengo problemas para usar los archivos de gadm-Map en http://www.gadm.org/.gráficos de comparación entre países GADM-Maps

Intento dibujar un mapa con varios países y compararlos entre sí (utilizando diferentes colores).

Esto es lo que hago

library('sp') 
## 
load(url('http://biogeo.ucdavis.edu/data/gadm2/R/ARG_adm0.RData')) 
# loads an Object "gadm" with shape of Argentinia 
arg <- gadm # is there a more convenient way to do this in one line? 
load(url('http://biogeo.ucdavis.edu/data/gadm2/R/CHL_adm0.RData')) 
# loads an Object "gadm" with shape of Chile 
chl <-gadm 
load(url('http://biogeo.ucdavis.edu/data/gadm2/R/BOL_adm0.RData')) 
# loads an Object "gadm" with shape of Bolivia 
bol <- gadm 
## 
spplot(c(arg, chl, bol)) 
# output: unable to find an inherited method for function "spplot", for signature "list" 

Aquí están mis problemas:

  1. (Esta pregunta es probablemente causado por mi newbieness) ¿Hay una manera más conveniente para cargar los archivos de forma? Me parece bastante estúpido cambiar el nombre del gadm-Object todo el tiempo. Tal vez incluso hay una forma en que R solo descarga los datos una vez y luego los almacena en el espacio de trabajo/en algún lugar localmente.
  2. ¿Cómo puedo convencer a R para trazar todos esos países en UN mapa?

Gracias de antemano!

[editar]

algunas funciones interesantes Con la ayuda de Gavin Simpson, que fue capaz de crear algunas funciones interesantes que reducen el conjunto de mapas fusión a una línea:

## you will need the sp-package 
library('sp') 

## load a file from GADM (you just have to specify the countries "special part" of the file name, like "ARG" for Argentina. Optionally you can specify which level you want to have 
loadGADM <- function (fileName, level = 0, ...) { 
    load(url(paste("http://biogeo.ucdavis.edu/data/gadm2/R/", fileName, "_adm", level, ".RData", sep  = ""))) 
    gadm 
} 

## the maps objects get a prefix (like "ARG_" for Argentina) 
changeGADMPrefix <- function (GADM, prefix) { 
    GADM <- spChFIDs(GADM, paste(prefix, row.names(GADM), sep = "_")) 
    GADM 
} 

## load file and change prefix 
loadChangePrefix <- function (fileName, level = 0, ...) { 
    theFile <- loadGADM(fileName, level) 
    theFile <- changeGADMPrefix(theFile, fileName) 
    theFile 
} 

## this function creates a SpatialPolygonsDataFrame that contains all maps you specify in "fileNames". 
## E.g.: 
## spdf <- getCountries(c("ARG","BOL","CHL")) 
## plot(spdf) # should draw a map with Brasil, Argentina and Chile on it. 
getCountries <- function (fileNames, level = 0, ...) { 
    polygon <- sapply(fileNames, loadChangePrefix, level) 
    polyMap <- do.call("rbind", polygon) 
    polyMap 
} 

Cuando encuentre esta página, asegúrese de leer esta respuesta: https://stackoverflow.com/a/33264548/263589

+0

tal vez sería mejor usar MapTools en lugar de SP? puedes ayudarme a hacer eso? – speendo

+1

La razón para 1) es que en R un objeto tiene un nombre y este se guarda junto con la definición del objeto cuando 'save()' d. El nombre es una parte integral de la representación guardada del objeto y no creo que pueda hacer nada al respecto con 'load()' tal como está. Sin embargo, este comportamiento es fácil de eludir con su propio contenedor para 'cargar()'. –

Respuesta

7

Para el problema 1, este es R para que pueda hacer su propio load() función que hace lo que quiere, por ejemplo:

loadGADM <- function(file, ...) { 
    load(file, ...) 
    gadm 
} 

y utilizarlo como:

> ls() 
character(0) 
> loadGADM <- function(file, ...) { 
+  load(file, ...) 
+  gadm 
+ } 
> arg <- loadGADM(url('http://gadm.org/data/rda/ARG_adm0.RData')) 
> ls() 
[1] "arg"  "loadGADM" 

Ésta es una solución local cuando se sabe que el objeto cargado se llamará gadm - se podría mejorar la función que no necesita esto, por ejemplo:

loadGADM <- function(file, ...) { 
    f <- load(file, ...) 
    get(f) 
} 

el cual funciona porque load() devuelve las cadenas de caracteres de los nombres de los objetos cargados.

Para el problema 2, necesita rbind() los tres objetos sp juntos, no concatenarlos. Sin embargo, esto no funciona para estos objetos y los ID de polígono son no único:

> sa <- rbind(arg, chl, bol) 
Error in validObject(res) : 
    invalid class "SpatialPolygons" object: non-unique Polygons ID slot values 

estoy trabajando en esto y se actualizará si averiguo el trabajo alrededor. La solución es cambiar los valores de la ranura de identificación de polígonos usando spChFIDs().A continuación añadimos "arg_" etc para los rownames de los objetos de tal manera que éstas no son todas únicas:

arg <- spChFIDs(arg, paste("arg", row.names(arg), sep = "_")) 
chl <- spChFIDs(chl, paste("chl", row.names(chl), sep = "_")) 
bol <- spChFIDs(bol, paste("bol", row.names(bol), sep = "_")) 
sa <- rbind(arg, chl, bol) 

entonces podemos trazar la sp objeto combinado:

plot(sa) ## beware might take a long time to plot... 
+0

¡genial! ¡gracias! ¿sería más fácil una solución que involucre herramientas de mapa? – speendo

+1

depende de lo que quieras decir; si desea usar maptools para leer en shapefiles, no creo que ayude en absoluto. shapefiles se leerá con ID 0, 1, ... por lo que tendrá el mismo problema de ID no único. De hecho, creo que los archivos R de GADM se produjeron al leer los archivos shape que dieron las ID no exclusivas en primer lugar. maptools usará sp objects para shapefiles leídos en R así que no creo que se obtenga nada al usarlo - la gente de GADM ha hecho este paso de importación para ti. –

+0

¡gracias! ¿podría editar su respuesta y cambiar los comandos rownames() por row.names()? Creo que esto ayudaría a las personas que leen eso en el futuro, porque con row.names() también funciona con archivos de nivel 1 y nivel 2 (no sé por qué, sería interesante ...). – speendo

2

Hay algunas pequeñas mejoras que pueda oferta.

Primero, si desea dibujar gráficos de mapas que sombrean países de acuerdo con algunos criterios, debe cargar ese valor en el archivo GADM respectivo, p. de otro data.frame. Así es como lo hice:

## load a file from GADM (you just have to specify the countries "special part" of the file name, like "ARG" for Argentina. Optionally you can specify which level you want to have 

loadGADM <- function (fileName, level = 0, ...) { 
    load(paste("K:/Rdata/gadm/", fileName, "_adm", level, ".RData", sep = "")) 
    gadm$coef <- land$coef[land[["abr"]]==fileName] 
    gadm 
} 

Si dibuja mapas de áreas más grandes, sus mapas sufrirán distorsión. Usar la rgdal paquete (y sus dependencias) para aplicar una proyección cartográfica:

newproj <- CRS("+proj=wintri ellps=WGS84 +lon_0=15E") 
spdf.wintri <- spTransform(spdf, newproj) 

Con el fin de trazar la propiedad coef, el paquete sp ofrece un buen método:

karte <- spplot(spdf.wintri,"coef", 
     xlim=c(-13,46),ylim=c(33,72), 
     col.regions = rainbow(100, start = 2/6, end = 4/6), 
     main="Country Dummies") 
5

La solución más sencilla para este es

library(raster) 
bol <- getData('GADM', country='BOL', level=1) 

plot(bol) 

Los datos de R se han agregado al sitio web de GADM para admitir esta función. También tenga en cuenta que el formato del archivo ha cambiado de tal manera que las otras funciones descritas en esta página ya no funcionan.

combinar diferentes países

per <- getData('GADM', country='PER', level=1) 
bp <- bind(bol, per) 
plot(bp) 
Cuestiones relacionadas