итерация слияния SpatialPoints и SpatialPolygonsDataFrame в R - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь повторить процесс создания центроидов списка из SpatialPolygonsDataFrames (каждый с несколькими объектами многоугольника внутри), в результате чего SpatialPoints сохраняет атрибуты (данные) родительских многоугольников. Я пробовал функцию sp::over, но это кажется проблематичным, потому что центроиды не обязательно перекрываются с родительскими полигонами. Кроме того, я новичок в кодировании / R и не знаю, как этого добиться в цикле for и / или с использованием функции apply.

В частности, мне нужно (1) найти другую функцию, которая свяжет SpatialPolygonsDataFrames с соответствующими SpatialPoints (центроидами); и (2) выполнить итерацию по всему процессу и объединить данные SpatialPolygonsDataFrames с соответствующими SpatialPoints - я не знаю, как сопоставить значение индекса одного списка со значением индекса в другом во время выполнения цикла.

Вот воспроизводимый пример для одного SpatialPolygonsDataFrames объекта, показывающий, что использование sp::over не работает, потому что некоторые центроиды не заканчиваются перекрывающимися родительскими полигонами:

library(maptools)  ## For wrld_simpl
library(sp)

## Example SpatialPolygonsDataFrames (SPDF)
data(wrld_simpl) #polygon of world countries
spdf1 <- wrld_simpl[1:25,] #country subset 1
spdf2 <- wrld_simpl[26:36,] #subset 2
spdf3 <- wrld_simpl[36:50,] #subset 3

spdfl[[1]]@data


#plot, so you can see it
plot(spdf1)    
plot(spdf2, add=TRUE, col=4) 
plot(spdf3, add=TRUE, col=3) 

#make list of SPDF objects
spdfl<-list()
spdfl[[1]]<-spdf1
spdfl[[2]]<-spdf2
spdfl[[2]]<-spdf3

#create polygon centroids for each polygon feature (country) within spdfl[[1]]
spdf1c <- gCentroid(spdfl[[1]], byid=TRUE)
plot(spdfl[[1]])
plot(spdf1c, add=TRUE)

#add attributes 'NAME' and 'AREA' to SpatialPoints (centroid) object from SPDF data
spdf.NAME <- over(spdf1c, spdfl[[1]][,"NAME"])
spdf.AREA <- over(spdf1c, spdfl[[1]][,"AREA"])
spdf1c$NAME <- spdf.NAME
spdf1c$AREA <- spdf.AREA

spdf1c@data   
#`sp::over` output error = name and area for ATG, ASM, BHS, and SLB are missing

1 Ответ

0 голосов
/ 12 ноября 2018

Я считаю SF отличным пакетом для работы с пространственными данными в R. Я исправил несколько опечаток и добавил правый цикл for ниже.

library(maptools)  ## For wrld_simpl
library(sp)
library(sf)


## Example SpatialPolygonsDataFrames (SPDF)

data(wrld_simpl) #polygon of world countries
spdf1 <- wrld_simpl[1:25,] #country subset 1
spdf2 <- wrld_simpl[26:36,] #subset 2
spdf3 <- wrld_simpl[36:50,] #subset 3

spdfl[[1]]@data


#plot, so you can see it
plot(spdf1)    
plot(spdf2, add=TRUE, col=4) 
plot(spdf3, add=TRUE, col=3) 

#make list of SPDF objects
spdfl<-list()
spdfl[[1]]<-spdf1
spdfl[[2]]<-spdf2
spdfl[[3]]<-spdf3

# Empty List for Centroids
centres <-list()

# For Loop
for (i in 1:length(spdfl)) {
  centres[[i]] <- spdfl[[i]] %>% 
    sf::st_as_sf() %>%          # translate to SF object
    sf::st_centroid() %>%       # get centroids 
    as(.,'Spatial')   # If you want to keep as SF objects remove this line

}


#Plot your Spatial Objects
plot(spdfl[[1]])
plot(centres[[1]], add=TRUE)

Вот решение, которое использует SF и sp. SF великолепен, так как хранит вещи в виде информационных фреймов, с которыми легко иметь дело. Больше информации здесь: https://r -spatial.github.io / sf /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...