Как создать карту в R из пространственного многоугольника, заданного как тип данных списка

У меня есть список (импортированный из файла Stata dta), содержащий записи, определяющие пространственные полигоны для карты, чтобы дать представление:

> typeof(aux3)
[1] "list"
> mode(aux3)
[1] "list"
> head(aux3)
  _ID        _X       _Y
1   1        NA       NA
2   1 -22.23933 64.56315
3   1 -22.25667 64.56053
4   1 -22.25026 64.56653
5   1 -22.27167 64.57319
6   1 -22.30311 64.55409
> tail(head(aux3,20000))
      _ID       _X       _Y
19995   2 21.21593 60.24696
19996   2 21.21650 60.24337
19997   2 21.23972 60.24913
19998   2 21.22203 60.23304
19999   2 21.21618 60.23332
20000   2 21.22092 60.23930
> #etc.

Я хотел бы преобразовать это в структуру данных, с которой я могу работать для создания карты (без больших трудностей и без необходимости обширных знаний, никогда не делал этого раньше) в R. Я сделал вывод, что тип SpacialPolygons пакета sp является самый простой выбор. Далее, из определения показалось, что метод SpacialPolygons (определенный в этом пакете, см. документация пакета, стр. 79) является правильным методом преобразования списка в этот тип данных.

К сожалению, этот метод не так прост в использовании, и мне нужна помощь. Моя (наивная) попытка приводит к ошибке, которую я не понимаю и которая не дает никаких интересных результатов в поиске Google:

> library(maptools)
Loading required package: sp
Checking rgeos availability: FALSE
    Note: when rgeos is not available, polygon geometry     computations in maptools depend on gpclib,
    which has a restricted licence. It is disabled by default;
    to enable gpclib, type gpclibPermit()
> SP<-SpatialPolygons(aux3)
Error in SpatialPolygons(aux3) : 
  cannot get a slot ("area") from an object of type "integer"

Можно ли преобразовать приведенный выше список в SpacialPolygon? Если да, то как? Если нет, то какой формат выбрать? Спасибо.


person 0range    schedule 10.08.2015    source источник


Ответы (1)


Если вы просто хотите нарисовать карту, вы можете использовать ggplot. Я не могу проверить это, так как у меня нет ваших данных, но должно работать.

library(ggplot2)
aux_df <- data.frame(aux3)
# as per comment: the list-to-dataframe conversion prepends the column names with X
ggplot(aux_df, aes(x=X_X, y=X_Y, group=X_ID) + 
  geom_polygon(color='black', fill=NA) +
  coord_map() +
  theme_classic()

Вышеприведенное предполагает, что список aux3 имеет долготу и широту в _X и _Y и многоугольники, определенные _ID. По умолчанию он применяет проекцию Меркатора, но вы можете изменить это, используя другие аргументы на coord_map().

Вот рабочий пример с использованием карты округов Огайо (произвольный выбор).

library(ggplot2)
ohio_poly <- map_data('county', region='ohio')
ggplot(ohio_poly, aes(x=long, y=lat, group=group)) +
  geom_polygon(color='black', fill=NA) +
  coord_map() +
  theme_classic()

введите здесь описание изображения

person arvi1000    schedule 10.08.2015
comment
Спасибо, это работает хорошо. ... С одним небольшим изменением: ... aes(x=X_X, y=X_Y, groups=X_ID)... поскольку при преобразовании списка в фрейм данных перед именами столбцов ставится X. - person 0range; 10.08.2015
comment
Ага. Отредактировано, чтобы отразить это - person arvi1000; 11.08.2015