Преобразование объекта карты в объект SpatialPolygon

Я предполагаю, что есть простое решение проблемы, с которой я столкнулся, но у меня возникли некоторые проблемы.

Я пытаюсь преобразовать следующий объект map:

require(maps)
usa <- map("state")

в объект SpatialPolygon с помощью функции map2SpatialPolygons:

require(maptools)
usa.sp <- map2SpatialPolygons(usa, IDs=usa$names,proj4string=CRS("+proj=longlat"))

Я продолжаю получать следующую ошибку:

Error in map2SpatialPolygons(usa, IDs = usa$names, proj4string = CRS("+proj=longlat")) : 
  map and IDs differ in length

После некоторых исследований выяснилось, что идентификаторы имеют длину 63, а объект map имеет длину 169 после применения функции .NAmat2xyList(cbind(map$x, map$y)) (для которой я не могу найти источник).

У кого-нибудь есть идеи? Вот структура объекта карты usa:

> str(usa)
List of 4
 $ x    : num [1:1705] -88.4 -88.1 -88 -87.9 -87.8 ...
 $ y    : num [1:1705] 30.4 30.4 30.8 30.6 30.3 ...
 $ range: num [1:4] -124.7 -67 25.1 49.4
 $ names: chr [1:63] "alabama" "arizona" "arkansas" "california" ...
 - attr(*, "class")= chr "map"

person Mike.Gahan    schedule 26.09.2014    source источник


Ответы (2)


Только что нашел код в тексте «Прикладной анализ пространственных данных с помощью R». Это прекрасно работает!

require(maps)
usa <- map("state", fill = TRUE)

require(sp)
require(maptools)
IDs <- sapply(strsplit(usa$names, ":"), function(x) x[1])
usa <- map2SpatialPolygons(usa, IDs=IDs, proj4string=CRS("+proj=longlat +datum=WGS84"))
person Mike.Gahan    schedule 26.09.2014
comment
При использовании карты путем указания базы данных мира и доступа к странам по названию их регионов доступ к регионам может быть получен более общим способом: Германия ‹- карта (мир, регионы = Германия, заполнение = ИСТИНА). ограниченный набор баз данных определяется так, как вы его назвали, например, в Германии нет. Тем не менее, ваш ответ спас мой день! - person Exocom; 04.11.2015

Многоугольники имеют поверхность (площадь), поэтому ключевой аргумент fill = TRUE в

usa <- map('state', fill = TRUE)

Изменение значения аргумента на TRUE останавливает сообщение об ошибке.

person DDB    schedule 12.01.2015
comment
+1 Отличный момент. Было бы полезно, если бы в ссылке ?map указывалось, что аргумент fill имеет такой нисходящий эффект. В том виде, в котором она сейчас написана (версия 2.3-11), она читается так, будто влияет только на то, как карта прорисовывается на экране. - person Arthur; 17.09.2015