GADM-Maps: графика для сравнения стран

Возможно, из-за того, что я относительно новичок в R, у меня проблемы с использованием gadm-Mapfiles на http://www.gadm.org/.

Я пытаюсь нарисовать карту с несколькими странами и сравнить их друг с другом (используя разные цвета).

Вот что я делаю

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"

Вот мои проблемы:

  1. (Этот вопрос, вероятно, вызван моей новизной) Есть ли более удобный способ загрузки шейп-файлов? Я нахожу довольно глупым постоянно переименовывать объект gadm. Может быть, есть способ, когда R загружает данные только один раз, а затем сохраняет их в рабочей области / где-то локально?
  2. Как я могу убедить R нанести все эти страны на ОДНУ карту?

Заранее спасибо!

[редактировать]

некоторые полезные функции С помощью Гэвина Симпсона я смог создать несколько приятных функций, которые сводят объединение карт в одну строку:

## 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
}

Когда вы найдете эту страницу, обязательно прочитайте этот ответ: /questions/19823183/gadm-maps-grafika-dlya-sravneniya-stran/19823201#19823201

3 ответа

Решение

Для задачи 1 это R, так что вы можете бросить свой собственный load() функция, которая делает то, что вы хотите, например:

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

И использовать его как:

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

Это локальное решение, когда вы знаете, что загруженный объект будет вызываться gadm - вы можете улучшить функцию, чтобы не нуждаться в этом, например:

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

который работает потому что load() возвращает строки символов имен загруженных объектов.

Для решения проблемы 2 вам необходимо rbind() три sp объекты вместе, а не объединять их. Однако это не работает для этих объектов, и идентификаторы Polygon не являются уникальными:

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

Я работаю над этим и буду обновлять, если я разберусь в работе. Решение состоит в том, чтобы изменить значения слота ID полигона, используя spChFIDs(), Здесь мы добавляем "arg_" и т.д. для имен строк объектов, так что они не все уникальны:

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)

Тогда мы можем построить комбинированный sp объект:

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

Самое простое решение для этого

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

plot(bol)

Данные R были добавлены на веб-сайт GADM для поддержки этой функции. Также обратите внимание, что формат файла изменился так, что другие функции, описанные на этой странице, больше не работают.

Объединить разные страны

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

Есть некоторые незначительные улучшения, которые я могу предложить.

Во-первых, если вы хотите нарисовать графику карты, которая затеняет страны в соответствии с некоторыми критериями, вы должны загрузить это значение в соответствующий файл GADM, например, из другого data.frame. Вот как я это сделал:

## 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
}

Если вы рисуете карты больших областей, ваши карты будут страдать от искажений. Использовать rgdal Пакет (и его зависимости) для применения проекции карты:

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

Для того, чтобы построить участок coef, посылка sp предлагает хороший метод:

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")
Другие вопросы по тегам