GADM-Карты для сравнения по странам

Возможно, из-за того, что я относительно новичок в 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"

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

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

Заранее благодарю вас!

[править]

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

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

Когда вы найдете эту страницу, убедитесь, что вы прочитали этот ответ: qaru.site/info/518699/...

Ответ 1

Для проблемы 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

Я работаю над этим и обновляюсь, если выясню, как это работает. Решение состоит в изменении значений слотов идентификаторов полигонов с помощью 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...

Ответ 2

Простейшим решением для этого является

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)

Ответ 3

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

Во-первых, если вы хотите нарисовать карту, которая затеняет страны в соответствии с некоторыми критериями, вы должны загрузить это значение в соответствующий файл 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")