R - СПИСОК SpatialPolygonsDataFrame из списка пространственных полигонов - PullRequest
0 голосов
/ 22 октября 2018

У меня есть список SpatialPolygons, который я создал, используя lapply и функцию raster::buffer.Я хотел бы преобразовать файлы в списке обратно в список объектов SpatialPolygonsDataFrame.Я попробовал ответ, предоставленный здесь (хотя обратите внимание, что моя проблема немного отличается, потому что я хотел бы в конечном итоге получить список объектов SpatialPolygonsDataFrame): R - SpatialPolygonsDataFrame из списка SpatialPolygons , но я не знаюкак получить уникальные идентификаторы для каждого объекта в списке.Когда я применяю этот код, я получаю следующее сообщение об ошибке:

#Getting polygon IDs
IDs <- sapply(list_of_SPols, function(x)
 slot(slot(x, "polygons")[[1]], "ID"))

#Checking
length(unique(IDs)) == length(list_of_SPols) #output = [1] FALSE

#Making SpatialPolygons from list of polygons
Spol <- SpatialPolygons(lapply(list_of_SPols,
                            function(x) slot(x, "polygons")[[1]]))

#output = Error in validObject(res) : 
  #invalid class “SpatialPolygons” object: non-unique Polygons ID slot 
  #values

Мои элементы списка SpatialPolygons имеют уникальные значения индекса, но когда я проверяю выходные данные объекта идентификаторов, созданного выше, его подмножество выглядит такthis:

#[1] "1" "1" "1" "1" "1" "1" "1"....

Таким образом, все элементы списка имеют одинаковые идентификаторы.Поэтому я думаю, что мне нужно сделать, это создать уникальные идентификаторы, равные номерам индексов?

Как мне это сделать, и как мне создать список объектов SpatialPolygonsDataFrame?

1 Ответ

0 голосов
/ 22 октября 2018

Одна из причин, по которой важно показывать данные, заключается в том, что вы, возможно, задаете не тот вопрос.Если вы хотите использовать raster::buffer с SpatialPolygonsDataFrame и сохранить этот тип объекта, вам следует использовать опцию dissolve=FALSE

library(raster)
p <- shapefile(system.file("external/lux.shp", package="raster"))
b1 <- buffer(p, .1)
class(b1)
#[1] "SpatialPolygons"

b2 <- buffer(p, .1, dissolve=FALSE)
class(b2)
#[1] "SpatialPolygonsDataFrame"

, которая, вероятно, решит вашу проблему.Чтобы ответить на ваш вопрос о создании SpatialPolygonDataFrame объектов из списка SpatialPolygon объектов

Пример списка объектов SpatialPolygon

library(raster)
p <- shapefile(system.file("external/lux.shp", package="raster"))
s <- as(p, 'SpatialPolygons')
x <- lapply(seq(1,12,3), function(i) s[i:(i+2),])

Предположительно, у вас уже есть объекты data.frame, которым вы хотите соответствоватьНо я просто создаю их здесь.Это выдает ошибку

z <- lapply(x, function(i) SpatialPolygonsDataFrame(i, data.frame(id=1:length(i)))) 
#Error in SpatialPolygonsDataFrame(i, data.frame(id = 1:length(i))) : 
#row.names of data and Polygons IDs do not match

Это работает

z <- lapply(x, function(i) SpatialPolygonsDataFrame(i, data.frame(id=1:length(i)), match.ID = FALSE))   

В большинстве случаев вы захотите объединить объекты.Чтобы отследить их, вы можете сделать

zz <- lapply(1:length(x), function(i) SpatialPolygonsDataFrame(x[[i]], data.frame(id=rep(i, length(x[[i]]))), match.ID = FALSE))    
sp <- bind(zz)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...