GADM-Maps: графика для сравнения стран - PullRequest
10 голосов
/ 26 февраля 2011

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

Когда вы найдете эту страницу, обязательно прочитайте этот ответ: https://stackoverflow.com/a/33264548/263589

Ответы [ 3 ]

7 голосов
/ 21 октября 2015

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

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)
6 голосов
/ 26 февраля 2011

Для задачи 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 объекта вместе, а не объединять их. Однако для этих объектов это не работает, и идентификаторы полигонов не уникальны:

> 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...
2 голосов
/ 13 апреля 2011

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

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